我正在写一个装饰器,并且出于各种令人讨厌的原因[0],检查它正在包装的函数是单独定义还是作为类的一部分来定义(以及哪些类是新类是子类)。Python:装饰器可以确定一个函数是否正在类中定义?
例如:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
应打印:
<function foo …>: False
<function bar …>: True
另外,请注意:
- 在点装饰应用的功能将仍然是一个函数,而不是一个未绑定的方法,因此测试实例/未绑定方法(使用
typeof
或inspect
)将不会工作。 - 请只提供该解决这个问题的建议 - 我知道,有很多类似的方法来达到这个目的(例如,使用一个类装饰),但我想他们在装饰时有发生,不晚了。
[0]:具体来说,我在写一个装饰器,它可以很容易地用nose
进行参数化测试。但是,nose
将而不是在unittest.TestCase
的子类上运行测试生成器,所以我希望我的修饰器能够确定它是否在TestCase
的子类中使用,并失败并出现适当的错误。显而易见的解决方案 - 使用isinstance(self, TestCase)
调用包装的函数之前是不行的,因为包装的函数需要是一个发生器,它没有得到根本执行。
为了好奇,这里是结果:http://paste.pocoo.org/show/532430/ – 2012-01-09 20:23:52