2014-12-23 4 views
30

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

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

ответ

35

Transform аргумент в нижний регистр с помощью

type = lambda s : s.lower() 

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

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

type = str.lower 

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

+9

Вы можете избавиться от лямбда, просто используя 'тип = str.lower', так как' str.lower' это функция, которая принимает строку и возвращает это в нижнем регистре. – chepner

+0

@chepner Хорошая мысль, мне это не приходило. – 5gon12eder

+0

@ 5gon12eder Хорошее использование lambda – Pramit

13

Использование 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} 
Смежные вопросы