我有一个装饰器来改变传递给函数的字符串参数:
def decorator(fn):
def wrapper(*args):
replacements = list()
for arg in args:
new_item = arg + "!!!"
replacements.append(new_item)
args = tuple(replacements)
print fn(*args)
return wrapper
我有一个非常简单的函数,我想将一个默认参数传递给decorator
:
def f1(arg1="Hello world"):
return arg1
令我惊讶
decorator(f1)() # using the default argument
返回了未经修饰的Hello world
。
我做了一些研究,发现default arguments are only evaluated at function creation time。我还了解到具有默认值的参数存储在.func_defaults
属性中。通过这些信息,我改变了我的装饰器,通过改变线
for arg in args:
到
for arg in args + fn.func_defaults:
为什么函数f1
的默认参数值没有传递给包装器中的*args
并按预期更改?