簡體   English   中英

如何使用python-decorator包來裝飾classmethods?

[英]How do I use the python-decorator package to decorate classmethods?

我有一個裝飾器,我想用來裝飾類方法。 在下面的示例中,@ 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 ,它需要一個額外的第一個位置參數,函數包裝:

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

decorator包不使用裝飾器的閉包,而是將包裝函數作為參數傳遞。

演示:

>>> @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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM