![](/img/trans.png)
[英]What's the fastest way to test the validity of a large number of well-formed URLs
[英]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或更早版本,則無用。
也許你可以使用assert
和isinstance
語句的組合。 類似下面的內容是我認為更加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.