首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理Decorator中的论点

处理Decorator中的论点
EN

Stack Overflow用户
提问于 2019-06-06 11:06:41
回答 2查看 48关注 0票数 0

我有下面的装饰示例:

代码语言:javascript
复制
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):,甚至在阅读了许多装饰教程之后

  1. 我不明白为什么在def wrapper_function1()中需要*和*,如果它在这里返回original_function(*args,**kwargs)。这不是多余吗?
  2. 如果我把*和**放在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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-28 08:37:31

不幸的是,你理解装饰师的榜样是“天生不好”.decorator_function1可以用作装饰符,但它的签名与语法糖表示法、@语法不兼容,但只遵循嵌套调用的顺序,这里是一个可能的示例decorator_function1(display_info)()('John', 25)

  1. ***分别充当列表和字典的解包装运算符。为什么有用?因为您不必关心参数的数量,这可能是不同的,因为您想要修饰的函数可能没有相同的签名,文档
  2. 出现错误是因为装饰器签名与@符号不兼容,要修复它,您必须将装饰器的参数与包装器的参数交换。在这里,我们列出了如何做到这一点,并将重点放在argskwargs的角色上。
代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2019-06-06 11:12:25

因为写这个

代码语言:javascript
复制
@decorator_function1
def display_info(name, age):
    # some code

只是“合成糖”:

代码语言:javascript
复制
def display_info(name, age):
    # some code

display_info = decorator_function1(display_info)

这就是display_info函数现在是如何了解decorator_function的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56476317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档