2008-12-16 75 views
2

我有一個函數,希望實數(整數或浮點數)作爲其輸入,我試圖驗證這個輸入之前做它的數學運算。什麼是測試的最pythonic方式,輸入是格式良好的數字

我的第一個直覺是將輸入作爲來自try-except塊內的浮動輸入。

try: 
    myinput = float(input) 
except: 
    raise ValueError("input is not a well-formed number") 

我也可以叫isinstance(mydata, (float, int, long))但「所有這些可以是數字」名單似乎有點不雅給我。

什麼是最討厭它的pythonic方式?我還忽略了另一個選項嗎?

+0

Duplicate:http://stackoverflow.com/questions/354038/checking-if-string-is-a-number-python – 2008-12-16 14:28:10

+0

謝謝!我不知道我該如何錯過。 – Kena 2008-12-16 14:33:10

回答

12

How much input validation should I be doing on my python functions/methods?引用自己:內置式檢查

對於像總和計算階乘等,蟒蛇會做得很好。計算結束upp調用add,mul等類型,如果它們中斷,它們將拋出正確的異常。通過執行自己的檢查,您可能會使其他工作輸入無效。

因此,最好的選擇是將類型檢查爲Python。如果計算失敗,Python的類型檢查會給出一個異常,所以如果你自己做,你只需要複製代碼,這意味着代表更多的工作。

2

也許你可以結合使用assertisinstance聲明。 類似以下內容的是我認爲更加pythonic的方式,因爲當您的輸入不符合您的要求時,會拋出異常。不幸的是,我看不出有什麼比您的有效數字更好的定義。也許有人會有更好的主意。

number = (float, int, long) 
assert isinstance(mydata, (float, int, long)) 
5

在Python 2.6和3.0,數字抽象數據類型的類型層次結構一直added,所以你可以執行你的支票:

>>> import numbers 
>>> isValid = isinstance(myinput , numbers.Real) 

numbers.Real將匹配整體或浮動型,但不是非 - 數字類型或複數(使用數字。複雜)。它也會匹配有理數,但大概你也想包括這些。即:

>>> [isinstance(x, numbers.Real) for x in [4, 4.5, "some string", 3+2j]] 
[True, True, False, False] 

不幸的是,這是所有在Python> = 2.6,所以如果你是2.5或更早版本的開發也不會有用。

1

我不明白這個問題。

有兩種東西被大量不同的語義拋在一起,成爲「替代品」。

類型轉換是一回事。它適用於任何支持__float__的對象,它可以是各種各樣的對象,其中很少是實際的數字對象。

try: 
    myinput = float(input) 
except: 
    raise ValueError("input is not a well-formed number") 
# at this point, input may not be numeric at all 
# it may, however, have produced a numeric value 

類型測試是另一回事。這隻適用於特定的一組類的正確實例的對象。

isinstance(input, (float, int, long)) 
# at this point, input is one of a known list of numeric types 

這裏的示例類響應float,但仍然不是數字。

class MyStrangeThing(object): 
    def __init__(self, aString): 
     # Some fancy parsing 
    def __float__(self): 
     # extract some numeric value from my thing 

「實數(整數或浮點數)」這個問題通常是不相關的。許多東西都是「數字」,可以在數字操作中使用,但不是整數或浮點數。例如,您可能已經下載或創建了一個理性數字包。

過度驗證輸入沒有意義,除非您有一種算法不適用於某些類型。這些很少見,但有些計算需要整數,特別是它們可以進行整數除法和餘數運算。對於這些,你可能想要聲明你的值是整數。

相關問題