根据Python中的一个条件应用两个decorator中的一种



我想做一些类似的事情

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'

最新更新