不区分大小写的argparse选项

Pet*_*ter 52 python case-insensitive argparse

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

import argparse
choices = ["win64", "win32"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "Win32"]))
Run Code Online (Sandbox Code Playgroud)

结果是:

usage: choices.py [-h] [-p {win64,win32}]
choices.py: error: argument -p: invalid choice: 'Win32' (choose from 'win64','win32')
Run Code Online (Sandbox Code Playgroud)

5go*_*der 71

使用将参数转换为小写

type = str.lower
Run Code Online (Sandbox Code Playgroud)

用于-p开关.

正如chepner在评论中所指出的那样,因为str.lower已经是一个合适的函数,所以不一定需要lambda包装器而你可以简单地使用它

type = lambda s : s.lower()
Run Code Online (Sandbox Code Playgroud)

直.

  • 你可以通过简单地使用`type = str.lower`来摆脱lambda,因为`str.lower`是一个接受字符串并以小写形式返回的函数. (19认同)
  • @Mark两个版本都不使用`string`模块中的弃用函数.注意,使用`str.lower`(没有`ing`),这是来自`str`类的方法,以'self`为唯一参数,这就是为什么这个技巧有效. (5认同)
  • 由于[string.lower(s)](https://docs.python.org/2/library/string.html#string.lower)_function_已被弃用并由[s.lower()](https: //docs.python.org/2/library/stdtypes.html#str.lower)_method_,我建议按照最初建议的方法使用lambda方法。 (3认同)

hpa*_*ulj 16

使用lowertype是这样做的,如果你不介意失去的情况下,信息的好方法.

如果要保留大小写,可以定义自定义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')
Run Code Online (Sandbox Code Playgroud)

帮助是:

usage: ipython [-h] [-p {win64,win32}]

optional arguments:
  -h, --help        show this help message and exit
  -p {win64,win32}
Run Code Online (Sandbox Code Playgroud)


Aka*_*ph7 10

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

parser.add_argument("-p", choices=choices, type=str.lower)
Run Code Online (Sandbox Code Playgroud)

这将确保输入是小写的。
确保不要在 后面添加括号lower


And*_*ter 5

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

type = lambda arg: {x.lower(): x for x in choices}[arg.lower()],
Run Code Online (Sandbox Code Playgroud)

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