不区分大小写的 argparse 选择

新手上路,请多包涵

是否可以以不区分大小写的方式检查 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')

原文由 Peter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

通过使用将参数转换为小写

type = str.lower

对于 -p 开关。

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

type = lambda s : s.lower()

这也是有效的,但使用 str.lower 更简单。

原文由 5gon12eder 发布,翻译遵循 CC BY-SA 4.0 许可协议

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}

原文由 hpaulj 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题