Python 如何使用装饰器设置函数参数的默认值?

Python 如何使用装饰器设置函数参数的默认值?,python,parameters,decorator,optional-parameters,python-decorators,Python,Parameters,Decorator,Optional Parameters,Python Decorators,我想为bar函数定义参数param2的默认值: def foo(default_value): def bar(param1, param2=default_value) """bar does some stuff""" return bar bar = foo(default_value) 装饰师怎么可能做到这一点 更全面地说,如果有人有一些关于在用参数装饰函数时如何操作args和kwargs的文档,我很乐意看一看。我不确定我是否理解您的示例代码的意思,但以

我想为bar函数定义参数param2的默认值:

def foo(default_value):
    def bar(param1, param2=default_value)
        """bar does some stuff"""
    return bar
bar = foo(default_value)
装饰师怎么可能做到这一点


更全面地说,如果有人有一些关于在用参数装饰函数时如何操作args和kwargs的文档,我很乐意看一看。

我不确定我是否理解您的示例代码的意思,但以下内容似乎与您问题的标题所要求的内容相符:

PLACE_HOLDER = object()

def default_arg(default_value):
    def decorator(f):
        if f.func_defaults and f.func_defaults[0] is PLACE_HOLDER:
            f.func_defaults = (default_value,)
        return f
    return decorator

@default_arg(42)
def bar(param1, param2=PLACE_HOLDER):
    """bar does some stuff"""
    print('bar({}, {}) called'.format(param1, param2))


bar(1)
输出:

条(1,42)被调用

带参数的装饰器的语法不同。它应该返回一个函数,该函数将接受一个函数并返回另一个函数。例如:

def foo(default_value):
    def wrapped(f):
        def bar(param1, param2=default_value):
            print "inside bar"
            print "param1=%s param%s"%(param1, param2)
        return bar
    return wrapped
现在,当您装饰一个函数时:

@foo(default_value="test param2")
def test_decorator():
    pass
调用它将导致:

test_decorator("test param1")

inside bar
param1=test param1 param2=test param2
或者,不接受默认值:

test_decorator("test param1", "other test param2")

inside bar
param1=test param1 param2=other test param2

您可以阅读更多关于主题

的用法,绝对应该考虑查看WRAP()<代码>。WRAT模块的目的是为Python提供透明的对象代理,它可以作为构建函数包装器和装饰器函数的基础。我很想看看如何将param2与*args和**kwargs结合起来,但无论如何,您的解决方案虽然具体,但仍然有效