我經常發現自己寫的多語句表達式在運行時驗證類型的變量。例如,假設我想驗證一個特定的輸入是富對象的列表,我可能會寫下面的表達式:有沒有辦法做判斷的對象是在運行時pep484風格表達的「實例」?
assert(_isinstance(x, list) and all(_isinstance(y, Foo) for y in x))
我寧願能寫類似:
# pseudocode
_assert(isinstance(x, typing.List[Foo]))
換句話說,我要問x是美孚的實例的列表。
如果可以作出努力,這將是更好,因爲Pep484語法簡明地指定類型的嵌套結構的好方法。當然,我們都知道,這是沒有辦法的辦法Python的內置isinstance函數的工作......但只是我的夢想了一會兒:
我們都熟悉,如果外返回true的isnstance功能一個結構類型是一個類的實例:
# real python:
isinstance(["a", "b", "c"], list) => True
但是假設我想要做更深入的檢查:我想這樣做:
# pseudocode:
import typing
_isinstance("x", str) => True
_isinstance(["a", "b", "c"], typing.List[str]) => True
_isinstance(["a", "b", "c"], typing.List[float]) => False
_isinstance([{"x":3}], typing.List[typing.Map[str,int]]) => True
這樣的想法是函數如果第一個參數完全對應於Pep484風格表達式,則返回True第二個論點的離子。
當然,有些人會指出,明確的靜態和運行時類型檢查違背「鴨打字」的精神。這是真的 - 但沒有用。有時你確實想要驗證輸入的結構。隨着項目變得越來越大,你有時候想你想要什麼,你正在處理,並在其他時間類型的鴨打字給你的靈活性,肯定知道的能力。
因此,這裏是我的問題:有沒有人見過的方式來比較類型Pep484風格的表達式?如果已經有一個圖書館或功能來做它,那麼我寧願不重新發明輪子。也許打字庫已經有辦法做到這一點。請指點我吧!
您已經使用'你的所有假設的例子向後isinstance'。不是說如果你翻動它,它會起作用。 'isinstance'不會做你想做的。 – ShadowRanger
這是向後一個例子 - 我已經糾正了,謝謝! –
在另一個示例中,您只是將其作了倒退。原型是'isinstance(OBJ,type_or_tuple_of_types)','未isinstance(type_or_tuple_of_types,OBJ)'。測試'x'是類型還是'list'的子類型是'isinstance(x,list)',而不是'isinstance(list,x)'。 – ShadowRanger