如何用一个python装饰器替换多个python装饰器?

如何用一个python装饰器替换多个python装饰器?,python,Python,我有许多使用相同装饰器的函数。有没有一种方法可以将所有函数放在一个函数中,然后在所有函数中应用一个函数?我花了一些时间,但我已经找到了答案。以下是一个例子: import click @click.group() def cli(): pass @cli.command() @click.option('--number', help='Integer number') @click.option('--letter', help='Single character') def show

我有许多使用相同装饰器的函数。有没有一种方法可以将所有函数放在一个函数中,然后在所有函数中应用一个函数?

我花了一些时间,但我已经找到了答案。以下是一个例子:

import click

@click.group()
def cli():
  pass

@cli.command()
@click.option('--number', help='Integer number')
@click.option('--letter', help='Single character')
def show(number, letter):
  print "number {} and letter {}".format(number, letter)

@cli.command()
@click.option('--number', help='Integer number')
@click.option('--letter', help='Single character')
def flip(number, letter):
  print "flipped number {} and letter {}".format(-int(number), letter.swapcase())

if __name__ == '__main__':
    cli()
您可以使用一个装饰器装饰所有命令,该装饰器将应用所有其他命令,如下所示:

import click, functools

def the_one(f):
  @cli.command()
  @click.option('--number', help='Integer number')
  @click.option('--letter', help='Single character')
  @functools.wraps(f)
  def wrapper(*args, **kwds):
    return f(*args, **kwds)
  return wrapper

@click.group()
def cli():
  pass

@the_one
def show(number, letter):
  print "number {} and letter {}".format(number, letter)

@the_one
def flip(number, letter):
  print "flipped number {} and letter {}".format(-int(number), letter.swapcase())

if __name__ == '__main__':
    cli()
这就是它的作用:

$ python example.py flip --number 2 --letter B
flipped number -2 and letter b

我花了一段时间,但我已经弄明白了。以下是一个例子:

import click

@click.group()
def cli():
  pass

@cli.command()
@click.option('--number', help='Integer number')
@click.option('--letter', help='Single character')
def show(number, letter):
  print "number {} and letter {}".format(number, letter)

@cli.command()
@click.option('--number', help='Integer number')
@click.option('--letter', help='Single character')
def flip(number, letter):
  print "flipped number {} and letter {}".format(-int(number), letter.swapcase())

if __name__ == '__main__':
    cli()
您可以使用一个装饰器装饰所有命令,该装饰器将应用所有其他命令,如下所示:

import click, functools

def the_one(f):
  @cli.command()
  @click.option('--number', help='Integer number')
  @click.option('--letter', help='Single character')
  @functools.wraps(f)
  def wrapper(*args, **kwds):
    return f(*args, **kwds)
  return wrapper

@click.group()
def cli():
  pass

@the_one
def show(number, letter):
  print "number {} and letter {}".format(number, letter)

@the_one
def flip(number, letter):
  print "flipped number {} and letter {}".format(-int(number), letter.swapcase())

if __name__ == '__main__':
    cli()
这就是它的作用:

$ python example.py flip --number 2 --letter B
flipped number -2 and letter b
这是一个复制品这是一个复制品