Test None for an object that does not implement ==
Lie Ryan
lie.1296 at gmail.com
Sun Dec 25 12:13:53 EST 2011
On 12/26/2011 01:13 AM, Roy Smith wrote:
> In article<mailman.4066.1324820148.27778.python-list at python.org>,
> Chris Angelico<rosuav at gmail.com> wrote:
>
>> On Mon, Dec 26, 2011 at 12:17 AM, Roy Smith<roy at panix.com> wrote:
>>> Just for fun, I tried playing around with subclassing NoneType and
>>> writing an __eq__ for my subclass. Turns out, you can't do that:
>>>
>>> Traceback (most recent call last):
>>> File "./none.py", line 5, in<module>
>>> class Nihil(NoneType):
>>> TypeError: Error when calling the metaclass bases
>>> type 'NoneType' is not an acceptable base type
>>
>> Yes; unfortunately quite a few Python built-in classes can't be
>> subclassed. It's an unfortunate fact of implementation, I think,
>> rather than a deliberate rule.
>>
>> But then, what would you ever need to subclass None for, other than
>> toys and testing?
>
> You might be to differentiate between temporary and permanent failures.
> Let's say you have a WidgetPool, containing Widgets of various classes.
>
> class WidgetPool:
> def get_widget(class_name):
> """Return a Widget of a given class. If there are no such
> Widgets available, returns None."""
> [...]
>
> You might want to return a None subclass to signify, "No such Widgets
> are currently available, but they might be if you try again in a little
> while", as opposed to "No such Widgets will ever be available".
>
> If you were designing the interface from scratch, you would probably
> represent that with an exception hierarchy. However, if this was an old
> interface that you were modifying, this might be a way to return a
> richer failure indication for new clients without breaking backwards
> compatibility for existing code.
>
> Of course, the existing code would probably be using "is None" tests,
> and break anyway. But at least that's a plausible scenario for None
> subclasses.
That scenario doesn't actually need subclassing if you duck type.
More information about the Python-list
mailing list