PySequenceMethods的哪些成员是可选的?

时间:2019-05-03 13:38:20

标签: python sequence python-c-api

我希望允许将扩展对象传递到Python的len()函数中,并且我知道实现此方法的方法是实现sq_length的{​​{1}}成员,但是现在,我没有时间实现序列协议的 all 方法,而且我无法弄清楚哪些方法是可选的,哪些方法是必需的。

documentation for tp_as_sequence没有提及可选成员。

documentation for PySequenceMethods明确指出PySequenceMethodssq_itemsq_ass_itemsq_containssq_inplace_concat可以留给{{1} }。

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

  

如果sq_length NULL ,则按原样传递索引[...]

离开NULLsq_length的人。如果将它们也设置为sq_concat并不安全,我会感到惊讶,因为您可以对所有其他成员(包括sq_repeatNULL都这样做)对于序列的概念而言,它似乎比其他序列更基本),但是这种假设实际上是正确的吗?

如果让它们sq_item 是不安全的,那么仅通过设置一个错误来声明不支持这两个功能并返回sq_length来实现它们是安全的吗?

1 个答案:

答案 0 :(得分:1)

所有这些都是可选的。

sq_item设置为NULL意味着PySequence_Check()失败,因此这实际上不是一个序列-我不知道您要考虑的“可选”。 / p>

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

PySequence_ConcatPySequence_Repeat都具有以下形式的代码:

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

遍历其余功能并确保它们使用相同的模式非常简单。