2017-08-16 18 views
1

我正在寫一個腳本,它將在具有python 2.6或python 2.7的機器上運行。該腳本解析,並通過installed.xml這樣的循環:Python - 可能爲了向後兼容性而重命名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'] 

這正常的2.7,但在2.6我得到的和錯誤 - _ElementInterface實例沒有屬性「ITER」 我已經想通了,在2.6該方法被稱爲「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