2012-05-11 13 views
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中做出正確的方式?

回答

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 
+0

此代碼是否實際上_transform_參數? – georg

+0

這個例子沒有,但是一個真正的函數會返回轉換後的參數。無論如何,我已經更新了它。 – ThiefMaster

+0

謝謝。部分功能起作用。這是最好的解決方案,因爲我在TRANSFORM_PIPELINE中也有函數,它們不需要給定的常量(在執行xslt變換之前)。所以我可以每次使用部分我需要它。 – therealmarv

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就是你現在擁有的方式。

+0

謝謝。從我+1。 – therealmarv

相關問題