如何使用 python-decorator 包来装饰类方法?

2024-04-21

我有一个装饰器,我想用它来装饰类方法。在下面的示例中,@mydec 装饰器本身可以正常工作,但是在使用 help() 或 pydoc 时它不会保留函数签名。为了解决这个问题,我研究了使用 @decorator python-decorator 包:

import functools
import decorator


@decorator.decorator
def mydec(func):
    @functools.wraps(func)
    def inner(cls, *args, **kwargs):
        # do some stuff
        return func(cls, *args, **kwargs)
    return inner


class Foo(object):
    @classmethod
    @mydec
    def bar(cls, baz='test', qux=None):
        print (baz, qux)


Foo.bar()

不幸的是,这会导致以下异常:

Traceback (most recent call last):
  File "/tmp/test.py", line 21, in <module>
    Foo.bar()
  File "<string>", line 2, in bar
TypeError: mydec() takes exactly 1 argument (4 given)

您不再需要提供自己的包装器,只需使用@decorator.decorator on the inner函数,它需要一个额外的第一个位置参数,该函数被包装:

@decorator.decorator
def mydec(func, cls, *args, **kwargs):
    # do some stuff
    return func(cls, *args, **kwargs)

The decoratorpackage 不使用装饰器的闭包,而是将包装的函数作为参数传递。

Demo:

>>> @decorator.decorator
... def mydec(func, cls, *args, **kwargs):
...     # do some stuff
...     return func(cls, *args, **kwargs)
... 
>>> class Foo(object):
...     @classmethod
...     @mydec
...     def bar(cls, baz='test', qux=None):
...         print (baz, qux)
... 
>>> Foo.bar()
('test', None)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 python-decorator 包来装饰类方法? 的相关文章

随机推荐

  • 如何包装文件对象的读写操作(只读)?

    我试图包装文件对象实例的读写操作 特别是readline and write 方法 通常 我会简单地用包装器替换这些函数 有点像这样 def log stream def logwrite write def inner data prin
  • 如何以编程方式改进破解替换密码?

    我已经编写 正在编写 一个程序来分析加密文本 并尝试使用频率分析来分析和破解它 加密文本采用每个字母替换其他字母的形式 即 a gt m b gt z c gt t 等 所有空格和非字母字符均被删除 大写字母变为小写 一个例子是 原始输入
  • decodeURIComponent 与 unescape,unescape 有什么问题?

    在回答另一个问题时 我意识到我的 Javascript DOM 知识已经有点过时了 因为我仍在使用escape unescape对 URL 组件的内容进行编码 而看起来我现在应该使用encodeURIComponent decodeURIC
  • 使用 python-pandas 索引数据帧时无法获得非唯一标签的正确切片绑定

    我有这样一个数据框df a b 10 2 3 1 0 0 0 4 about 50 000 rows 我希望选择df 5 a 但是当我打电话时df loc 5 a 我得到一个错误 KeyError Cannot get right slic
  • Java 不可变类规则

    下面的类是不可变的吗 final class MyClass private final int array public MyClass int array this array array 不 这不是因为数组的元素仍然可以更改 int
  • 如何用帖子标题 slug 重写 url?

    考虑一个网址 www example com paper ads details php req 43397 rnd 1308546000 我想将此网址更改为 www example com jobs in chanai php where
  • 更改 Eclipse 启动配置中的默认“要运行的程序”

    我时不时地使用以下命令从 Eclipse 中启动 JUnit 测试 运行方式 gt JUnit 插件测试 默认情况下 Eclipse 假设您正在运行需要工作台的东西 并在启动配置的 Main 部分中进行选择 LaunchConfig gt
  • 如何减少 Selenium 中 NoSuchElementException 的等待时间?

    在某些情况下 我知道元素不会显示 但它等待了约 30 秒 如何减少等待时间NoSuchElementException硒 示例代码 String name try name driver findElement By xpath XPath
  • Qt Ui 命名空间

    命名空间有什么意义Ui这是Qt自动生成的吗 这两个命名空间相同吗 在第一个中 其中包含 MainWindow 类的前向声明ui MainWindow h为什么它没有声明为class Ui MainWindow 编译器如何知道 MainWin
  • ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: 错误: 表上的更新或删除违反了外键约束

    有一个非常相似的问题SO https stackoverflow com questions 47624334 error update or delete on table users violates foreign key const
  • 模板中带有参数的函数。姜戈

    在我的模板中 我显示用户关注的用户列表 我希望用户能够通过按钮删除他关注的用户之一 我有一个删除关系的函数remove relationship 这是我的 models py 中的函数 class UserProfile models Mo
  • 写入 Core Data 时创建新对象

    我有一个具有一些表单字段的应用程序 提交表单后 它将数据写入我的核心数据对象 但是 当再次提交表单时 它会覆盖现有数据而不是附加到它 这正是我想要发生的情况 guard let appDelegate UIApplication share
  • php 和 simpleXml - 如何更改节点内容

    我正在尝试使用 simpleXML 更改 XML 文件中节点的内容 我知道新节点内容的变量包含正确的内容 但由于某种原因 文件在保存时没有更改 我可能缺少一些基本的东西 因为我是 simpleXML 的新手 这是整个 php 脚本
  • Android 删除接近警报

    我正在开发处理接近警报的应用程序 我可以添加接近警报 但无法删除这些接近警报 我已经在手机和虚拟设备上尝试过我的代码 但无法删除它们 这是我的代码 将位置保存到数据库并添加接近警报的活动 saveButton setOnClickListe
  • 如何处理同时碰撞以使处理顺序无关紧要?

    假设有3个球同时碰撞 我发现解决冲突的顺序会对最终结果产生影响 这当然没有意义 为了解释和简单起见 考虑 1D 中的 3 个球 质量相同 弹性碰撞 顶部的数字是速度 箭头是方向 假设它们当前都互相接触 即发生碰撞 gt 2 gt 1 lt
  • Pydev 中的 Django 会产生多个进程?

    我在 Eclipse 中的 PyDev 中设置了我的项目 每当我调试我的项目时 一切都很顺利 但是一旦我尝试重新启动 Django 服务器 它就会生成一个额外的 runserver 进程 阻塞我用于服务器的端口 8000 有没有解决方法可以
  • Nginx 位置“不等于”正则表达式

    我该如何设置locationNginx 中的条件是否响应任何不等于列出的位置 I tried location dir1 file2 php rewrite http example com 1 permanent 但它不会触发重定向 它只
  • Rails:如何为 ruby​​ 模块编写测试?

    我想知道如何为混合到几个类中的模块编写单元测试 但不太知道如何去做 我是否通过在包含它们的类的测试文件之一中编写测试来测试实例方法 似乎不正确 或者您可以以某种方式将所包含方法的测试保留在特定于模块的单独文件中吗 同样的问题也适用于类方法
  • VBO - 没有指数化的指数化

    我正在尝试将 VBO 与元素数组缓冲区一起用于我的三角形 如下所示 glBindBuffer GL ARRAY BUFFER g Buffer 0 glVertexPointer 3 GL FLOAT 0 BUFFER OFFSET 0 g
  • 如何使用 python-decorator 包来装饰类方法?

    我有一个装饰器 我想用它来装饰类方法 在下面的示例中 mydec 装饰器本身可以正常工作 但是在使用 help 或 pydoc 时它不会保留函数签名 为了解决这个问题 我研究了使用 decorator python decorator 包