簡體   English   中英

什么是測試輸入是格式良好的數字的最pythonic方式

[英]What's the most pythonic way of testing that inputs are well-formed numbers

我有一個函數,它期望實數(整數或浮點數)作為它的輸入,我試圖在對它進行數學運算之前驗證這個輸入。

我的第一直覺是將輸入作為浮點數從try-except塊中轉換出來。

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

我也可以調用isinstance(mydata, (float, int, long) )但是“所有這些可能是數字”的列表對我來說似乎有點不合適。

最狡猾的方式是什么? 我忽略了另一種選擇嗎?

引用自己我應該對我的python函數/方法進行多少輸入驗證?

對於sum,factorial等計算,pythons內置類型檢查會很好。 計算將結束upp為類型調用add,mul等,如果它們中斷,它們將拋出正確的異常。 通過強制執行您自己的檢查,您可能會使其他工作輸入無效。

因此,最好的選擇是將類型檢查留給Python。 如果計算失敗,Python的類型檢查將給出異常,因此如果您自己執行此操作,則只需復制代碼即可代表您完成更多工作。

在Python 2.6和3.0,數字抽象數據類型的類型層次結構已被添加 ,所以你可以執行你的支票:

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

numbers.Real將匹配integer或float類型,但不是非數字類型或復數(使用numbers.Complex)。 它也會匹配有理數,但可能你也希望包含這些數字。 即:

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

不幸的是,這一切都在Python> = 2.6中,因此如果您正在開發2.5或更早版本,則無用。

也許你可以使用assertisinstance語句的組合。 類似下面的內容是我認為更加pythonic的方式,因為當您的輸入不符合您的要求時拋出異常。 不幸的是,我沒有看到任何有效數字比你更好的定義。 也許有人會帶來更好的主意。

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

我不明白這個問題。

有兩種不同的語義被作為“替代品”而被拋棄。

類型轉換是一回事。 它適用於任何支持__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

“實數(整數或浮點數)”這個問題通常是無關緊要的。 許多東西都是“數字”,可以在數字操作中使用,但不是整數或浮點數。 例如,您可能已下載或創建了有理數字包。

除非您的算法不適用於某些類型,否則輸入過高是沒有意義的。 這些很少見,但有些計算需要整數,特別是它們可以進行整數除法和余數運算。 對於那些,您可能想斷言您的值是整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM