【发布时间】:2015-11-22 08:40:10
【问题描述】:
我发现 Python 2 和 3 之间的行为存在奇怪的差异。
在 Python 3 中似乎一切正常:
Python 3.5.0rc2 (v3.5.0rc2:cc15d736d860, Aug 25 2015, 04:45:41) [MSC v.1900 32 b
it (Intel)] on win32
>>> from collections import Sequence
>>> isinstance(bytearray(b"56"), Sequence)
True
但不是在 Python 2 中:
Python 2.7.10 (default, May 23 2015, 09:44:00) [MSC v.1500 64 bit (AMD64)] on wi
n32
>>> from collections import Sequence
>>> isinstance(bytearray("56"), Sequence)
False
在 Python 2.x 和 3.x 的次要版本中,结果似乎是一致的。这是一个已知的错误?这是一个错误吗?这种差异背后有什么逻辑吗?
我实际上更担心 C API 函数 PySequence_Check 正确识别 PyByteArray_Type 类型的对象作为暴露序列协议,通过查看源代码似乎应该这样做,但任何洞察这整个事情很受欢迎。
【问题讨论】:
-
根据PEP 3119 表达式
issubclass(bytearray, MutableSequence)的计算结果为真......但在python2 中并非如此。 AFAIKPySequence_Check将返回正确的结果仅仅是因为它不使用元类来查看一个类是否是一个序列。它查看包含序列方法的struct的字段是否已设置。
标签: python bytearray python-internals abc