gpt4 book ai didi

python - isinstance(foo,bar) vs type(foo) is bar

转载 作者:IT老高 更新时间:2023-10-28 20:22:31 24 4
gpt4 key购买 nike

一个语义问题,真的。

直到最近,如果我必须对结构进行任何类型检查,我会使用 type(obj) is list 等。人。但是,自从加入 SO 以来,我注意到每个人(我的意思是 EVERYONE)都使用 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 isCOMPARE_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): 更易读,第一个基本上只是伪-代码,第二个调用带有一些参数的函数(我每次都必须查找 isinstanceinstanceof)。它看起来不像类型转换,并且没有明确的方法知道 isinstance(a,b) 是否正在检查 b 是否是 a 的实例 反之亦然。

我从 this question 了解到我们使用 isinstance 因为它更好地继承。 type(ClassDerivedFromList) is list 将失败,而 isinstance(ClassDerivedFromList,list) 将成功。但是,如果我要检查什么应该始终是基本对象,那么执行 type is 我真正失去了什么?

最佳答案

if I'm checking what should ALWAYS BE A BASE OBJECT, what do I really lose from doing type is?

嗯,很高兴您在问题中给出完整的文档答案,所以您的答案是您什么都没有!唯一需要 isinstance() 的情况是在检查给定类与另一个类的继承时,正如您所说和引用的那样。 type() 仅用于检查实例是否完全属于给定的基本类型。

关于python - isinstance(foo,bar) vs type(foo) is bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21894575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com