web-dev-qa-db-fra.com

Choix argparse insensibles à la casse

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

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.

50
5gon12eder

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}
13
hpaulj

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.

0
Andreas Walter