不区分大小写的argparse选择

问题描述 投票:0回答:4

是否可以以不区分大小写的方式检查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')
python argparse case-insensitive
4个回答
147
投票

使用以下方法将参数转换为小写字母

type=str.lower

对于

-p
开关,即

parser.add_argument("-p", choices=choices, type=str.lower)

这个解决方案是由chepner评论中指出的。我之前提出的解决方案是

type=lambda s: s.lower()

这也是有效的,但使用

str.lower
更简单。


20
投票

如果您不介意丢失案例信息,那么在

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}

10
投票

为了澄清@5gon12eder的答案,您需要将“类型”作为另一个参数包含到

add_argument

parser.add_argument("-p", choices=choices, type=str.lower)

这将确保输入是小写的。
确保不要在

lower
之后添加括号。


5
投票

也可以使用单行保存案例信息:

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

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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.