python - 如何为存储在数组中的函数提供常量和动态参数

标签 python arrays

我使用一个数组来存储需要连续调用的函数:

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/

相关文章:

python - 使用 f2py 将文本字符串从 fortran 子例程返回到 python

python - numpy.bitwise_and.reduce 行为异常?

python - 如何计算数据框中两列之间的相关系数?

objective-c - 当一个整数相加或相乘超过其限制时会发生什么

ios - 生成非重复随机数的 Swift 数组

python - odoo 10 自定义报告..总行数..按产品ID

python - 比较日期的 strptime 替代方法?

javascript - 根据 JavaScript 中的条件将对象拆分为对象数组

c# - 字节数组的字符串表示

c++ - 如何优化这个?指向数组的指针