オブジェクトを保存しようとするときにテストとして実行される関数がたくさんあるので、このメソッドをオブジェクトへの制約(テスト)として登録する方が便利な方法を作成します。
ソリューションでデコレータを使用することについて混乱しています。私がやろうとしていたこと:
- オブジェクトのメソッドにプロパティを追加するデコレータを作成します
- 制約としてマークしたいメソッドを装飾します。
- オブジェクトのすべてのメソッドをループし、フラグを持つすべてのメソッドを実行するために呼び出します
デコレータの使用は機能しませんが、自分でフラグを追加することはできます。
コードは次のとおりです。
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