frozenset/subclassing/keyword args
Mark E. Fenner
Hobbes2176 at yahoo.com
Tue Nov 1 16:06:55 EST 2005
> Without researching it, I would guess that you have to override __new__
> so as not to pass through the myName arg to the otherwise inherited and
> called-with-all-arguments __new__ of the base class.
<snip>
> Regards,
> Bengt Richter
Bengt,
Thanks as always! Python's rabbit holes always go a little deeper then
you've currently gone. My one irritation is that it seems that the error
message could give some indication of where the problem lies. "bad args to
__new__", "immutable's bypass init", "black voodoo ahead" ... but I know,
efficiency, conciseness, other concerns, etc. etc. Doesn't mean I can't
gripe about it!
As you said, there are a number of threads on this. Consulting those gave a
quick three line solution, shown below.
Regards,
Mark
P.S. Here's what I should have been doing:
******************** start file *********************
#!/usr/bin/env python
from sets import ImmutableSet
class MSet1(ImmutableSet):
def __init__(self, iterArg, myName="foo"):
ImmutableSet.__init__(self, iterArg)
self.name = myName
# works
class MSet2(frozenset):
def __new__(cls, itrarg, *args, **kwargs):
return frozenset.__new__(cls, itrarg)
def __init__(self, iterArg, myName="foo"):
frozenset.__init__(self, *iterArg)
self.name = myName
# broken
class MSet3(frozenset):
def __init__(self, iterArg, myName="foo"):
frozenset.__init__(self, *iterArg)
self.name = myName
m1 = MSet1([1,2,3], myName = "donkey")
print m1
print m1.name
m2 = MSet2([1,2,3], myName = "mario")
print m2
print m2.name
m3 = MSet3([1,2,3], myName = "kong")
print m3
print m3.name
******************* end file ****************
************* sample run ******************
MSet1([1, 2, 3])
donkey
MSet2([1, 2, 3])
mario
Traceback (most recent call last):
File "./setTest.py", line 33, in ?
m3 = MSet3([1,2,3], myName = "kong")
TypeError: frozenset() does not take keyword arguments
************** end run ***********************
More information about the Python-list
mailing list