完全相同的选项,为python中的2个不同的功能点击
问题描述:
我正在写一个工具,使用Python 2和click读取/写入硬件寄存器。我有两个接受完全相同选项的函数。不同的是他们处理输入和直接输出到不同的设备。完全相同的选项,为python中的2个不同的功能点击
这是我到目前为止有:
@cli.command()
@click.option('--r0', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
@click.option('--r1', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
@click.option('--r2', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
def mydevice1(r0, r1, r2):
# Handle inputs for device 1
click.echo('myfunc1')
@cli.command()
@click.option('--r0', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
@click.option('--r1', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
@click.option('--r2', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
def mydevice2(r0, r1, r2):
# Handle inputs for device 2
click.echo('myfunc2')
的功能会以同样的方式处理输入两种,唯一的区别是,他们将经过处理的信息,以不同的设备。换句话说,我想要的是
@click.option('--r0', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
@click.option('--r1', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
@click.option('--r2', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
def handle_common_options(r0, r1, r2):
# Handle common options
pass
@cli.command()
def mydevice1():
handle_common_options()
# pass processed options to device 1
@cli.command()
def mydevice2():
handle_common_options()
# pass processed options to device 2
这可能吗?
答
当然。
@decorator
def f():
pass
意味着
def f():
pass
f = decorator(f)
这样:
decorator0 = cli.command()
decorator1 = click.option('--r0', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
decorator2 = click.option('--r1', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
decorator3 = click.option('--r2', type=click.IntRange(-2, 0xffffffff, clamp=False), default=-2)
common_decorator = lambda f: decorator0(decorator1(decorator2(decorator3(f))))
@common_decorator
def mydevice1(r0, r1, r2):
click.echo('myfunc1')
@common_decorator
def mydevice2(r0, r1, r2):
click.echo('myfunc2')
没有拉姆达:
def common_decorator(f):
return decorator0(decorator1(decorator2(decorator3(f))))
有没有办法做到这一点没有'lambda'? – flashburn
当然,lambda的事情只是syntaxic糖 –
你介意告诉我怎么做?我已经呆了好几个小时,但仍然无法弄清楚。 – flashburn