from testutils import assertRaises
class A:
pass
a = A()
a.b = 10
assert hasattr(a, 'b')
assert a.b == 10
setattr(a, 'b', 12)
assert a.b == 12
assert getattr(a, 'b') == 12
with assertRaises(AttributeError):
_ = a.c
with assertRaises(AttributeError):
getattr(a, 'c')
assert getattr(a, 'c', 21) == 21
setattr(a, 'c', 20)
assert hasattr(a, 'c')
assert a.c == 20
delattr(a, 'c')
assert not hasattr(a, 'c')
with assertRaises(AttributeError):
_ = a.c
with assertRaises(AttributeError):
object().a = 1
with assertRaises(AttributeError):
del object().a
with assertRaises(AttributeError):
setattr(object(), 'a', 2)
with assertRaises(AttributeError):
delattr(object(), 'a')
attrs = {}
class CustomLookup:
def __getattr__(self, item):
return "value_{}".format(item)
def __setattr__(self, key, value):
attrs[key] = value
custom = CustomLookup()
assert custom.attr == "value_attr"
custom.a = 2
custom.b = 5
assert attrs['a'] == 2
assert attrs['b'] == 5
class GetRaise:
def __init__(self, ex):
self.ex = ex
def __getattr__(self, item):
raise self.ex
assert not hasattr(GetRaise(AttributeError()), 'a')
with assertRaises(AttributeError):
getattr(GetRaise(AttributeError()), 'a')
assert getattr(GetRaise(AttributeError()), 'a', 11) == 11
with assertRaises(KeyError):
hasattr(GetRaise(KeyError()), 'a')
with assertRaises(KeyError):
getattr(GetRaise(KeyError()), 'a')
with assertRaises(KeyError):
getattr(GetRaise(KeyError()), 'a', 11)