【发布时间】:2014-03-20 14:45:40
【问题描述】:
一个语义问题,真的。
直到最近,如果我必须对结构进行任何类型检查,我会使用 type(obj) is list 等。人。然而,自从加入 SO 以来,我注意到每个人(我的意思是 每个人)都使用 isinstance(obj,list) 代替。似乎它们是同义词,timeit 揭示了它们之间几乎相同的速度。
def a(): return type(list()) is list
def b(): return isinstance(list(),list)
from timeit import timeit
timeit(a)
# 0.5239454597495582
timeit(b)
# 0.5021292075273176
事实上,即使dis 也同意它们是同义词,但type is 的COMPARE_OP 除外
from dis import dis
dis(a)
# 2 0 LOAD_GLOBAL 0 (type)
# 3 LOAD_GLOBAL 1 (list)
# 6 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
# 9 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
# 12 LOAD_GLOBAL 1 (list)
# 15 COMPARE_OP 8 (is)
# 18 RETURN_VALUE
dis(b)
# 2 0 LOAD_GLOBAL 0 (isinstance)
# 3 LOAD_GLOBAL 1 (list)
# 6 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
# 9 LOAD_GLOBAL 1 (list)
# 12 CALL_FUNCTION 2 (2 positional, 0 keyword pair)
# 15 RETURN_VALUE
坦率地说,我发现if type(foo) is list: 比if isinstance(foo,list): 更易读,第一个基本上只是伪代码,第二个调用一些函数(我每次都必须查找 isinstance 或 @987654333 @) 有一些论据。它看起来不像是类型转换,并且没有明确的方法可以知道 isinstance(a,b) 是否正在检查 b 是否是 a 的实例,反之亦然。
我从this question 了解到,我们使用isinstance 是因为它对继承更好。 type(ClassDerivedFromList) is list 将失败,而 isinstance(ClassDerivedFromList,list) 将成功。但是,如果我要检查什么应该始终是基本对象,那么我在做type is 时真正失去了什么?
【问题讨论】:
标签: python typechecking