2017-08-16 57 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