[Python-Dev] defaultdict proposal round three

Alex Martelli aleaxit at gmail.com
Mon Feb 20 20:09:48 CET 2006


On Feb 20, 2006, at 8:35 AM, Raymond Hettinger wrote:
> [GvR]
>> I'm not convinced by the argument
>> that __contains__ should always return True
>> Me either. I cannot think of a more useless behavior or one more 
> likely to have
> unexpected consequences. Besides, as Josiah pointed out, it is 
> much easier for
> a subclass override to substitute always True return values than 
> vice-versa.

Agreed on all counts.
> I prefer this approach over subclassing. The mental load from an 
> additional
> method is less than the load from a separate type (even a 
> subclass). Also,
> avoidance of invariant issues is a big plus. Besides, if this allows
> setdefault() to be deprecated, it becomes an all-around win.

I'd love to remove setdefault in 3.0 -- but I don't think it can be 
done before that: default_factory won't cover the occasional use 
cases where setdefault is called with different defaults at different 
locations, and, rare as those cases may be, any 2.* should not break 
any existing code that uses that approach.
>> - Even if the default_factory were passed to the constructor, it 
>> still
>> ought to be a writable attribute so it can be introspected and
>> modified. A defaultdict that can't change its default factory after
>> its creation is less useful.
>> Right! My preference is to have default_factory not passed to the 
> constructor,
> so we are left with just one way to do it. But that is a nit.

No big deal either way, but I see "passing the default factory to the 
ctor" as the "one obvious way to do it", so I'd rather have it (be it 
with a subclass or a classmethod-alternate constructor). I won't weep 
bitter tears if this drops out, though.
>> - It would be unwise to have a default value that would be called if
>> it was callable: what if I wanted the default to be a class instance
>> that happens to have a __call__ method for unrelated reasons?
>> Callability is an elusive propperty; APIs should not attempt to
>> dynamically decide whether an argument is callable or not.
>> That makes sense, though it seems over-the-top to need a zero- 
> factory for a
> multiset.

But int is a convenient zero-factory.
>> An alternative is to have two possible attributes:
> d.default_factory = list
> or
> d.default_value = 0
> with an exception being raised when both are defined (the test is 
> done when the
> attribute is created, not when the lookup is performed).

I see default_value as a way to get exactly the same beginner's error 
we already have with function defaults: a mutable object will not 
work as beginners expect, and we can confidently predict (based on 
the function defaults case) that python-list and python-help and 
python-tutor and a bazillion other venues will see an unending stream 
of confused beginners (in addition to those confused by mutable 
objects as default values for function arguments, but those can't be 
avoided). I presume you consider the "one obvious way" is to use 
default_value for immutables and default_factory for mutables, but 
based on a lot of experience teaching Python I feel certain that this 
won't be obvious to many, MANY users (and not just non-Dutch ones, 
either).
Alex


More information about the Python-Dev mailing list

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