Python高阶函数使用时如何避免重复传递相同参数?
方案1:约定参数位,用占位符忽略不需要的参数(最推荐)
遵循Python「显式优于隐式」的设计原则,直接固定高阶函数调用func时的第一个参数为required,不需要用到这个参数的func用_作为第一个参数名占位即可,完全不需要任何检测逻辑,性能最高、没有黑魔法、可读性最强。
def higher_order_func(required, func, *args): # 固定第一个参数传required,不需要的func用_占位即可 func(required, *args) do_something_with(required) # 需要用到required的函数 def my_func(required): do_something(required) # 不需要用到required的函数 def other_func(_, a, b): do_other_thing(a, b) # 调用方式完全不用重复传required higher_order_func(required, my_func) higher_order_func(required, other_func, 1, 2)
这种写法是Python社区最常用的处理这类问题的方式,没有任何心智负担。
方案2:用inspect模块做规范的参数检测(如果必须做自动适配)
如果你确实需要保留自动判断要不要传参的隐式逻辑,不要直接读func.__code__.co_varnames,这个属性包含函数内部所有局部变量名,不止参数,很容易出现误判。用标准库inspect的签名检测才是正规实现,完全不算hack:
import inspect def higher_order_func(required, func, *args): sig = inspect.signature(func) # 检测func的参数列表是否包含名为required的参数 if 'required' in sig.parameters: func(required, *args) else: func(*args) do_something_with(required)
这个实现能正确识别所有符合Python规范的可调用对象(包括偏函数、装饰器装饰过的函数等,只要正确实现了__signature__属性),不会出现误判。
提示:优先选方案1即可,自动检测的隐式逻辑虽然方便,但遇到参数名不匹配的情况(比如业务函数的参数叫req而不是required)就会失效,显式约定的逻辑鲁棒性要强得多。
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

