版權聲明

所有的部落格文章都可以在右邊[blog文章原始檔案]下載最原始的文字檔案,並依你高興使用 docutil 工具轉換成任何對應的格式方便離線閱覽,除了集結成書販賣歡迎任意取用,引用

python -- partial function application

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

沒有留言:

Related Posts with Thumbnails