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

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

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

最佳答案

您可以这样做,但您必须为每个实例创建分配:

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

(注意缺少括号,我们不想调用该函数,而是定义一个名称)。对执行相同的操作。

或者定义一个返回正确函数的包装函数:

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'):

关于Python - 可以重命名 xml.etree.ElementTree.iter() 以实现 2.6 向后兼容性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45722746/

相关文章:

python - 无法使用 python 发送具有多个附件和多个收件人的邮件 [to,cc,bcc]

python - Django 模型权限与组权限

python - 使用 protobuf,如何从已解析的对象中删除字段?

python - 使用 lxml 解析包含默认命名空间的 xml 以获取元素值

如果第一个 XML 父标签缺少子标签,Python XPath 和 ElementTree 将不起作用

Python tree.iterparse 导出所选元素(包括所有后代)的源 XML

python - Tkinter:如何获取特定单词的索引?

php - 如何防止我的网站成为 "hit-boosted"?

Python 附加 XML 子元素两次

python - Python2.6 中 ElementTree 的 iter() 等价物