1

行で呼び出す必要のある関数を格納するために配列を使用します。

def do_xslt(xsl, xml):
    newxml = dosomethingwithit(xsl,xml)
    return newxml

TRANSFORM_PIPELINE = [
    do_xslt('pass1.xsl'),
    do_xslt('pass2.xsl'),
    do_xslt('pass3.xsl'),
]

私が今やりたいのはTRANSFORM_PIPELINE、与えられた引数と動的な引数でを呼び出すことです。

私は私の心の中にこのようなものがあり、ループで呼び出す必要がありますdo_xslt('passX.xsl', xml)

for transform in TRANSFORM_PIPELINE:
    xml = transform(xml) 

もちろん、このアプローチは間違っています。しかし、Pythonで正しい方法を作る方法は?

4

2 に答える 2

2

関数functools.partial()部分的に適用するために使用します。

from functools import partial
TRANSFORM_PIPELINE = [
    partial(do_xslt, 'pass1.xsl'),
    partial(do_xslt, 'pass2.xsl'),
    partial(do_xslt, 'pass3.xsl')
]

によって返される関数partial()を呼び出すdo_xslt('pass1.xsl', *args, **kwargs)*args**kwargs新しい関数に渡される引数で呼び出されます。

デモ:

>>> def do_xslt(xsl, xml):
...     print 'do_xslt(%r, %r)' % (xsl, xml)
...     return xml + '*' + xsl
...
>>> from functools import partial
>>> TRANSFORM_PIPELINE = [
...     partial(do_xslt, 'pass1.xsl'),
...     partial(do_xslt, 'pass2.xsl'),
...     partial(do_xslt, 'pass3.xsl')
... ]
>>> x = 'xml is lame'
>>> for transform in TRANSFORM_PIPELINE:
...     x = transform(x)
...     print x
...
do_xslt('pass1.xsl', 'xml is lame')
xml is lame*pass1.xsl
do_xslt('pass2.xsl', 'xml is lame*pass1.xsl')
xml is lame*pass1.xsl*pass2.xsl
do_xslt('pass3.xsl', 'xml is lame*pass1.xsl*pass2.xsl')
xml is lame*pass1.xsl*pass2.xsl*pass3.xsl
于 2012-05-11T08:06:26.103 に答える
2

使用functools.partial()- http://docs.python.org/library/functools.html#functools.partial

TRANSFORM_PIPELINE = [
    functools.partial(do_xslt, 'pass1.xsl'),
    functools.partial(do_xslt, 'pass2.xsl'),
    functools.partial(do_xslt, 'pass3.xsl'),
]

または、次のようなクロージャーを使用することもできます。

def do_xslt(xsl):
    def inner(xml):
        newxml = dosomethingwithit(xsl,xml)
        return newxml
    return inner

このようにして、TRANSFORM_PIPELINE を現在の状態のままに保つことができます。

于 2012-05-11T08:06:58.930 に答える