如何使用装饰器为函数参数设置默认值?
How can i set a default value for a function parameter with a decorator?
我想为 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)
输出:
bar(1, 42) called
带参数的装饰器的语法不同。它应该 return 一个将接受一个函数的函数和 return 另一个函数。例如:
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
您可以阅读有关该主题的更多信息here
我想为 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)
输出:
bar(1, 42) called
带参数的装饰器的语法不同。它应该 return 一个将接受一个函数的函数和 return 另一个函数。例如:
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
您可以阅读有关该主题的更多信息here