[英]Python check if isinstance any type in list?
我如何pythonicly做:
var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or isinstance(var, classinfoN)
我不能只傳入一個 classinfo 列表,這似乎很愚蠢:
var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )
那么isinstanceofany
函數是什么?
isinstance()
為第二個參數接受一個類元組。 如果第一個參數是該序列中任何類型的實例,它將返回 true:
isinstance(var, (classinfo1, classinfo2, classinfo3))
換句話說, isinstance()
已經提供了這個功能,開箱即用。
如果classinfo既不是類對象也不是類型對象,則它可能是類或類型對象的元組,或者可能遞歸包含其他此類元組(不接受其他序列類型)。
強調我的; 注意遞歸性質; (classinfo1, (classinfo2, classinfo3))
也是一個有效的選項。
你已經很接近你的問題的標題了。 您可以使用any
和一個列表:
var = 7.0
var_is_good = any([isinstance(var, classinfo1),
isinstance(var, classinfo2),
isinstance(var, classinfo3), ...
isinstance(var, classinfoN)])
但是查看isinstance
的文檔顯示:
如果 object 參數是 classinfo 參數或其(直接、間接或虛擬)子類的實例,則返回 true。 如果 object 不是給定類型的對象,則該函數始終返回 false。 如果 classinfo 不是類(類型對象),則它可能是類型 objects 的元組,或者可能遞歸包含其他此類元組(不接受其他序列類型)。 如果 classinfo 不是類型或類型元組和此類元組,則會引發 TypeError 異常。
這意味着更好的方法是
var = 7.0
var_is_good = isinstance(var, (classinfo1,
classinfo2,
classinfo3,
...,
classinfoN))
這將解決您的問題:
valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)
根據文檔,有很多方法可以將類型的值傳遞給isinstance
。
如果您嘗試進行更復雜的驗證,這只是其中的一部分,您也可能會考慮voluptuous 。
從 Python 3.10 開始,您可以使用新的New Type Union Operator ,例如:
isinstance(var, classinfo1 | classinfo2)
有關詳細信息,請參閱PEP 604 。
您通常不應該使用isinstance
,但是您可以使用any()內置函數完成您想要做的事情。
var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.