タグに基づいて関数を有効または無効にするために、関数タグ付けシステムを作成しています。
def do_nothing(*args, **kwargs): pass
class Selector(set):
def tag(self, tag):
def decorator(func):
if tag in self:
return func
else:
return do_nothing
return decorator
selector = Selector(['a'])
@selector.tag('a')
def foo1():
print "I am called"
@selector.tag('b')
def foo2():
print "I am not called"
@selector.tag('a')
@selector.tag('b')
def foo3():
print "I want to be called, but I won't be"
foo1() #Prints "I am called"
foo2() #Does nothing
foo3() #Does nothing, even though it is tagged with 'a'
私の質問は、最後の関数foo3についてです。なぜ呼ばれていないのか理解しています。セレクターにタグが存在する場合に呼び出されるようにする方法があるかどうか疑問に思いました。理想的には、このソリューションでは、関数が呼び出されるたびにではなく、タグが1回だけチェックされるようになっています。
補足:単体テストの環境変数に基づいて実行するテストを選択するためにこれを行っていますunittest
。私の実際の実装ではを使用していunittest.skip
ます。
編集:デコレータリターンを追加しました。