Python - 可以重命名xml.etree.ElementTree.iter()以实现2.6向后兼容性?

时间:2017-08-16 20:47:50

标签: python elementtree

我正在编写一个将在具有python 2.6或python 2.7的机器上运行的脚本。该脚本解析并循环遍历installed.xml,如下所示:

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()

我尝试了一些我在这里找到的东西,但还没有得到任何工作。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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'):