Est-il possible de vérifier des choix contradictoires sans tenir compte de la casse?
import argparse
choices = ["win64", "win32"]
parser = argparse.ArgumentParser()
parser.add_argument("-p", choices=choices)
print(parser.parse_args(["-p", "Win32"]))
résulte en:
usage: choices.py [-h] [-p {win64,win32}]
choices.py: error: argument -p: invalid choice: 'Win32' (choose from 'win64','win32')
Transformez l'argument en minuscule en utilisant
type = lambda s : s.lower()
pour le commutateur -p
.
Comme indiqué par chepner dans les commentaires, puisque str.lower
est déjà une fonction appropriée, le wrapper lambda n’est pas nécessairement nécessaire et vous pouvez simplement utiliser
type = str.lower
directement.
Utiliser lower
dans type
est une bonne façon de procéder, si vous n’êtes pas dérangé de perdre les informations sur le cas.
Si vous souhaitez conserver le cas, vous pouvez définir une classe choices
personnalisée. La choices
a besoin de deux méthodes, __contains__
(pour tester in
) et une itération (pour répertorier les choix).
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')
L'aide est:
usage: ipython [-h] [-p {win64,win32}]
optional arguments:
-h, --help show this help message and exit
-p {win64,win32}
Conserver les informations sur le cas serait également possible avec un seul support:
type = lambda arg: {x.lower(): x for x in choices}[arg.lower()],
Où choix serait la même liste que celle transmise au paramètre choices.