2010-11-19 85 views
5

我想編寫一個需要3個參數的python腳本。第一個參數是一個字符串,第二個參數是一個整數,第三個參數也是一個整數。Python:測試參數是否爲整數

我想在開始時進行條件檢查,以確保提供了正確數量的參數,並且在繼續之前它們是正確的類型。

我知道我們可以使用sys.argv來獲取參數列表,但我不知道如何測試一個參數是一個整數,然後將其分配給我的本地變量使用。

任何幫助將不勝感激。

+1

您運行的是什麼版本的Python? – Zeke 2010-11-19 19:45:44

回答

8

如果您正在運行Python 2.7,請嘗試導入argparse。 Python 3.2也會使用它,它是解析參數的新的首選方法。

來自Python documentation page的這個示例代碼引入了一個ints列表,並找到傳遞的數字的最大值或總和。

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' 

把它給int。如果它不提高ValueError那麼該字符串是一個整數。

6

Python的方法是嘗試,如果輸入不支持像

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

+1也被稱爲EAFP:http://docs.python.org/glossary.html#term-eafp – 2010-11-19 19:50:01

+0

我使用這個構造('TypeError'除外),但它沒有捕獲作爲'TypeError'的值' 1x'。我得到了'ValueError:無效的文字int()與基地10:'1x''。所以我會恭敬地編輯答案,以使'except'泛型。 – amphibient 2014-07-10 20:38:35

+0

除python 3.4+應包含的'print'括號外,上面的'try'模塊可以用於python 3.4+嗎? ----我得到一個錯誤,說我不能連接'map'到列表。結果,測試總是跳轉到異常條款。乾杯, – Cbhihe 2017-01-16 10:32:14

0

操作,就可以把參數和嘗試...除了ValueError異常失敗。

如果您使用的是sys.argv,請調查argparse。

3

您可以使用type來確定Python中任何對象的類型。這適用於Python 2.6,我不知道它是否存在於其他版本中。

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

這樣做的問題是,所有通過sys.argv傳遞的參數都是定義字符串 - 海報需要知道的是'我可以將此參數轉換爲int嗎?'如果不使用argparse,最好的方法是(如其他地方所述)嘗試try/except塊內的轉換。 – bgporter 2010-11-19 20:08:42

+0

您知道得越多.. – Zack 2010-11-19 20:17:30

9

更一般地說,您可以使用isinstance來查看是否有東西是類的實例。

顯然,在腳本參數的情況下,一切是一個字符串,但如果你正在接受參數的函數/方法和要檢查他們,你可以使用:

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

您也可以通過一個類的元組isinstance:

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

不適用於這種情況,所有cmd行參數都以字符串形式接收。但我不知道可以通過實例傳遞圖斑,所以謝謝 - 我學到了。 – 2010-11-20 00:10:45

2

我是新來的Python,所以我張貼這不僅是爲了幫助,但也可以幫助:瞭解了爲什麼我的做法是評論/不是最好的一個,即是。

因此,與免責聲明我不是一個有經驗的蟒蛇開發,這裏是我會做什麼:

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

什麼上面所做的是,它使得sys.argv中[X]以INP,然後嘗試將整數形式的inp輸入。如果沒有inp的整數形式,那麼inp不是一個數字,所以會引發ValueError異常。

我認爲這是你的主要問題,你知道如何檢查你是否有正確形式的所有三個參數。如果沒有,請告訴我們,我相信你會得到更多答案。 :)

剛剛意識到Tony Veijalainensimilar answer