2014-12-23 14 views
30

Czy można sprawdzić, czy wielkość liter nie jest zależna od wielkości liter w przypadku argparse choices?Wybrane opcje niewrażliwe na wielkość liter

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

skutkuje:

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

Odpowiedz

35

Transform argument na małe litery przy użyciu

type = lambda s : s.lower() 

przełącznika -p.

Jak podkreślił chepner w komentarzach, ponieważ str.lower jest już odpowiednia funkcja, owijka lambda nie jest koniecznie potrzebne i można zamiast po prostu użyć

type = str.lower 

bezpośrednio.

+9

Można pozbyć lambda po prostu za pomocą 'type = str.lower', ponieważ' str.lower' to funkcja, która pobiera ciąg i powraca to małymi literami. – chepner

+0

@chepner Dobra uwaga, nie przyszło mi to do głowy. – 5gon12eder

+0

@ 5gon12eder Nice use of lambda – Pramit

13

Korzystanie z lower w type to dobry sposób robienia tego, jeśli nie masz nic przeciwko utracie informacji o etui.

Jeśli chcesz zachować skrzynkę, możesz zdefiniować niestandardową klasę choices. choices potrzebuje dwóch metod, __contains__ (do testowania in) i iteracji (aby wyświetlić listę opcji).

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

Pomoc jest:

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

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