【发布时间】:2017-10-11 14:06:42
【问题描述】:
我想包装 for 循环的功能,这样使用起来会更直观。就我而言,我必须解析 xml 文件,如下所示:
<instance id="line-n.w8_047:15696:">
<answer instance="line-n.w8_047:15696:" senseid="product" />
<context> context1 </context>
</instance>
<instance id="line-n.w8_088:12441:">
<answer instance="line-n.w8_088:12441:" senseid="product" />
<context> another context</context>
</instance>
我为Instance 写了一个这样的类:
class Instance:
def __init__(self, id, answer, context):
self.id = id
self.answer = answer
self.context = context
我编写了下一个函数来枚举实例:
import xml.etree.ElementTree as ET
def enum_instances(file_path, action):
for instance_xml in ET.parse(file_path).getroot().find('lexelt'):
action(Instance(
instance_xml.attrib['id'],
instance_xml.find('answer').attrib['senseid'],
instance_xml.find('context').text)
)
action 参数是对Instance 执行某些操作的回调,如下所示:
enum_instances('/path/to/xml', lambda instance: print(instance.context))
但它看起来有点奇怪,我希望它更直观,像这样:
for instance in enum_instances(file_path):
print(instance.context)
实现“可迭代”功能的最佳方式是什么? 谢谢
【问题讨论】:
-
那么为什么不做你想做的事呢?不要调用行动...而是...
yield实例... -
顺便说一句,那个 XML 文件不是 XML。必须有一个根。
-
@polkovnikov.ph 你说得对,我的 xml 有一个根目录和一个凌乱的结构,但我只放了问题的相关部分