0

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是这样做的,但为什么它会影响生成器?

4

1 回答 1

1

标准库中的实现findall总是返回一个列表,如果你想要一个迭代器使用这个iterfind方法。我不确定ElementTree您使用的是哪个外部版本,但似乎该版本返回的是迭代器findall而不是列表。list调用返回值可能会更安全:

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

如果这是您所需要的,它将适用于两种ElementTree实现。

于 2013-07-10T11:01:13.140 回答