python 装饰器 *args 和 ** kwargs

2024-03-03

我对编码是全新的,我一直在努力吸收尽可能多的东西。我不明白你们发布的很多技术解释,所以请尽量用简单的英语。我了解装饰器函数如何工作的机制,但我的问题是遵循代码逻辑 - 特别是为什么我们必须添加 *args 和 ** kwargs。声明我们传递给带有参数的函数的装饰器函数的任何内容都将始终将相同的参数传递给包装函数,因为它嵌套在装饰器中,这样说是否正确?这就是我在这里缺少的。我不明白原始函数的参数是如何传入的。


让我们举一个简单的例子:

def tracing(func):
    @functools.wraps
    def wrapper(*args, **kwargs):
        logging.debug(f'Calling {func.__name__}')
        try:
            return func(*args, **kwargs)
        finally:
            logging.debug(f'Called {func.__name__}')
    return wrapper

@tracing
def spam():
    print('spam')

@tracing
def add3(n):
    return n+3

你说得对,我们需要采取的理由*args, **kwargs这样我们就可以通过同样的*args, **kwargs到包装的函数。

这称为“转发”,或“完美转发”。这个想法是tracing不必知道有关它所包装的函数的任何信息 - 它可以采用任何一组位置参数和关键字参数,并返回任何内容,并且包装器仍然可以工作。


对于某些装饰器来说,这是不合适的。例如,一个装饰器旨在缓存一组具有相同 API 的函数,使用一个特定参数作为缓存键,could use *args, **kwargs然后通过列表和字典来查找特定参数,但明确地说,它更简单、更清晰:

def caching_spam(func):
    cache = {}
    @functool.wraps
    def wrapper(eggs, beans, spam, cheese):
        if spam not in cache:
            cache[spam] = func(eggs, beans, spam, cheese)
        return cache[spam]
    return wrapper

但通用装饰器比特定装饰器要多得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 装饰器 *args 和 ** kwargs 的相关文章

随机推荐

  • 在Bootstrap组件中单独加载

    我正在开发一个涉及许多开发人员的大型 Web 项目 我想精简 Bootstrap3 的包并仅保留我们正在使用的内容 基本上 这个想法是在页面加载到浏览器中时减少任何额外的开销 所以我可以通过两种方法来做到这一点 我也可以 a 从库中删除任何
  • 如何使用 lambda 表达式创建扩展方法

    目前我正在创建一个接受参数的扩展方法 使用下面的示例 如何使用 lambda 表达式对其进行转换 public static decimal ChangePercentage this IEnumerable
  • 根据前缀对目录中的文件进行分组

    我有一个包含图片的文件夹 文件夹 1 Files ABC 138923 ABC 3223 ABC 33489 ABC 3111 CBA 238923 CBA 1313 CBA 1313 DAC 38932 DAC 1111 DAC 1389
  • 使用 Microsoft Graph API 获取 SharePoint Online 团队网站

    我正在尝试访问组织的 SharePoint 团队网站 我使用 Microsoft Graph API 因为它是 Office 365 最完整的 API 我了解如何获取访问令牌以及如何使用它来发出请求 我知道它有效 因为我可以获得组列表 但是
  • 获取ejs模板中的url参数

    我试图根据 URL 参数创建一个 ejs 条件 例如 如果测试参数存在于 localhost 3000 page test 则显示一个 div 否则不显示它 我的 ejs 模板看起来像这样 div class row div div div
  • 如何捕获事件调度线程 (EDT) 异常?

    我正在使用一个名为MyExceptionHandler实现Thread UncaughtExceptionHandler处理我的项目中的正常异常 据我了解 这个类无法捕获 EDT 异常 所以我尝试在main 处理EDT异常的方法 publi
  • jQuery 测试 element1 是否是 element2 的后代

    有谁知道一种好方法来测试存储在 var 中的一个元素是否是另一个也存储在 var 中的元素的后代 我不需要element1 isChildOf selector 这很容易 I need element1 isChildOf element2
  • 从 kafka-Spark-Streaming 读取数据时获取空集

    大家好 我是 Spark Streaming 的新手 我正在尝试读取 xml 文件并将其发送到 kafka 主题 这是我的 Kafka 代码 它将数据发送到 Kafka console consumer Code package org a
  • 结合模板和`ConfigParser`

    我有一个名为的模板文件foo cfg Box box active box activate resolution tracker active true box api key box api key box api secret box
  • PHP:通过 cronjob 发送电子邮件并设置每分钟发送的电子邮件量

    我有一个用于发送群组电子邮件的程序 我为此程序设置了每分钟一个玉米作业 并设置每 2 次 分钟执行一次 并检查现在的时间是否与我在数据库中定义的计划时间匹配 如果为 true 程序将运行并发送电子邮件 否则 nth 问题是我想动态设置用户每
  • Android数据绑定与Guava冲突导致ProGuard错误

    在启用 ProGuard 的情况下编译 Android 应用程序时 出现以下错误 Warning library class android databinding tool util SourceCodeEscapers 1 extend
  • Swift:生成(Swift)字符数组

    简单的问题 希望我正在尝试生成一个简单的字符数组 类似于 trying to do something like this pseudo code let letters Character map 0 lt 26 i in a i 并尝试
  • Django 中的cache.fetch?

    Django 缓存有类似Rails 的cache fetch 的方法吗 http api rubyonrails org classes ActiveSupport Cache Store html M001023 http api rub
  • 在 Objective-C 中,main 之前调用了什么?

    在 Objective C 中 main 之前调用了什么 例如 我假设 Objective C 中的所有元类都在 main 之前实例化 并且调用它们的加载 初始化方法 全局常量等 还有什么 这有记录在任何地方吗 A load作为应用程序中任
  • mail() 在新服务器上不起作用

    可能这是一个愚蠢的问题 但我找不到 php 邮件功能不起作用的原因 我在 debian squeeze 上有一个 nginx 服务器 我最近搬到了它 我尝试了简单的邮件执行 但它返回 false if mail email protecte
  • reinterpret_cast bug 还是 UB? [复制]

    这个问题在这里已经有答案了 考虑以下代码 include
  • Angular 6:无法正确设置http标头的Content-Type

    我正在尝试使用 Angular 6 中的 HttpHeader 进行后调用 并将 Content Type 设置为 application json 但服务器获取的是 x www form urlencoded 而不是 applicatio
  • ASP.Net MVC 中的 LDAP 身份验证

    我希望能够使用域用户 ID 和密码对用户进行身份验证 但默认的 ASP Net MVC 应用程序允许用户注册用户 ID 和密码然后登录 我该如何执行此操作 我不希望用户能够注册 但是 他应该能够输入他的 Windows 域用户 ID 和密码
  • 解包可选值 WKWebView 获取参数时意外发现 nil

    我在 WKWebView 上工作 当我加载没有像这样的参数的 url 时 它工作正常 func loadAddress lat Double lng Double let requestURL NSURL string http url c
  • python 装饰器 *args 和 ** kwargs

    我对编码是全新的 我一直在努力吸收尽可能多的东西 我不明白你们发布的很多技术解释 所以请尽量用简单的英语 我了解装饰器函数如何工作的机制 但我的问题是遵循代码逻辑 特别是为什么我们必须添加 args 和 kwargs 声明我们传递给带有参数