我有下面的装饰示例:
def decorator_function1(original_function):
def wrapper_function1(*args, **kwargs):
print('wrapper executed this before {}'.format(original_function.__name__))
return original_function(*args, **kwargs)
return wrapper_function1
@decorator_function1
def display_info(name, age):
print('display_info ran with arguments ({}, {})'.format(name, age))
display_info('John', 25)我在这一行中挣扎的是:def wrapper_function1(*args, **kwargs):,甚至在阅读了许多装饰教程之后
def wrapper_function1()中,我得到了错误:TypeError: wrapper_function1() takes 0 positional arguments but 2 were given,但是为什么wrapper_function1知道display info的参数呢?我只是不知道他们是在哪里被移交的。这样的事情对我来说是有意义的。
decorator_function1(original_function,* args,** kwargs):my_args =args my_kwargs = kwargs def wrapper_function(args,kwargs)发布于 2021-10-28 08:37:31
不幸的是,你理解装饰师的榜样是“天生不好”.decorator_function1可以用作装饰符,但它的签名与语法糖表示法、@语法不兼容,但只遵循嵌套调用的顺序,这里是一个可能的示例decorator_function1(display_info)()('John', 25)。
*和**分别充当列表和字典的解包装运算符。为什么有用?因为您不必关心参数的数量,这可能是不同的,因为您想要修饰的函数可能没有相同的签名,文档。@符号不兼容,要修复它,您必须将装饰器的参数与包装器的参数交换。在这里,我们列出了如何做到这一点,并将重点放在args和kwargs的角色上。def decorator_function1(*args, **kwargs):
def wrapper_function1(original_function):
print('wrapper executed this before {}'.format(original_function.__name__))
return lambda *aargs, **kkwargs: original_function(*args + aargs, **kwargs | kkwargs)
return wrapper_function1
# parameters: original func only
@decorator_function1()
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info(1, 2))
# parameters: decorator only
@decorator_function1(1, 2)
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info())
# parameters: positional mix - order depending!
@decorator_function1(1)
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info(2))
# parameters: positional mix - order depending!
@decorator_function1(2)
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info(1))
# parameters: key-pairs decorator only
@decorator_function1(age=1, name=2)
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info())
# parameters: key-pairs original func only
@decorator_function1()
def display_info(name=1, age=2):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info())
# parameters: key-pairs mix
@decorator_function1(age=1)
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info(name=2))
# parameters: key-pairs mix
try:
@decorator_function1(name=1)
def display_info(name, age):
return 'display_info ran with arguments ({}, {})'.format(name, age)
print(display_info(2))
except TypeError as e:
print(e)发布于 2019-06-06 11:12:25
因为写这个
@decorator_function1
def display_info(name, age):
# some code只是“合成糖”:
def display_info(name, age):
# some code
display_info = decorator_function1(display_info)这就是display_info函数现在是如何了解decorator_function的。
https://stackoverflow.com/questions/56476317
复制相似问题