2017-05-12 8 views
0

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) 

その「反復可能な」機能を実装するための最良の方法は何ですか? おかげ

+2

だから、あなたがしたいだけで何しない理由は?代わりにアクションを呼び出さないでください...インスタンスを 'yield' ... –

+0

そのXMLファイルはXMLではありません。単一のルートが必要です。 –

+0

@ polkovnikov.phあなたは、私のxmlに根本的で厄介な構造がありますが、私は質問の関連部分のみを入れます –

答えて

1

代わりに、あなたの関数への呼び出し可能に渡すので、それはInstanceをもたらす作る、そしてあなたが望む動作を得ることができ、例えばこの場合には

def enum_instances(file_path, action=None): 
    for instance_xml in ET.parse(file_path).getroot().find('lexelt'): 
     instance = Instance(
      instance_xml.attrib['id'], 
      instance_xml.find('answer').attrib['senseid'], 
      instance_xml.find('context').text) 
     if action is not None: 
      instance = action(instance) 
     yield instance 

- 私はNoneからactionをデフォルトに設定しましたしかし、必要ならばyieldの前に何らかの形でinstanceを突然変異させる関数を渡す余地が残されています。その後

:この場合は勝利のために

for instance in enum_instances('some_file_path'): 
    print(instance.context) 
+0

私はそれを私に打ち負かすと思います - あなたは 'textの後に余分な敬けんを持っていますか? '最後の行に? – doctorlove

+0

@doctorlove私は本当に良いスポットでした。 –

3

ジェネレータ、。

def enum_instances(file_path): 
    for instance_xml in ET.parse(file_path).getroot().find('lexelt'): 
     yield Instance(
      instance_xml.attrib['id'], 
      instance_xml.find('answer').attrib['senseid'], 
      instance_xml.find('context').text) 

ような何かそして、あなたはあなたが必要な正確に何を言うことができます。

for instance in enum_instances(file_path): 
    print(instance.context) 
関連する問題