2016-11-23 3 views
0

Ich schreibe ein Werkzeug mit Python 2 und click die liest/schreibt Register in Hardware. Ich habe zwei Funktionen, die genau die gleichen Optionen akzeptieren. Der Unterschied besteht darin, dass sie Eingaben verarbeiten und direkt an andere Geräte ausgeben. Hiergenau die gleichen Optionen für 2 verschiedene Funktionen in Python klicken

ist das, was ich bisher:

@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') 

Beide Funktionen werden Eingaben in der gleichen Art und Weise handhaben, der einzige Unterschied besteht darin, dass sie behandelt Informationen an verschiedene Geräte weitergibt. Mit anderen Worten, was ich gerne hätte:

@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 

Ist das möglich?

Antwort

1

sicher.

@decorator 
def f(): 
    pass 

bedeutet

def f(): 
    pass 
f = decorator(f) 

so:

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') 

ohne Lambda:

def common_decorator(f): 
    return decorator0(decorator1(decorator2(decorator3(f)))) 
+0

Gibt es eine Möglichkeit, es ohne 'lambda' zu tun? – flashburn

+1

natürlich ist das Lambda-Ding nur Syntaxzucker –

+0

Würde es Ihnen etwas ausmachen, mir zu zeigen, wie? Ich war mehrere Stunden dabei und kann es immer noch nicht herausfinden. – flashburn

Verwandte Themen