首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python functools.partial 實戰:動態修改函式預設參數與建立偏函式

     編輯:更多程式設計知識

functools.partial 可「凍結」函式部分位置/關鍵字參數,產生新的可呼叫物件(偏函式),常用於回調函式參數預設、API 客戶端封裝、事件處理器綁定參數等場景。

基本用法示範

import functools

def foo(a, b=0):
    print(a + b)

foo(1)           # 1  (使用預設 b=0)
foo(1, 1)        # 2  (覆寫 b=1)

# 修改 b 的預設值為 5
foo1 = functools.partial(foo, b=5)
foo1(1)          # 6

# 給原本無預設值的 a 設定預設值 10
foo2 = functools.partial(foo, a=10)
foo2()           # 10
foo2(b=3)        # 13

Partial 物件屬性檢視

>>> foo2.func

>>> foo2.args
()
>>> foo2.keywords
{'a': 10}
  • func:原始函式
  • args:預先綁定的位置參數元組
  • keywords:預先綁定的關鍵字參數字典

補全函式中繼資料:functools.update_wrapper

>>> foo2.__doc__
Traceback (most recent call last):
AttributeError: 'functools.partial' object has no attribute '__doc__'

>>> functools.update_wrapper(foo2, foo)
>>> foo2.__doc__
'int add'

將原函式的 __name__, __doc__, __module__, __annotations__ 等複製到 partial 物件,利於除錯與文件產生工具。

進階應用:API 客戶端預設參數

import requests
from functools import partial

base_get = partial(requests.get, timeout=5, headers={'User-Agent': 'MyBot/1.0'})
# 之後呼叫 base_get(url) 即自帶超時與 UA

注意事項

  • Partial 物件非函式,inspect.isfunction(foo2) 為 False,裝飾器鏈需留意。
  • 位置參數綁定順序固定,呼叫時新位置參數會接在 args 之後。
  • Python 3.7+ 可搭配 functools.singledispatch 實現更靈活的多型分派。

善用 partial 可減少重複參數傳遞、提升程式碼可讀性與可測試性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved