2017-02-08 4 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으로 변환하면 클릭의 멋진 간단한 구조가 중단됩니다. 이것을하기위한 파이썬적인 방법이 있습니까?

답변

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)