完全相同的选项,为python中的2个不同的功能点击

问题描述:

我正在写一个工具,使用Python 2click读取/写入硬件寄存器。我有两个接受完全相同选项的函数。不同的是他们处理输入和直接输出到不同的设备。完全相同的选项,为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)))) 
+0

有没有办法做到这一点没有'lambda'? – flashburn

+1

当然,lambda的事情只是syntaxic糖 –

+0

你介意告诉我怎么做?我已经呆了好几个小时,但仍然无法弄清楚。 – flashburn