Case insensitive argparse choices

前端 未结 3 1165
鱼传尺愫
鱼传尺愫 2020-12-15 02:35

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

import argparse
choices = [\"win64\", \"win32\"]
parser = argparse.ArgumentParser()
pars         


        
相关标签:
3条回答
  • 2020-12-15 02:47

    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.

    0 讨论(0)
  • 2020-12-15 02:54

    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}
    
    0 讨论(0)
  • 2020-12-15 02:59

    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.

    0 讨论(0)
提交回复
热议问题