Hoofdletterongevoelige argparse-keuzes

Is het mogelijk om argparse-keuzeshoofdletterongevoelig te controleren?

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

resulteert in:

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

Antwoord 1, autoriteit 100%

Transformeer het argument in kleine letters met behulp van

type = str.lower

voor de -pschakelaar.

Op deze oplossing werd gewezen door chepnerin een commentaar. De oplossing die ik eerder voorstelde was

type = lambda s : s.lower()

wat ook geldig is, maar het is eenvoudiger om gewoon str.lowerte gebruiken.


Antwoord 2, autoriteit 16%

Het gebruik van lowerin het typeis een goede manier om dit te doen, als je het niet erg vindt om de casusinformatie te verliezen.

Als je de case wilt behouden, kun je een aangepaste choices-klasse definiëren. De choiceshebben twee methoden nodig, __contains__(voor het testen van in), en iteratie (om de keuzes weer te geven).

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

De hulp is:

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

Antwoord 3, autoriteit 3%

Het bewaren van de case-informatie zou ook mogelijk zijn met een one-liner:

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

Waar keuzes dezelfde lijst zouden zijn als doorgegeven aan de keuzeparameter.

Other episodes