当前位置: 首页 > 知识库问答 >
问题:

在Decorator中处理争论

艾意蕴
2023-03-14

我有以下装饰示例:

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)

我正在努力与行:defwrapper_function1(*args,**kwargs):即使在阅读了很多装饰教程

>

如果我将*和**留在def wrapper\u function1()中,我会得到错误:TypeError:wrapper\u function1()接受0个位置参数,但给出了2个但是为什么wrapper\u function1知道display info的参数?我就是看不见他们被交到哪里去了。这样的事情对我来说是有意义的

def decorator_function1(原始_函数,*args,**kwargs)):my_args=args my_kwargs=kwargs def wrapper_函数(args,kwargs)。。。。

共有2个答案

井镜
2023-03-14

因为写这个

@decorator_function1
def display_info(name, age):
    # some code

这就是“合成糖”:

def display_info(name, age):
    # some code

display_info = decorator_function1(display_info)

这就是函数display\u info现在了解decorator\u函数的方式。

帅博远
2023-03-14

不幸的是,你理解装饰师的例子是“天生的坏”decorator\u function1可以用作decorator,但其签名与语法糖符号(@语法)不兼容,但只遵循嵌套调用的顺序,这里有一个可能的示例decorator\u function1(display\u info)('John',25)

>

  • ***分别充当列表和字典的解包运算符。为什么有用?因为您不必关心参数的数量,这些参数可能不同,因为您想要装饰的函数可能没有所有相同的签名,文档。

    出现错误的原因是decorator签名与@表示法不兼容,要解决此问题,必须将decorator的参数与包装器的参数交换。这里有一个关于如何做到这一点的详尽列表,重点是argskwargs的角色。

    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)
    
    

  •  类似资料:
    • 问题内容: 我有几个工作人员,每个工作人员都拥有与PostgreSQL的连接。工人用不同的桌子操纵。 工作人员处理来自系统外部的并行请求。被访问的表之一是用户表。当收到一些信息时,我首先需要确保表中有该用户的记录。如果没有记录,我希望首先创建一个。 我正在使用以下成语: 的代码是: 然后测试是否返回任何行。 的(简化)代码为: 当我的系统处理与 同一 用户有关 的 不同信息的并行流时,我经常会收到

    • 我做了什么? 使用JSP开发了一个Web应用程序,允许用户注册、登录并将文件上传到AWS S3。我正在使用Elastic Beanstalk将这个应用程序部署到aws,方法是上传应用程序的war文件。对于登录和注册模块,我使用了RDS,它运行良好。 问题 当我想上传文件到S3时,我需要在WEB app中使用AWS SDK jar及其支持的jar文件。当我完成开发部分并导出war文件时,它大约是75

    • 装饰器模式允许用户在不改变其结构的情况下向现有对象添加新功能。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装器。 此模式创建一个装饰器类,它包装原始类并提供其他功能,使类方法签名保持不变。 装饰器模式的动机是动态附加对象的附加职责。 如何实现装饰设计模式 下面提到的代码是如何在Python中实现装饰器设计模式的简单演示。 插图包括以课堂形式演示咖啡店。 创建的咖啡类是抽象的,这意味着

    • 问题内容: 我正在学习使用装饰器模式,但遇到一个我认为很简单但似乎找不到答案的问题。假设我有一个抽象的饮料类。然后,让我们说一下扩展饮料的一些具体组成部分:美式咖啡,浓缩咖啡,拿铁咖啡等。还有扩展饮料的抽象调味品类。然后,调味品类有多个子类:牛奶,糖,大豆,鞭子。每个调味品子类都有一个cost和getdescription()方法,分别从Beverage和Condiments继承。我的问题是,如何

    • 我正在学习使用decorator模式,我遇到了一个问题,我认为这个问题很简单,但我似乎找不到答案。假设我有一个饮料课是抽象的。然后让我们假设我有几个具体的成分延伸饮料:美式咖啡,浓缩咖啡,拿铁等等,还有一个抽象的调味品类延伸饮料。调味品类又有多个子类:牛奶、糖、大豆、鞭。每个调味品子类都有一个cost和getdescription()方法,分别继承自Beverage和addinments。我的问题

    • Webpage Decorator 这个Chrome浏览器扩展提供了一些可以自定义网页颜色主题和字体的选项。不过安装本扩展后会在Chrome浏览器的地址栏右侧增加一个按钮,也许这会 导致部分网页的地址显示不全。 单击这个按钮就会打开此扩展的选项,可以调整网页背景图片、背景颜色、已读链接的颜色以及网页文字的颜色、字体大小和字体类型等。 颜色选择器是为改变颜色准备的,使用者通过它可选择自己喜欢的颜色或