inspect.ismethod()为装饰器中的实例方法返回false

时间:2018-06-15 20:51:07

标签: python python-decorators

我试图使用inspect.ismethod()来检测函数是实例方法还是python装饰器中的模块级函数。它返回false。是什么原因?如何检测函数是实例方法还是装饰器内的模块级函数,如下所示。

示例:

import inspect
class A(object):
  @deco("somearg")
  def sample(self):
      print "abc"

a = A()
print inspect.ismethod(a.sample) # Returns True

以上打印返回true。

我的装饰师就像下面这样。我需要在实际代码中将参数传递给decorator,以便它在函数内部:

def deco(some_arg=None):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print some_arg
            print inspect.ismethod(func)
        return wrapper
    return decorator

上面的inspect.ismethod()返回false。

我的python版本是2.7.13

1 个答案:

答案 0 :(得分:1)

  

请注意,从函数对象转换为(未绑定或   每次从中检索属性时都会发生方法对象   班级或实例。

你正在装饰的是一种功能。嵌套在类中的函数仍然是函数。当您从类或类的实例访问函数时,它将分类为方法。

您可以从self中的wrapper参数访问方法对象:

def deco(some_arg=None):
    def decorator(func):
        def wrapper(*args, **kwargs):
            print some_arg
            print inspect.ismethod(args[0].sample) 
        return wrapper
    return decorator