当前位置: 首页 > 面试题库 >

isinstance(foo,bar)vs type(foo)是bar

狄鹏
2023-03-14
问题内容

确实是一个语义问题。

直到最近,如果我必须对结构进行任何类型检查,我都会使用type(obj) is listet。等 但是,自从加入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):,第一个基本上只是伪代码,第二个使用某些参数调用某些函数(每次我必须在toisinstance或or中查找instanceof)。它看起来不像是类型转换,也没有明确的方法来知道是否isinstance(a,b)检查的b是实例,a反之亦然。

我从这个问题中了解到我们可以使用isinstance它,因为它比继承更好。type(ClassDerivedFromList) is list将失败,而isinstance(ClassDerivedFromList,list)将成功。但是,如果我要检查什么始终是基本目标,那么我真正失去的是什么type is


问题答案:

如果我正在检查什么永远是基本对象,那么我从打字中真正地失去的是什么?

好吧,很高兴在您的问题中提供完整的书面答案,因此您的答案是 什么
都不会丢失!isinstance()正如您已经说过和引用过的,唯一必要的情况是检查给定类与另一个类的继承。type()只能用于检查实例是否 完全
属于给定的基本类型。



 类似资料:
  • 问题内容: 我以为我很聪明。但是鉴于最近的发现,我不确定。在页面生命周期中,可能有许多数据库交互。有些背靠背,有些则散布开来。因此,我发明了一个对象,该对象在HttpContext.Items字典中使SQL连接的实例保持活动状态。然后,每个数据库请求都使用此连接,并且当http请求结束时,我会正确处理该连接。我们正在等待几百毫秒的时间,连接将打开,并且通过大量的HTTP高速缓存,可用连接的用尽也不

  • 运行composer的,,,等时。;我突然收到一张黄色的反对通知,上面写着: 位于./Foo/Bar/utility/Baz.php中的类Foo\Bar\Baz不符合psr-4自动加载标准。跳过 在Composer 2.0之前,人们习惯于获得: 弃用通知:位于./Foo/Bar/Baz.php中的类Foo\Bar\Baz不符合psr-4自动加载标准。它将不再在Composer v2.0中自动加载。

  • 问题内容: 我看到其他地方说: 等于 我测试了一下,他们确实做了同样的事情。但为什么?到底是什么? 问题答案: AND和OR运算符都可以捷径。 因此,仅在第一个表达式为true时才尝试第二个表达式(更确切地说,是类似事实的表达式)。第二个操作确实起作用(无论其内容如何)的事实无关紧要,因为除非第一个表达式的计算结果为真,否则它不会执行。如果是事实,则将执行它以尝试第二次测试。 相反,如果语句中的第

  • 问题内容: 有没有办法使CSS选择器与以下内容匹配? 选择器 不起作用,因为它匹配PARAM,而不是对象。我想将{display:none}应用于对象;将其应用于PARAM毫无用处。 (我知道我可以使用jQuery-和VanillaJS- 做到这一点,但我正在尝试在页面上创建CSS规则。) 问题答案: 不,您要查找的内容称为 父选择器 。CSS没有?已经多次提出了这些建议,但我不知道包括它们在内的

  • 问题内容: 在Java中,这两个函数声明之间有什么区别? 在这里,您可以找到该问题的答案,但仅适用于 C / C ++ 。在这些语言中,两种声明样式的存在是完全有意义的。 但是在 Java 中这有什么意义呢? 问题答案: 后者在Java中是非法的。您不能声明这样的方法。您应该得到这样的错误: 因此,不仅没有意义-您根本找不到尝试使用此样式的有效代码。

  • 问题内容: 早在2016年11月,我发布了一个问题,询问为什么我不能使用Guard创建与变量名称相同的未包装版本的变量,就像让let那样: 链接: 为什么后卫不让foo = foo有效? 当我编写该问题时,以下代码将无法编译,并显示“定义与先前值冲突”的错误: 但是,我只是在工作中发现了一些可以做到这一点的代码,现在它可以毫无抱怨地进行编译,并且可以完成我想要的工作!运行时,print语句显示fo

  • 问题内容: 代码是这样的(语法可能看起来很奇怪,但据我所知,它没有任何问题。还是存在?) 被声明为一个函数。因此,当我将参数传递给它时,它也应该返回结果。 那么,为什么我没有得到第二个警告框? 问题答案: 您会看到一个命名函数表达式(NFE)。 匿名函数表达式是您将没有名称的函数分配给变量1的地方: 命名函数表达式是您将命名函数分配给变量的地方(惊奇!): 函数名称仅在函数本身内可用。这使您无需知

  • 问题内容: Foo具有: 和酒吧有: 除了表被称为foo_bar还是bar_foo之外,mappedBy属性的位置对双向关系有何影响?没有mapByBy属性,我得到两个联接表,即foo_bar和bar_foo。 问题答案: 该文档说: 如果关联是双向的,则一侧必须是所有者,而一侧必须是反向端(即,在更新关联表中的关系值时,它将被忽略): 因此,具有属性的一面是反面。没有属性的一方是所有者。 所有者