Case insensitive argparse choices

 ̄綄美尐妖づ 提交于 2019-11-27 17:04:37

问题


Is it possible to check argparse choices in case-insensitive manner?

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

results in:

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

回答1:


Transform the argument into lowercase by using

type = str.lower

for the -p switch.

This solution was pointed out by chepner in a comment. The solution I proposed earlier was

type = lambda s : s.lower()

which is also valid, but it's simpler to just use str.lower.




回答2:


Using lower in the type is nice way of doing this, if you don't mind loosing the case information.

If you want to retain the case, you could define a custom choices class. The choices needs two methods, __contains__ (for testing in), and iteration (to list the choices).

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

The help is:

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

optional arguments:
  -h, --help        show this help message and exit
  -p {win64,win32}



回答3:


Keeping the case information would also be possible with a one liner:

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

Where choices would be the same list as passed to the choices parameter.



来源:https://stackoverflow.com/questions/27616778/case-insensitive-argparse-choices

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!