forループの機能をラップして、それをより直感的に使用したいと考えています。私の場合、私は、xmlファイルを解析する必要が次のようになります。私はこのようなInstance
のクラスを書いたPythonでのループのラッピング
<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>
:
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に根本的で厄介な構造がありますが、私は質問の関連部分のみを入れます –