基于模块导入的不同代码结果? (ElementTree的)

时间:2013-07-10 10:22:39

标签: python xml elementtree

Python 2.7我使用捆绑的elementtree模块编写了一些代码。

commands = root.findall('{http://clish.sourceforge.net/XMLSchema}'
                        'VIEW/{http://clish.sourceforge.net/XMLSchema}COMMAND')
tree_list = []

for command in commands:
    tree_list.append(list(command.iter()))

稍后我在代码中做了:

for command in commands:
    for i in command:
         if "CONFIG" in str(i):
             command.remove(i)
    tree_list.append(list(command.iter()))

这很好用。但是,我只是自己导入ElementTree.py进行最小安装,而不是import xml.etree.ElementTree as ET。 由于某种原因,功能现在不同。第二次循环commands我注意到没有任何东西要循环,它是空的。因此,在第二个循环之前,我现在必须再次执行此代码以“重新填充”commands

commands = root.findall('{http://clish.sourceforge.net/XMLSchema}'
                            'VIEW/{http://clish.sourceforge.net/XMLSchema}COMMAND')

我想知道为什么会这样?导入的模块如何影响这个?也许导入不同的elementtree.py这样做了,但为什么它会影响生成器?

1 个答案:

答案 0 :(得分:1)

如果您希望迭代器使用findall方法,则标准库中iterfind的实现始终返回一个列表。我不确定您使用的是ElementTree的哪个外部版本,但似乎this versionfindall而不是列表返回迭代器。在返回的值上调用list可能更安全:

commands = list(root.findall('{http://clish.sourceforge.net/XMLSchema}'
                'VIEW/{http://clish.sourceforge.net/XMLSchema}COMMAND'))

如果这是您所需要的,它将适用于ElementTree个实施。