簡體   English   中英

Python 檢查列表中的 isinstance 是否為任何類型?

[英]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()已經提供了這個功能,開箱即用。

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.

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