[Python-Dev] Detecting tp_compare / tp_richcompare from Python

Tres Seaver tseaver at palladion.com
Thu Nov 8 21:31:51 CET 2012


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 11/08/2012 02:51 PM, Tres Seaver wrote:
> On 11/08/2012 12:59 PM, Guido van Rossum wrote:
>> In Python, you can write
> 
>> if C.__eq__ == object.__eq__: print('class C does not override 
>> __eq__')
> 
>> Does that help?
> 
> That works in Python3, but not in Python2 -- methodwrappers don't
> compare equal the same way slotwrappers do :(.  I still need to
> straddle (back to Python 2.6.

I think I'm going to need two separate checkers:

- - In Py3k, use your check above for both '__eq__' and '__lt__', e.g:

   def check_comparable(key);
       klass = type(key)
       if klass.__eq__ == object.__eq__ or klass.__lt__ == object.__lt__:
           raise TypeError('Incomparable')

- - In Python2, I think I can just check that the instance (not its class)
  has either ('__lt__' and '__eq__') *or* '__cmp__', e.g.:

   def check_comparable(key);
       if not ((getattr(key, '__eq__', None) is not None and
                getattr(key, '__lt__', None) is not None) or
                getattr(key, '__cmp__', None) is not None):
          raise TypeError('Incomparable')



Tres.
- -- 
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://www.enigmail.net/

iEYEARECAAYFAlCcFrcACgkQ+gerLs4ltQ6JDgCeJpDmo70H9Xgz3preNHVvaTl5
dYkAoNS+fpSXwZiaD2J2ONyQZ2mPIcFC
=OiMY
-----END PGP SIGNATURE-----



More information about the Python-Dev mailing list