isinstance(some_object, (some_class1, some_class2))
运行正常,但是
isinstance(some_object, [some_class1, some_class2])
引发 TypeError 错误
isinstance(some_object, (some_class1, some_class2))
运行正常,但是
isinstance(some_object, [some_class1, some_class2])
isinstance
函数的其他可迭代对象情况。请点击链接查看完整对话。
On Thu, Jan 2, 2014 at 1:37 PM, James Powell wrote:
This is driven by a real-world example wherein a large number of prefixes stored in a set, necessitating:
any('spam'.startswith(c) for c in prefixes) # or 'spam'.startswith(tuple(prefixes))
Neither of these strikes me as bad. Also, depending on whether the set of prefixes itself changes dynamically, it may be best to lift the tuple() call out of the startswith() call.
...
However, .startswith doesn't seem to be the only example of this, and the other examples are free of the string/iterable ambiguity:
isinstance(x, {int, float})
But this is even less likely to have a dynamically generated argument.
And there could still be another ambiguity here: a metaclass could conceivably make its instances (i.e. classes) iterable.
str.startswith()
可以将元组作为其参数! :-) 我从来没有想过要检查。 - alexis根据文档,它的行为正是应该如此:https://docs.python.org/zh-cn/3/library/functions.html#isinstance
如果 classinfo 是类型对象的元组(或递归地,其他这样的元组),则返回 true 如果 object 是其中任何一个类型的实例。如果 classinfo 不是类型或类型元组和此类元组,则会引发 TypeError 异常。
因为字符串也是“可迭代的一些内容”。所以你可以这样写:
isinstance(some_object, 'foobar')
它将检查some_object
是否是f
,o
,b
,a
或r
的实例。
显然这样不起作用,因此isinstance
需要检查第二个参数是否不是字符串。由于isinstance
需要进行类型检查,因此最好确保第二个参数始终是元组。
因为这就是语言设计的方式...
当你编写可以接受多种类型的代码时,使用固定类型进行直接测试比使用鸭子类型更容易。例如,由于字符串可迭代,当您想要接受字符串或字符串序列时,必须首先检查字符串类型。
在这里,我想不到限制为元组类型的强烈理由,但也没有将其扩展到任何序列的强烈理由。您可以尝试在python-ideas列表上提出建议。
在高层次上,需要一个容器类型进行 isinstance 检查,因此您有元组、列表、集合和字典作为内置容器。最有可能的是,他们选择元组而不是集合,因为对于 isinstance 的预期用例是少量类型,与集合相比,元组更快地检查包含关系。
可变性真的不是考虑因素。如果他们真的需要不可变性,在处理前他们可以将可迭代对象重新封装成元组即可。