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 -p
schakelaar.
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.lower
te gebruiken.
Antwoord 2, autoriteit 16%
Het gebruik van lower
in het type
is 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 choices
hebben 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.