Chciałbym użyć argparse
na Pythonie 2.7, aby jeden z parametrów skryptu był w zakresie od 0,0 do 1,0. Czy obsługuje to argparse.add_argument()
? ParametrJak mogę wymagać, aby argument mojego skryptu Pythona był zmiennoprzecinkowy między 0.0-1.0 używając argparse?
Odpowiedz
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)
Oto metoda, która wykorzystuje parametr add_argument
choices
, 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)])
Podoba mi się ten, ponieważ zostawia wyjątek podnosząc do argparse. Dzięki! –
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
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
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! –
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'. –