2017-08-16 6 views
1

私は、Python 2.6またはPython 2.7のいずれかのマシンで実行されるスクリプトを作成しています。 _ElementInterfaceのインスタンスは、私が2.6であること考え出した 「iter」は何の属性を持っていない - これは2.7で正常に動作しますが、2.6に私が取得し、エラーPython - 2.6の下位互換性のためにxml.etree.ElementTree.iter()の名前を変更できますか?

tree = ET.parse('installed.xml') 
root = tree.getroot() 
for package in root.iter('package'): 

     if 'foo' in package.attrib['id'].lower(): 
      for property in package.iter('property'): 
       if 'cic.info.version' in property.attrib['name']: 
        version = property.attrib['value'] 

:スクリプトが解析し、このようinstalled.xmlをループこの方法は、「getiterator」と呼ばれ、そのメソッドに別名を割り当てるための方法がある場合、私は思っていた、このような何か...

if cur_python < req_python: 
    xml.etree.ElementTree.iter() = xml.etree.ElementTree.getiterator() 

私は私がここで見つかったいくつかのことを試してみましたが、couldnまだ働いているものはありません。どんな助けでも大歓迎です!

+0

'xml.etree.ElementTree.iter()= xml.etree.ElementTree .getiterator() 'は動作せず、' xml.etree.ElementTree.iter = xml.etree.ElementTree.getiterator'はどちらもしません。それぞれのインスタンス( 'root'と' package')ごとにそれを行う必要があります。おそらくラッパーを定義してコードを変更してください... –

答えて

1

あなたがそれを行うことができますが、あなたはごとインスタンスの割り当てを作成する必要があると思います:

root = tree.getroot() 
if cur_python < req_python: 
    root.iter = root.getiterator 

は、(括弧の欠如をメモして、我々はコール機能にはしたくないけど名前を定義する)。 packageについても同じ操作を行います。

か、正しい関数を返すラッパー関数を定義します。

あなたはこのように使用
def compat_iter(obj): 
    return (obj.getiterator if cur_python < req_python else obj.iter) 

for package in compat_iter(root)('package'): 
... 
    for property in compat_iter(package)('property'): 
+0

これは完全に機能しました、ありがとうございます! – cab354