如何编写Python扁平化参数装饰器并保留函数文档字符串?
Python装饰器实现参数扁平化的通用方法(以pow函数为例)
要让pow同时支持常规参数调用pow(4.5,6)和单可迭代参数调用pow([4.5,6]),且保留原函数的文档字符串,可以按以下方式实现通用装饰器:
核心思路
装饰器需要拦截函数调用,判断参数形式:
- 若传入单个非字符串的可迭代参数,就将其拆分为位置参数传递给原函数
- 其他情况直接传递原参数
完整实现代码
import functools def flatten_args(func): @functools.wraps(func) def wrapper(*args, **kwargs): # 检查是否为单个可迭代参数(排除字符串,避免误判) if len(args) == 1 and not isinstance(args[0], str) and hasattr(args[0], '__iter__'): return func(*args[0], **kwargs) # 常规参数调用直接传递 return func(*args, **kwargs) return wrapper # 装饰内置pow函数 pow_with_flatten = flatten_args(pow)
测试验证
# 常规调用方式 print(pow_with_flatten(4.5, 6)) # 输出:830.3765625 # 传入列表的调用方式 print(pow_with_flatten([4.5, 6])) # 输出:830.3765625 # 验证原函数文档字符串是否保留 print(pow_with_flatten.__doc__) # 输出:pow(base, exp[, mod]) -> value # Equivalent to base**exp with 2 arguments, or base**exp % mod with 3 arguments # Some types, such as ints, are able to use a more efficient algorithm when mod is present.
关键细节说明
functools.wraps(func):复制原函数的__name__、__doc__等元信息到装饰器的wrapper函数,确保装饰后的函数与原函数元信息一致- 可迭代判断逻辑:用
hasattr(args[0], '__iter__')检测可迭代性,同时排除字符串,避免合法的字符串参数调用被错误处理 - 通用性:该装饰器可复用在其他需要支持参数扁平化的函数上,比如
sum、max等,只需替换装饰的目标函数即可
内容的提问来源于stack exchange,提问作者Toothpick Anemone
相关产品推荐
相关产品推荐

