Выбор аргументов без учета регистра
Можно ли проверить выбор аргументов без учета регистра?
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')
Ответы
Ответ 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()],
Где варианты выбора будут такими же, как и в параметре выбора.