【发布时间】:2012-02-06 06:31:36
【问题描述】:
我正在编写一个装饰器,由于各种烦人的原因[0],检查它所包装的函数是独立定义的还是作为类的一部分定义的(以及新类的哪些类是子类化)。
例如:
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) 不起作用,因为包装函数 需要 是一个生成器,它根本不会被执行 .
【问题讨论】:
-
对于好奇的人,结果如下:paste.pocoo.org/show/532430