【问题标题】:How to test if a decorator is decorating a method or a function?如何测试装饰器是否在装饰方法或函数?
【发布时间】:2020-08-17 17:06:45
【问题描述】:

我只是想知道装饰器如何知道它正在装饰的函数是方法、函数、静态方法还是类方法?在装饰器中区分这四种不同类型的最可靠方法是什么?

【问题讨论】:

  • 方法是函数。但是,staticmethod 和 classmethod 是这些各自类的实例。
  • 但我认为有一种方法可以区分方法和函数? @juanpa.arrivillaga
  • @BobFang 不,没有办法。理论上,您可以在类之外定义一个函数,并在类定义之后将其作为方法分配给该类。

标签: python python-decorators


【解决方案1】:

这是一个使用__qualname__解决您的问题的代码:

def callable_type(callable):
    what = type(callable).__name__
    name = callable.__qualname__
    if what == "function" and "." in name:
        return "method"
    elif what == "function":
        return "function"
    elif what == "type":
        return "class"

这很hacky,但在大多数情况下都有效。

【讨论】:

  • 这对于嵌套函数和 __qualname__ 具有 . 而函数不是方法的其他情况(或 __qualname__ 尽管是方法但没有 . 的情况,例如作为在类外部定义然后附加到类的方法)。
  • 对于元类不是type 的类也会失败。例如,任何抽象类都会有一个非type 元类(通常是abc.ABCMeta),从而导致what != "type"
猜你喜欢
  • 2017-08-27
  • 2013-10-19
  • 2011-12-20
  • 2021-01-20
  • 2018-01-12
  • 2021-04-19
  • 2017-08-20
  • 2020-01-11
  • 2012-04-05
相关资源
最近更新 更多