我想强制列表中的所有项目都是< code>x类型。做这件事的最好方法是什么?目前我正在做一个如下的断言:
a = [1,2,3,4,5]
assert len(a) == len([i for i in a if isinstance(i, int)])
其中<code>int</code>是我试图在这里强制执行的类型。有更好的方法吗?
我认为你让它有点太复杂了。你可以只使用 all()
:
a = [1,2,3,4,5]
assert all(isinstance(i, int) for i in a)
a = [1,2,3,4,5.5]
assert all(isinstance(i, int) for i in a)
# AssertionError
您需要决定是否还对包含int的任何子类感兴趣。如果i
是True
或False
,则isinstance(i,int)
将返回True
。因为bool
为int
的子类。
无论你做什么,你都应该像Mark Meyer建议的那样使用all
。(顺便说一下,与使用len
相比,这样做的一个优点是,如果有任何测试失败,那么它不会不必要地检查剩下的项目,前提是您使用的是生成器,而不是构建结果列表——事实上,语法中的任何地方都没有使用[
…]
符号,这表明情况就是这样。)
但是如果你只对包含实际的int
类型本身感兴趣,那么你应该这样做:
assert all(type(i) is int for i in a)
(如果您确实想允许,例如bool
,请参见Mark Meyer的答案。)
在Python中,你需要问问自己是否有必要?通常,您检查进入程序的数据,然后依靠程序结构在其内部分发适当的类型。您可以使用Mypy和类型注释来提供帮助(静态)。您可以将运行时检查设置为可选 - 例如,调试模式的一部分。过去,我不得不进入交互系统的级别,其中用于学习系统的数据检查器随后被关闭,仅用于调试。其他程序可以有成本较低的检查,内部开发将使用检查器,第三方代码可以让检查器在其版本上运行。数据检查需要时间,我必须寻找有效的解决方案。