Python 检查实例是否在列表中的任何类型?
Python check if isinstance any type in list?
如何紧凑地执行以下操作:
var = 7.0
var_is_good = (
isinstance(var, classinfo1) or
isinstance(var, classinfo2) or
isinstance(var, classinfo3)
)
这行不通:
var_is_good = isinstance(var, [classinfo1, classinfo2, classinfo3])
您已经非常接近问题的标题了。您可以使用 any
和一个列表:
var = 7.0
var_is_good = any([isinstance(var, classinfo1),
isinstance(var, classinfo2),
isinstance(var, classinfo3), ...
isinstance(var, classinfoN)])
但是查看 isinstance
的文档会发现:
Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object is not an object of the given type, the function always returns false. If classinfo is not a class (type object), it may be a tuple of type objects, or may recursively contain other such tuples (other sequence types are not accepted). If classinfo is not a type or tuple of types and such tuples, a TypeError exception is raised.
这意味着更好的方法是
var = 7.0
var_is_good = isinstance(var, (classinfo1,
classinfo2,
classinfo3,
...,
classinfoN))
您通常不应该使用 isinstance
,但您可以使用 any() 内置函数来完成您想做的事情。
var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])
这将解决您的问题:
valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)
基于 documentation,您可以通过多种方式将类型的值传递给 isinstance
。
如果您尝试进行更复杂的验证(这只是其中的一部分),您也可以查看 voluptuous。
isinstance()
将 元组 的 类 作为第二个参数。如果第一个参数是该序列中 any 类型的实例,它将 return 为真:
isinstance(var, (classinfo1, classinfo2, classinfo3))
换句话说,isinstance()
已经提供了这个功能,开箱即用。
If classinfo is neither a class object nor a type object, it may be a tuple of class or type objects, or may recursively contain other such tuples (other sequence types are not accepted).
强调我的;注意递归性质; (classinfo1, (classinfo2, classinfo3))
也是一个有效选项。
从 Python 3.10 开始,您可以使用新的 New Type Union Operator,例如:
isinstance(var, classinfo1 | classinfo2)
详情见PEP 604。
如何紧凑地执行以下操作:
var = 7.0
var_is_good = (
isinstance(var, classinfo1) or
isinstance(var, classinfo2) or
isinstance(var, classinfo3)
)
这行不通:
var_is_good = isinstance(var, [classinfo1, classinfo2, classinfo3])
您已经非常接近问题的标题了。您可以使用 any
和一个列表:
var = 7.0
var_is_good = any([isinstance(var, classinfo1),
isinstance(var, classinfo2),
isinstance(var, classinfo3), ...
isinstance(var, classinfoN)])
但是查看 isinstance
的文档会发现:
Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object is not an object of the given type, the function always returns false. If classinfo is not a class (type object), it may be a tuple of type objects, or may recursively contain other such tuples (other sequence types are not accepted). If classinfo is not a type or tuple of types and such tuples, a TypeError exception is raised.
这意味着更好的方法是
var = 7.0
var_is_good = isinstance(var, (classinfo1,
classinfo2,
classinfo3,
...,
classinfoN))
您通常不应该使用 isinstance
,但您可以使用 any() 内置函数来完成您想做的事情。
var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])
这将解决您的问题:
valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)
基于 documentation,您可以通过多种方式将类型的值传递给 isinstance
。
如果您尝试进行更复杂的验证(这只是其中的一部分),您也可以查看 voluptuous。
isinstance()
将 元组 的 类 作为第二个参数。如果第一个参数是该序列中 any 类型的实例,它将 return 为真:
isinstance(var, (classinfo1, classinfo2, classinfo3))
换句话说,isinstance()
已经提供了这个功能,开箱即用。
If classinfo is neither a class object nor a type object, it may be a tuple of class or type objects, or may recursively contain other such tuples (other sequence types are not accepted).
强调我的;注意递归性质; (classinfo1, (classinfo2, classinfo3))
也是一个有效选项。
从 Python 3.10 开始,您可以使用新的 New Type Union Operator,例如:
isinstance(var, classinfo1 | classinfo2)
详情见PEP 604。