在尝试保存对象时,我有大量作为测试运行的函数,因此我创建了一种方法来更方便地将这些方法注册为对象的约束(测试)。
我对在我的解决方案中使用装饰器感到困惑。我打算做什么:
- 创建一个装饰器,将属性添加到对象中的方法
- 装饰我想要标记为约束的方法。
- 循环我的对象上的所有方法并调用以执行所有具有标志的方法
使用装饰器不起作用,但我自己添加标志可以。
这是代码:
from functools import wrap
def constraint(func):
@wraps(func)
def inner(*args, **kwargs):
func._is_constraint = True # Here after returning the function I add a flag
return func(*args, **kwargs)
return inner
class Record(object):
param1 = 100 # some defaults
param2 = 20
@constraint # This dont works
def check_test1(self):
if param1 < 0:
return 'No value less than zero'
# This works fine
def check_test2(self):
if param2 < 0:
return 'No value less than zero'
check_test2._is_constraint = True
def a_random_method(self):
print 'some random thing'
所以我正在尝试:
>>> rec = Record()
>>> rec.param1 = -100
>>> rec.param2 = -100
>>> for prop in dir(rec):
... if hasattr(getattr(rec, prop), '_is_constraint'):
... constraint = getattr(rec, prop)
... print prop, constraint()
...
'check_param2: No value less than zero'
>>>
看到 check_param1 没有被执行。
那么,我怎样才能使用装饰器让它工作呢?有可能吗?
我正在尝试在这种特殊情况下使用https://gist.github.com/mariocesar/4684561