PEP 309 提議了 python 的 PFA 行為.
這觀念是由Functional Language衍生來的, 提供一種讓function參數遞減至只剩一個的方法 [1], 其實一開始我也不是很了解他到底要表達什麼... 讓function的參數變少有那麼了不起嗎?
Python的實作範例,簡單來說就是實作出一個class接受function和一串function argument作為 constructor的參數並保存下來, 然後class override call operator,所以class instance 可以像function一樣的使用.
class partial(object):
def __init__(*args, **kw):
self = args[0]
self.fn, self.args, self.kw = (args[1], args[2:], kw)
def __call__(self, *args, **kw):
if kw and self.kw:
d = self.kw.copy()
d.update(kw)
else:
d = kw or self.kw
# 合併args和keyword args,作為self.fn的參數
# 傳回 self.fn
return self.fn(*(self.args+args), **d)
看一個例子
>>> from os import path as p
>>> from functools import partial
>>> joinhome = partial(p.join, '/usr/home')
>>> # 建立絕對路徑
>>> joinhome('myfile')
'/usr/home/myfile'
很像default argument做的事情, 不過更靈活更好用, 尤其 python 有 argument 可以不照順序 傳遞的規則, 所以給予 partial function 的彈性和運用更寬更好用.
[1] | Function curring |
沒有留言:
張貼留言