[Python-Dev] Re: Guido's Magic Code was: inline sort option

Raymond Hettinger python at rcn.com
Thu Oct 30 00:19:38 EST 2003


[Guido's code]
> unsorted = (1, 10, 2)
> print MagicList.sorted(unsorted)
> print MagicList(unsorted).sorted()
> print SubClass.sorted(unsorted)
> print SubClass(unsorted).sorted()

Notwithstanding the "perverted" implementation, Alex's idea is
absolutely wonderful and addresses a core usability issue with
classmethods.
If only in the C API, I would like to see just such a universalmethod
alternative to classmethod. That would allow different behaviors to be
assigned depending on how the method is called.
Both list.sort() and dict.fromkeys() would benefit from it:
class MagicDict(dict):
 def _class_fromkeys(cls, lst, value=True):
 "Make a new dict using keys from list and the given value"
 obj = cls()
 for elem in lst:
 obj[elem] = value
 return obj
 def _inst_fromkeys(self, lst, value=True):
 "Update an existing dict using keys from list and the given
value"
 for elem in lst:
 self[elem] = value
 return self
 newfromkeys = MagicDescriptor(_class_fromkeys, _inst_fromkeys)
print MagicDict.newfromkeys('abc')
print MagicDict(a=1, d=2).newfromkeys('abc')
An alternative implementation is to require only one underlying function
and to have it differentiate the cases based on obj and cls:
class MagicDict(dict):
 def newfromkeys(obj, cls, lst, value=True):
 if obj is None:
 obj = cls()
 for elem in lst:
 obj[elem] = value
 return obj
 newfromkeys = universalmethod(newfromkeys)
Raymond Hettinger


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /