2010-12-03 12 views

答えて

6

hasattrは、そのような点線の名前をとらず、属性チェーンをナビゲートしません。しかし、あなたはそれを行うための関数を書くことができます。

def get_deep_attr(obj, attrs): 
    for attr in attrs.split("."): 
     obj = getattr(obj, attr) 
    return obj 

def has_deep_attr(obj, attrs): 
    try: 
     get_deep_attr(obj, attrs) 
     return True 
    except AttributeError: 
     return False 
2

ここでそれを行うための一つの方法だ:

def hasattrdeep(obj, *names): 
    for name in names: 
     if not hasattr(obj, name): 
      return False 
     obj = getattr(obj, name) 
    return True 

はこのようにそれを呼び出します。

hasattrdeep(node) is True # A side-effect. Could be made invalid if really desired by raising TypeError if len(names) == 0 
hasattrdeep(node, 'foo') is False 
hasattrdeep(node, 'child1') is True 
hasattrdeep(node, 'child1', 'foo') is False 
hasattrdeep(node, 'child1', 'child2') is True 
関連する問題