在numpy中,许多对象的构造函数接受"array_like"作为第一个参数.是否有这样一个对象的定义,要么作为抽象元类,要么应该包含方法的文档?
Python程序中的一个iterable和一个array_like对象有什么区别Numpy?
双方iterable并array_like经常看到的Python文档和他们分享一些相似的性质.
我知道在这种情况下,array_like对象应该支持Numpy类型操作,如广播,但是Numpy数组区域也是可迭代的.说这array_like是一个扩展(或超集?)是正确的iterable吗?
Python使用魔术方法做了很多,其中大部分是一些协议的一部分.我熟悉"迭代器协议"和"数字协议",但最近偶然发现术语"序列协议".但即使经过一些研究,我也不确定"序列协议"是什么.
例如,C API函数PySequence_Check检查(根据文档)某个对象是否实现了"序列协议".该源代码表明这是一类,这不是一个字典,但实现__getitem__它的方法大致相同,在什么文件iter还指出:
[...]必须支持序列协议(
__getitem__()整数参数从0开始的方法).[...]
但是开始的要求0不是"实施"的PySequence_Check.
然后还有的collections.abc.Sequence类型,它基本上是说实例必须实现__reversed__,__contains__,__iter__和__len__.
但是根据该定义,实现"序列协议"的类不一定是序列,例如序列具有长度的"数据模型"和抽象类garantuee.但是实现__getitem__(传递PySequence_Check)的类在使用时会抛出异常len(an_instance_of_that_class).
有人可以告诉我序列和序列协议之间的区别(如果除了阅读源代码之外还有协议的定义)以及何时使用哪个定义?