2010-11-19 51 views
5

Chcę napisać skrypt Pythona, który ma 3 parametry. Pierwszy parametr to ciąg znaków, drugi to liczba całkowita, a trzeci to także liczba całkowita.Python: Sprawdź, czy argument jest liczbą całkowitą

Chcę rozpocząć testy warunkowe na początku, aby upewnić się, że podana jest odpowiednia liczba argumentów i są one właściwe przed kontynuowaniem.

Wiem, że możemy użyć sys.argv, aby uzyskać listę argumentów, ale nie wiem, jak przetestować, czy parametr jest liczbą całkowitą przed przypisaniem go do mojej zmiennej lokalnej do użycia.

Każda pomoc zostanie bardzo doceniona.

+1

Jaka wersja Pythona są uruchomione? – Zeke

Odpowiedz

8

Jeśli używasz Pythona 2.7, spróbuj zaimportować argparse. Python 3.2 również go użyje i jest to nowy preferowany sposób analizowania argumentów.

Ten przykładowy kod z Python documentation page pobiera listę ints i znajduje maksimum lub sumę przekazanych liczb.

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 
1
>>> int('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'foo' 

Daj int. Jeśli nie podniesiemy wartości ValueError, łańcuch będzie liczbą całkowitą.

6

Python sposobem jest próba powiedzie się, jeśli dane wejściowe nie obsługuje operację jak

try: 
    sys.argv = sys.argv[:1]+map(int,sys.argv[1:]) 
except: 
    print 'Incorrect integers', sys.argv[1:] 
+1

+1 Znany również jako EAFP: http://docs.python.org/glossary.html#term-eafp –

+0

Użyłem tej konstrukcji ('z wyjątkiem TypeError'), ale nie przechwyciłem jako' TypeError' dla wartości ' 1x'. Dostałem 'ValueError: invalid literal dla int() z base 10: '1x''. Tak więc z szacunkiem dokonam edycji odpowiedzi, aby utworzyć rodzajowy "except". – amphibient

+0

Z wyjątkiem nawiasów 'print', które powinny być dołączone do Pythona 3.4+, czy powyższy blok' try' może być użyty tak jak w pythonie 3.4+ ??? ---- Dostaję błąd, który mówi, że nie mogę połączyć 'mapy' do listy. W rezultacie test zawsze przechodzi do klauzuli wyjątku. Pozdrawiam, – Cbhihe

0

Można rzucić argument i spróbuj ... z wyjątkiem ValueError.

Jeśli używasz sys.argv, zbadaj również argparse.

3

Możesz użyć typu, aby określić typ dowolnego obiektu w Pythonie. Działa to w Pythonie 2.6, nie osobiście wiem, czy jest obecny w innych wersjach.

obvious_string = "This is a string." 
if type(obvious_string) != int: 
    print "Bro, that is so _not_ an integer." 
else: 
    print "Thanks for the integer, brotato chip." 
+3

Problem polega na tym, że wszystkie argumenty przekazane przez sys.argv są z definicji łańcuchami - jaki plakat musi wiedzieć "czy mogę przekonwertować ten argument na int, czy nie?" Jeśli nie używasz argparse, najlepszym sposobem jest (jak zauważono w innym miejscu), aby spróbować konwersji wewnątrz bloku try/except. – bgporter

+0

Im więcej wiesz .. – Zack

9

Bardziej ogólnie można użyć isinstance, aby sprawdzić, czy coś jest instancją klasy.

Oczywiście, w przypadku argumentów skryptu, wszystko jest ciągiem znaków, ale jeśli pacjent argumentów do funkcji/metody i chcesz je sprawdzić, można użyć:

def foo(bar): 
    if not isinstance(bar, int): 
     bar = int(bar) 
    # continue processing... 

Można także przekazać krotką klas isinstance:

isinstance(bar, (int, float, decimal.Decimal)) 
+0

Nie dotyczy to przypadku, wszystkie argumenty linii cmd są odbierane jako ciągi. ale nie wiedziałem, że można przekazać tufle do isinstance, więc dzięki - dowiedziałem się. –

2

Jestem nowy w Pythonie, więc jestem delegowania to nie tylko pomóc, ale też pomógł: uzyskać komentarzy na temat dlaczego moje podejście jest/nie jest najlepszy, że jest.

Tak, z zastrzeżeniem, że nie jestem doświadczonym dev python, tutaj jest to, co chciałbym zrobić:

inp = sys.argv[x] 
try: 
    input = int(inp) 
except ValueError: 
    print("Input is not an integer") 

Co powyższe nie jest to, że stawia sys.argv [x], a następnie do INP próbuje wstawić całkowitą formę inp do wprowadzenia. Jeśli nie istnieje forma całkowita inp, to inp nie jest liczbą, więc zgłoszony zostanie wyjątek ValueError.

Przyjmuję, że to twój główny problem i wiesz, jak sprawdzić, czy masz wszystkie trzy parametry we właściwej formie. Jeśli nie, daj nam znać i jestem pewien, że dostaniesz więcej odpowiedzi. :)

sobie sprawę Tony Veijalainen napisali similar answer

Powiązane problemy