当与 python 3.8 中引入的
choice
结合使用时,我遇到了 argparse
中的 action='extend'
的极端情况:
from argparse import ArgumentParser
parser = ArgumentParser('test')
parser.add_argument('-x', '--x', action='extend', choices=list('XYZ'), type=list)
parser.parse_args(['-x', 'XXYYZZ'])
我的期望(也许是愿望)是
['X', 'X', 'X', 'Y', 'Y', 'Z', 'Z']
的每个元素都根据choices
进行(成功)检查。相反,会打印以下错误消息:
usage: test [-h] [-x {X,Y,Z}]
test: error: argument -x/--x: invalid choice: ['X', 'X', 'Y', 'Y', 'Z', 'Z'] (choose from 'X', 'Y', 'Z')
有没有办法将
choices
应用于可迭代的每个元素,而不是整个元素? FWIW,如果我允许 action='extend'
的多个实例并使用 -x
代替,那么效果很好...action='append'
并将值 (
str
) 传递给参数,而不是单个组合字符串 "X", "Y", "Y", "Z"
这有效,
"XYYZ"
import argparse
parser = argparse.ArgumentParser('test')
parser.add_argument("-x", "--x", action="extend", nargs="+", type=str, choices=list('XYZ'))
parser.parse_args(["-x", "X", "Y", "Y", "Z"])