当使用argparse时,我希望用户可以从"choices"中选择,但是我希望他们的选择能够确定一个更复杂的值(类似于"store_const"的工作方式)。
例如,当从"smoker"状态中选择"['current', 'former', 'never']"时,我希望"current"映射到"Current every day smoker."。
有没有一种优雅的方法来实现这个功能?
我以为可以使用lambda类型参数来实现,但是argparse强制执行选择列表:
例如,当从"smoker"状态中选择"['current', 'former', 'never']"时,我希望"current"映射到"Current every day smoker."。
有没有一种优雅的方法来实现这个功能?
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--smoker', choices=['current','former','never'])
print(vars(parser.parse_args()))
正常输出:
$ ./script.py --smoker current
{'smoker': 'current'}
希望达成的目标:
$ ./script.py --smoker current
{'smoker': 'Current every day smoker.'}
我以为可以使用lambda类型参数来实现,但是argparse强制执行选择列表:
choice_dict = {'current': 'Current everyday...'}
parser.add_argument('--smoker', type=lambda x: choice_dict[x], choices=choice_dict.keys())
print(vars(parser.parse_args()))
./script.py --smoker current
usage: script.py [-h] [--smoker {current}]
script.py: error: argument --smoker: invalid choice: 'Current everyday...' (choose from 'current')
type
中进行转换,而不需要使用choices
。但是你将无法获得help
,并且可能需要调整错误类。 - hpaulj