PySequenceMethods 的哪些成员是可选的?

Which members of PySequenceMethods are optional?

我想让我的扩展对象被传递到 Python 的 len() 函数中,我知道这样做的方法是实现 sq_length 成员PySequenceMethods,但现在我没有时间实现 all 序列协议的方法,我无法弄清楚哪些方法是可选的,哪些(如果有的话)是必需的。

documentation for tp_as_sequence 没有提及任何关于可选成员的内容。

documentation for PySequenceMethods明确表示sq_itemsq_ass_itemsq_containssq_inplace_concatsq_inplace_repeat可以留给NULL.

此外,documentation for sq_item 意味着 sq_length 也可以留给 NULL:

If sq_length is NULL, the index is passed as is [...]

剩下 sq_concatsq_repeat。如果将它们也设置为 NULL 不安全,我会感到惊讶,因为您可以对所有其他成员(包括 sq_itemsq_length 都这样做这似乎比其他序列的概念更基本),但这个假设真的正确吗?

如果 安全地保留它们 NULL,仅设置一个错误说明不支持这两个函数并且 return NULL?

都是可选的。

sq_item 设置为 NULL 意味着 PySequence_Check() 失败,所以它不是真正的序列 - 我不知道你想如何 "optional"考虑一下。

所有 PySequence_* 方法都会检查 NULL 指针,并且只会设置 Python TypeError 而不会崩溃,因此将这些成员设置为 NULL。只是为了展示您不确定的两个:

PySequence_Concat and PySequence_Repeat 都有以下形式的代码:

if (m && m->sq_repeat)
    return m->sq_repeat(o, count);

浏览其余函数并发现它们使用相同的模式非常简单。