是否可以以不区分大小写的方式检查argparse选项?
import argparse
choices = ["win64", "win32"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "Win32"]))
结果:
usage: choices.py [-h] [-p {win64,win32}]
choices.py: error: argument -p: invalid choice: 'Win32' (choose from 'win64','win32')
如果您不介意丢失案例信息,那么在
lower
中使用 type
是一个很好的方法。
如果您想保留大小写,您可以定义自定义
choices
类。 choices
需要两种方法,__contains__
(用于测试in
)和迭代(列出选择)。
class mylist(list):
# list subclass that uses lower() when testing for 'in'
def __contains__(self, other):
return super(mylist,self).__contains__(other.lower())
choices=mylist(['win64','win32'])
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "Win32"]))
# Namespace(p='Win32')
帮助是:
usage: ipython [-h] [-p {win64,win32}]
optional arguments:
-h, --help show this help message and exit
-p {win64,win32}
为了澄清@5gon12eder的答案,您需要将“类型”作为另一个参数包含到
add_argument
:
parser.add_argument("-p", choices=choices, type=str.lower)
这将确保输入是小写的。
确保不要在
lower
之后添加括号。
也可以使用单行保存案例信息:
type = lambda arg: {x.lower(): x for x in choices}[arg.lower()],
其中选项将与传递给选项参数的列表相同。