我正在创建一个功能标记系统,以启用或禁用基于标签的功能:
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。我明白为什么它没有被调用。我想知道是否有办法让它在选择器中存在任何标签时被调用。理想情况下,该解决方案使得标签只检查一次,而不是每次调用函数时。
附注:我这样做是为了根据unittest
单元测试中的环境变量选择要运行的测试。我的实际实现使用unittest.skip
.
编辑:添加了装饰器返回。