Case Insensitive Argparse Choices


Answer :

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.


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} 

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.


Comments

Popular posts from this blog

Chemistry - Bond Angles In NH3 And NCl3

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Change The Font Size Of Visual Studio Solution Explorer