我想做一些类似的事情
if a:
dec = decorator_1
else:
dec = decorator_2
@dec
def foo():
pass
可能吗?
是,只要if
语句和赋值是在函数定义之前求值的。
例如,上面写的代码可以工作,但下面的代码不行:
def bar():
global dec
if a:
dec = decorator_1
else:
dec = decorator_2
@dec
def foo():
pass
bar()
您所拥有的将起作用,但我建议以不同的方式实现它:
def dec(f):
return decorator_1(f) if a else decorator_2(f)
@dec
def foo():
print 'foo'
因为这在没有条件定义的情况下也是一样的。更进一步,可以这样定义一种更干净的方法,避免引用全局变量:
def dec(a):
return decorator_1 if a else decorator_2
@dec(a)
def foo():
print 'foo'