我使用一个数组来存储需要连续调用的函数:
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 中做出正确的方式呢?
最佳答案
使用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)
with *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
关于python - 如何为存储在数组中的函数提供常量和动态参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10547659/