[Python-ideas] Adding`Unpicklable` to the `collections` module
Éric Araujo
merwok at netwok.org
Tue Nov 30 20:14:34 CET 2010
> For instance, as of Python 2.7 these blocks of code are roughly
> equivalent (the first two are in fact identical in effect):
>
> if isinstance(obj, collections.Sized):
> doSomethingWith(len(obj))
>
> if hasattr(obj, '__len__'):
> doSomethingWith(len(obj))
>
> try:
> doSomethingWith(len(obj))
> except TypeError:
> pass
>
> They all test for the same thing: that you can call len() on the object.
Not exactly: magic methods are looked up on the class, not on the
instance. That’s why isintance+ABCs is the right test to use here. See
http://docs.python.org/dev/reference/datamodel#special-method-names
(The third block also suffers from an over-catching except clause. Put
as little code as possible in the try block and use an else clause.)
ABCs are not contradictory to duck typing at all:
>>> import collections
>>> class Demo:
... def __len__(self):
... return 42
...
>>> isinstance(Demo(), collections.Sized)
True
Demo is not required to subclass Sized or register. ABCs are an
optional mechanism that implements duck typing, so to speak.
http://docs.python.org/dev/glossary
http://docs.python.org/whatsnew/2.6#pep-3119-abstract-base-classes
http://www.python.org/dev/peps/pep-3119/#abcs-vs-duck-typing
Regards
More information about the Python-ideas
mailing list