This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author Brian.Mearns
Recipients Brian.Mearns
Date 2014-12-02.14:12:04
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1417529524.39.0.154038331271.issue22978@psf.upfronthosting.co.za>
In-reply-to
Content
Performing a logical negation (`not`) on `NotImplemented` should return `NotImplemented`. Currently, it returns `False`.

A common pattern for implementing __eq__ and __ne__ is to implement the comparison in __eq__, and simply delegate to it in __ne__ with a negation. However, if two values are incomparable, then __eq__ and __ne__ should both return NotImplemented. If you try to negate NotImplemented in __ne__, you will end up with a value of False, instead of NotImplemented, so you have to specifically test for this case.

For instance, here is how one would write the code now:

    def __ne__(self, other):
        eq = self.__eq__(other)
        if eq is NotImplemented:
            return NotImplemented
        return not eq

Where as the following would be simpler, and could be used if this change was made:

    def __ne__(self, other):
        return not self.__eq__(other)

This is not simply sugar to reduce typing, it is safer because some coders may forget about NotImplemented and implement __ne__ as shown in the second example anyway, which is not actually correct with the current behavior.
History
Date User Action Args
2014-12-02 14:12:04Brian.Mearnssetrecipients: + Brian.Mearns
2014-12-02 14:12:04Brian.Mearnssetmessageid: <1417529524.39.0.154038331271.issue22978@psf.upfronthosting.co.za>
2014-12-02 14:12:04Brian.Mearnslinkissue22978 messages
2014-12-02 14:12:04Brian.Mearnscreate