根据Python中的条件应用两个装饰器中的一个

时间:2013-08-23 02:34:45

标签: python decorator

我想做点什么

if a:
  dec = decorator_1
else:
  dec = decorator_2

@dec
def foo():
  pass

可能?

2 个答案:

答案 0 :(得分:1)

是的,只要在函数定义之前评估if语句和赋值。

例如,您上面编写的代码可以使用,但以下内容不会:

def bar():
  global dec
  if a:
    dec = decorator_1
  else:
    dec = decorator_2

@dec
def foo():
  pass

bar()

答案 1 :(得分:1)

你有什么工作,但我建议以不同的方式实施它:

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'