2014-12-23 26 views
30

argparse choices numaralı klavyeye duyarsız olarak kontrol etmek mümkün mü? içindeBüyük/küçük harf duyarsız argparse seçimleri

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

sonuçları:

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

cevap

35

-p anahtar için

type = lambda s : s.lower() 

kullanılarak küçük harf içine bağımsız değişken dönüşümü. str.lower zaten lambda sarıcı mutlaka gerekli değildir, uygun bir fonksiyondur ve bunun yerine sadece doğrudan

type = str.lower 

kullanabilirsiniz beri

gibi, yorumlardaki chepner tarafından işaret etti. type yılında lower kullanma

+9

Sen str.lower' bir dize ve döner alan bir fonksiyondur 'beri, sadece' type = str.lower' kullanarak lambda kurtulabilirsiniz küçük harfle. – chepner

+0

@chepner İyi bir nokta, bana gelmedi. – 5gon12eder

+0

@ 5gon12eder Lambda'nın güzel kullanımı – Pramit

13

Eğer durum bilgi kaybı sakıncası yoksa, bunu yapmanın güzel yoludur.

Bu durumu korumak istiyorsanız, özel bir choices sınıfı tanımlayabilirsiniz. choices, __contains__ (in sınama için) ve yineleme (seçeneklerin listesi için) olmak üzere iki yönteme ihtiyaç duyar.

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

yardımdır:

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

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