gpt4 book ai didi

python - 点击类型转换

转载 作者:行者123 更新时间:2023-11-30 22:42:30 24 4
gpt4 key购买 nike

我使用 click 定义一个 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

它可以工作,但是围绕回调的逻辑有点尴尬。拆分列表和转换为日期时间都会中断点击的简单结构。有没有一种Python式的方法可以做到这一点?

最佳答案

您可以将丑陋的 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)

关于python - 点击类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42109398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com