2012-08-24 8 views

Odpowiedz

17

Parametr type do musi być obiektem wywoływalnym, który pobiera ciąg znaków i zwraca wartość przekonwertowaną. Możesz napisać opakowanie o numerze float, które sprawdza jego wartość i powoduje zgłoszenie błędu, jeśli jest poza zakresem.

def restricted_float(x): 
    x = float(x) 
    if x < 0.0 or x > 1.0: 
     raise argparse.ArgumentTypeError("%r not in range [0.0, 1.0]"%(x,)) 
    return x 

p = argparse.ArgumentParser() 
p.add_argument("--arg", type=restricted_float) 
+0

I był pierwotnie zamiar wybrać FJ-tych jako przyjętą odpowiedź, po prostu dlatego, że podoba mi się "czystość" tego (oczywiście dyskusyjna), ale prostota tego mnie podniosła i używam go w moim kodzie. Dzięki! –

+0

Uwaga: 'restricted_float' powinno prawdopodobnie zostać zastąpione przez to, co reprezentuje, ponieważ będzie wyświetlane w komunikatach o błędach. Na przykład użyłem tego wzorca w zabawkowym projekcie ['geocodertools'] (https://pypi.python.org/pypi/geocodertools) i nazwał go' longitude' i 'latitude'. –

9

Oto metoda, która wykorzystuje parametr add_argumentchoices, z niestandardowej klasy, który jest uważany za „równa się” do każdego pływaka w określonym zakresie:

import argparse 

class Range(object): 
    def __init__(self, start, end): 
     self.start = start 
     self.end = end 
    def __eq__(self, other): 
     return self.start <= other <= self.end 

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', type=float, choices=[Range(0.0, 1.0)]) 
+1

Podoba mi się ten, ponieważ zostawia wyjątek podnosząc do argparse. Dzięki! –

+2

Jedna z sugestii: niech twoja klasa 'Range' implementuje metodę' __contains__'; wtedy możesz powiedzieć 'choices = Range (0.0, 1.0)' zamiast owijać go na liście. – chepner

+0

Podejście '__contains__' daje' ValueError: długość metawarowanej krotki nie pasuje do nargs' przy użyciu Pythona 3.4. W przeciwnym razie działa dobrze i zaimplementowałem '__repr__', aby zwrócić' '{0} - {1}' .format (self.start, self.end) 'dla ładniejszego tekstu pomocy. – RickardSjogren

Powiązane problemy