Python Language Incompatibilities moving from Python 2 to Python 3 hasattr function bug in Python 2


In Python 2, when a property raise a error, hasattr will ignore this property, returning False.

class A(object):
    def get(self):
        raise IOError

class B(object):
    def get(self):
        return 'get in b'

a = A()
b = B()

print 'a hasattr get: ', hasattr(a, 'get')
# output False in Python 2 (fixed, True in Python 3)
print 'b hasattr get', hasattr(b, 'get')
# output True in Python 2 and Python 3

This bug is fixed in Python3. So if you use Python 2, use

except AttributeError:
    print("no get property!")

or use getattr instead

p = getattr(a, "get", None)
if p is not None:
    print("no get property!")