2016-10-25 7 views
0

現在、PyXBによって生成されたDOMで処理されたXSDで定義されたデータを格納するORMを実装しています。 各要素の多くにはサブ要素などがあり、それぞれがminOccurs=0を持ち、DOM内でNoneに解決される可能性があります。ネストされた属性にアクセスするときになしをチェックする

with suppress(AttributeError): 
    wanted_subelement = root.subelement.sub_subelement.wanted_subelement 

又はむしろ

if root.subelement is not None: 
    if root.subelement.sub_subelement is not None: 
     wanted_subelement = root.subelement.sub_subelement.wanted_subelement 

両方のスタイルが完全に正常に動作しているが、好ましい:オプション要素を含むいくつかの要素の階層構造にアクセスするとき は、従って私は今使用するかどうかという問題に直面して? (私はところで、オランダないです)

答えて

1

これも動作します:文はなしfalseと評価して左から右にチェックする場合

if root.subelement and root.subelement.sub_subelement: 
    wanted_subelement = root.subelement.sub_subelement.wanted_subelement 

ザ・を。したがって、最初の要素がfalseに評価された場合、それは2番目の要素にアクセスしようとしません。

+0

はい、your'reは正しいです。しかし、この方法では、表現は簡単に80文字を超えることがあります。 –

1

あなたはより一般的な検索機能でこれを包むために、より良い実行するためにかなりの数の、このような検索をお持ちの場合:

# use a sentinel object distinct from None 
# in case None is a valid value for an attribute 
notfound = object() 

# resolve a python attribute path 
# - mostly, a `getattr` that supports 
# arbitrary sub-attributes lookups  
def resolve(element, path): 
    parts = path.split(".") 
    while parts: 
     next, parts = parts[0], parts[1:] 
     element = getattr(element, next, notfound) 
     if element is notfound: 
      break 
    return element 

# just to test the whole thing  
class Element(object): 
    def __init__(self, name, **attribs): 
     self.name = name 
     for k, v in attribs.items(): 
      setattr(self, k, v) 

e = Element(
    "top", 
    sub1=Element("sub1"), 
    nested1=Element(
     "nested1", 
     nested2=Element(
      "nested2", 
      nested3=Element("nested3") 
      ) 
     ) 
    ) 


tests = [ 
    "notthere", 
    "does.not.exists", 
    "sub1", 
    "sub1.sub2", 
    "nested1", 
    "nested1.nested2", 
    "nested1.nested2.nested3" 
    ] 

for path in tests: 
    sub = resolve(e, path) 
    if sub is notfound: 
     print "%s : not found" % path 
    else: 
     print "%s : %s" % (path, sub.name) 
+0

私は実際にこれらのアクセスチェックを多く実行しています。しかし、文字列化されたバージョンのパスを介して属性にアクセスすると、コードの読み込みが難しくなり、エラーが発生しやすくなり、PyXB DOMモデルが不条理になります。 –

+0

@RichardNeumann私が心配している限り、私は、もし "elt.attrとelt.attr.subattrとelt.attr.subattr.subsubattr"などの長い行よりはるかに読みやすい "文字列化されたパス"それはおそらく主観的です。 Wrt /馬鹿げさ、私はパス表現のルックアップをサポートしていないDOMモデルは不合理だと言っていますが、ここでもまたYMMV;) –

関連する問題