You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:42:11