Подтвердить что ты не робот

Выбор аргументов без учета регистра

Можно ли проверить выбор аргументов без учета регистра?

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

приводит к:

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

Ответ 1

Преобразуйте аргумент в нижний регистр, используя

type = lambda s : s.lower()

для переключателя -p.

Как отмечено chepner в комментариях, поскольку str.lower уже является подходящей функцией, обертка лямбда не обязательно нужна, и вы могли бы просто просто использовать

type = str.lower

непосредственно.

Ответ 2

Использование lower в type - хороший способ сделать это, если вы не возражаете потерять информацию о случае.

Если вы хотите сохранить этот случай, вы можете определить собственный choices класс. Для choices нужны два метода: __contains__ (для тестирования in) и итерация (для перечисления вариантов).

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

Справка:

usage: ipython [-h] [-p {win64,win32}]

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

Ответ 3

Хранение информации о случае также возможно с одним вкладышем:

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

Где варианты выбора будут такими же, как и в параметре выбора.