解析装饰器中的 args 和 kwargs

2024-03-19

我有一个需要 args 和 kwargs 的函数,我需要根据 args 和 kwargs 的值在我的装饰器中做一些事情2nd函数中的arg,如下面的代码所示:

def workaround_func():
    def decorator(fn):
        def case_decorator(*args, **kwargs):
            if args[1] == 2:
                print('The second argument is a 2!')
            return fn(*args, **kwargs)
        return case_decorator
    return decorator

@workaround_func()
def my_func(arg1, arg2, kwarg1=None):
    print('arg1: {} arg2: {}, kwargs: {}'.format(arg1, arg2, kwarg1))

问题是 python 允许用户使用第二个参数作为常规参数或关键字参数来调用函数,因此如果用户调用my_func with arg2作为一个 kwarg,它提出了IndexError, 见下文:

In [8]: d.my_func(1, 2, kwarg1=3)
The second argument is a 2!
arg1: 1 arg2: 2, kwargs: 3

In [9]: d.my_func(1, arg2=2, kwarg1=3)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-9-87dc89222a9e> in <module>()
----> 1 d.my_func(1, arg2=2, kwarg1=3)

/home/camsparr/decoratorargs.py in case_decorator(*args, **kwargs)
      2     def decorator(fn):
      3         def case_decorator(*args, **kwargs):
----> 4             if args[1] == 2:
      5                 print('The second argument is a 2!')
      6             return fn(*args, **kwargs)

IndexError: tuple index out of range

有没有办法解决这个问题而不只是做try/except并抓住IndexError?


我使用 python 找到了答案decorator https://github.com/micheles/decorator包裹。该包的一个功能是,无论用户如何传递位置/关键字参数,它都会保留它们。它的额外好处是减少了大量代码,所以我的原始代码:

def workaround_func():
    def decorator(fn):
        def case_decorator(*args, **kwargs):
            if args[1] == 2:
                print('The second argument is a 2!')
            return fn(*args, **kwargs)
        return case_decorator
    return decorator

@workaround_func()
def my_func(arg1, arg2, kwarg1=None):
    print('arg1: {} arg2: {}, kwargs: {}'.format(arg1, arg2, kwarg1))

becomes:

from decorator import decorator

@decorator
def workaround_decorator(f, *args, **kwargs):
    if args[1] == 2:
        print('The second argument is 2!')
    return f(*args, **kwargs)

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

解析装饰器中的 args 和 kwargs 的相关文章

