2017-02-08 13 views
1

私はclickを使用して、datetimeとカンマで区切られたパラメータのリストを取るCLIを定義しています。クリック型変換

import click 

def valid_date(s): 
    try: 
     return dt.strptime(s, "%Y-%m-%d") 
    except ValueError: 
     msg = "Not a valid date: '{0}'.".format(s) 
     raise Exception(msg) 
    except TypeError: 
     return None 

split_parameter = lambda _, __, s: s.split(",") 
check_date = lambda _, __, s: valid_date(s) 


@click.command() 
@click.argument('symbols', callback=split_parameter) 
@click.option('--start_date', callback=check_date) 
@click.option('--end_date', callback=check_date) 
@click.option('--file_name') 
def f(symbols, start_date, end_date, file_name): 
    return None 

それは動作しますが、callbackの周りのロジックは少し厄介です。リストを分割してdatetimeに変換すると、クリックの素朴な構造が中断されます。これを行うためのpythonicの方法はありますか?

答えて

2

あなたはデコレータで醜いlambda _, __, x一部カプセル化することができます:

import click 
from datetime import datetime as dt 

def click_callback(f): 
    return lambda _, __, x: f(x) 

def check_date(s): 
    try: 
     return dt.strptime(s, "%Y-%m-%d") 
    except ValueError: 
     msg = "Not a valid date: '{0}'.".format(s) 
     raise Exception(msg) 
    except TypeError: 
     return None 

@click.command() 
@click.argument('symbols', callback=click_callback(lambda s: s.split(','))) 
@click.option('--start_date', callback=click_callback(check_date)) 
@click.option('--end_date', callback=click_callback(check_date)) 
@click.option('--file_name') 
def f(symbols, start_date, end_date, file_name): 
    print(symbols, start_date, end_date, file_name) 

if __name__ == '__main__': 
    f() 

またはこのような(関連部分のみが示されている):

def click_callback(f): 
    return {'callback': lambda _, __, x: f(x)} 

@click.command()   # vvvvvvvvvvvvvvvv 
@click.argument('symbols', **click_callback(lambda s: s.split(','))) 
@click.option('--start_date', **click_callback(check_date)) 
@click.option('--end_date', **click_callback(check_date)) 
@click.option('--file_name') 
def f(symbols, start_date, end_date, file_name): 
    print(symbols, start_date, end_date, file_name)