2016-11-23 6 views
0

Я пишу инструмент, используя Python 2 и click, который считывает/записывает регистры на аппаратном уровне. У меня есть две функции, которые принимают точно такие же параметры. Разница заключается в том, что они обрабатывают ввод и прямой вывод на разные устройства.точно такие же опции для 2-х различных функций в python нажмите

Вот то, что я до сих пор:

@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 

Возможно ли это?

ответ

1

уверен.

@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

, конечно, лямбда вещь только синтаксический сахар –

+0

Не могли бы вы показать мне, как? Я был на нем несколько часов и до сих пор не могу понять. – flashburn