随机推荐

  • 在双屏环境上运行应用程序[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中找到应用程序正在哪个屏幕上运行 https stackoverflow com questions 549751 how do i find what screen the applic
  • 模拟用户脚本中的 Enter 键 tampermonkey [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个用户脚本 在类名 chat input 的输入标记中键入一些内容并按 Enter 键 到目前为止 用户脚本仅键入 Hello 在聊天输入中 但不模拟回车键 知道为什么吗 var msg Hell
  • 将文本和容器置于圆圈内

    我这里有一个 Bootply http www bootply com XLGE6Vpjov http www bootply com XLGE6Vpjov 我需要将 3 个圆圈置于容器中 然后将其中的文本水平和垂直居中 如何使文本垂直居中
  • 获取模型或控制器中消化的 asset_path

    我有一个Article模型 它有一个字段svg path I use fabricjs绘制可以包含多篇文章且可修改的画布 我目前所做的是生成一个json包含文章的所有必需字段 包括svg path 当我尝试使用asset path帮手 ht
  • 如何使用 python boto3 将 s3 对象从一个存储桶复制到另一个存储桶

    我想将文件从一个 s3 存储桶复制到另一个 我收到以下错误 s3 meta client copy 源 目标 类型错误 copy 至少需要 4 个参数 给定 3 个 我无法通过阅读文档找到解决方案 这是我的代码 usr bin env py
  • madvise() 中 MADV_USERFAULT 标志的状态是什么?

    已经有一些讨论在 madvise 中使用新标志来告诉内核不要处理某些内存范围内的页面错误 lwn net 1 https lwn net Articles 615086 lwn net 2 https lwn net Articles 54
  • Google Drive SDK iOS 示例

    我按照Google Drive sdk的iOS示例教程中的步骤进行操作 https developers google com drive ios quickstart https developers google com drive i
  • paxos 与 raft 进行领导者选举

    读完paxos和raft paper后 我有以下困惑 paxos论文仅描述了单个日志条目的共识 相当于raft算法中的领导者选举部分 在raft的leader选举中 paxos的方式相对于简单的随机超时方式有什么优势呢 一个常见的误解是原始
  • 在 Eclipse 控制台中对日志进行着色

    有没有办法在 Eclipse 控制台中对部分日志进行着色 我知道我可以发送到错误和标准流并对它们进行不同的着色 但我更喜欢在 ANSI 转义代码 或任何其他 HTML 行中查找一些内容 我可以在字符串中嵌入颜色以使其在字符串中着色日志 它肯
  • 强制表单文本为小写

    我如何强制 用户名 文本中的文本input无论用户类型如何都小写 div class register div
  • 当区域控制器加载时,为什么我的 BaseController.User 值 == null ? [复制]

    这个问题在这里已经有答案了 我正在编写一个 Asp Net 核心应用程序 并且在获得导航访问权限之前让用户通过 Google 进行身份验证 当用户导航到我的 WorldBuilder 区域并点击 WorldController 时 Base
  • 两个具有相同名称和不同私钥的 iOS 分发证书的问题[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们有两个 iOS 发行版证书 我在签名时遇到一些问题 因为两个分发证书具有相同的名称 如果我添加两个证书并尝试使用其中一个证书进行签名
  • sqlite 选择日期条件

    我有一个带有出生日期的 sqlite 表 我想执行一个查询来选择年龄超过 30 岁的记录 我已经尝试过以下方法 但它不起作用 select from mytable where dob gt 1 Jan 1980 select from m
  • Django Rest Framework 在序列化之前更新数据

    我希望任何用户都可以使用我的 RESTful API 创建自己的产品 为此 我创建了一个继承ListCreateAPIView的视图 问题是用户应该只创建他 她拥有的产品 因此当创建 Product 模型的实例时 我希望字段 Owner 对
  • 如何为iMessage Sticker App网格贴纸提供不同尺寸

    我创建了一个 iOS iMessage 贴纸应用程序 根据苹果文档 我应该能够以三种不同尺寸之一显示贴纸 但是 无论我将贴纸图像设置为什么尺寸 300px x 300px 408px x 408px 618px x 618px 它们仅显示为
  • Golang 中的函数声明

    在 Golang 中声明函数似乎有两种不同的方式 如下所示 package main import fmt var someFunc func arg string fmt Println arg func main someFunc He
  • 如何在 ruby​​ 中进行 base58 编码?

    我正在尝试编码原型股 http protoshares net 原始格式的钱包地址 如中所述Bitcoin https en bitcoin it wiki Technical background of Bitcoin addresses
  • Jupyter 和 Common Lisp

    我正在尝试安装cl jupyter https github com fredokun cl jupyter common lisp 内核Jupyter http jupyter org 我无法让它工作 当我打开一个新的 lisp 笔记本
  • 如何将文本框中的日期插入数据库

    请帮助我将日期从文本框中以 dd mm yyyy 格式插入到 SQL Server 我的代码如下 int prio Convert ToInt32 Priority Text string stdate planstart Text str
  • 解析装饰器中的 args 和 kwargs

    我有一个需要 args 和 kwargs 的函数 我需要根据 args 和 kwargs 的值在我的装饰器中做一些事情2nd函数中的arg 如下面的代码所示 def workaround func def decorator fn def