不区分大小写的argparse选项

时间:2014-12-23 08:39:10

标签: python argparse case-insensitive

是否可以以不区分大小写的方式检查argparse choices

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')

3 个答案:

答案 0 :(得分:58)

使用

将参数转换为小写
type = lambda s : s.lower()

用于-p切换。

正如chepner在评论中指出的那样,由于str.lower已经是一个合适的函数,因此不一定需要lambda包装器,而只需使用

type = str.lower

直接

答案 1 :(得分:14)

如果你不介意丢失案例信息,那么在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}

答案 2 :(得分:0)

使用一根衬垫也可以保留案例信息:

type = lambda arg: {x.lower(): x for x in choices}[arg.lower()],

其中选项与传递给choices参数的列表相同。