On Sat, Nov 28, 2015 at 10:23 AM, 王珺 email@example.com wrote:
However, widget.item may be None, while e.g. there are four widgets but only three items in total. In this case I should fill the area with white. But in this version of show, I just FORGET item can be None. So the traceback infomation: 'Window' object has no attribute 'backgroundImg'. In fact it takes a while before I find the cause is the AttributeError/__getattr__ mechanism.
Hmm. A possibly more general solution is to declare that a function mustn't ever raise a certain exception.
from functools import wraps def dontraise(exc): def wrapper(f): @wraps(f) def inner(a,**kw): try: f(a,**kw) except exc as e: raise RuntimeError from e return inner return wrapper
class A(): def __init__(self, x=None): self.x = x
@property @dontraise(AttributeError) def t(self): return self.x.t def __getattr__(self, name): return 'default'
By guarding your function with dontraise(AttributeError), you declare that any AttributeError it raises must not leak out. Same as the property change, but not bound to the property class itself.