我希望允许将扩展对象传递到Python的len()
函数中,并且我知道实现此方法的方法是实现sq_length
的{{1}}成员,但是现在,我没有时间实现序列协议的 all 方法,而且我无法弄清楚哪些方法是可选的,哪些方法是必需的。
documentation for tp_as_sequence
没有提及可选成员。
documentation for PySequenceMethods
明确指出PySequenceMethods
,sq_item
,sq_ass_item
,sq_contains
和sq_inplace_concat
可以留给{{1} }。
此外,documentation for sq_item
意味着sq_inplace_repeat
也可以留给NULL
:
如果
sq_length
为 NULL ,则按原样传递索引[...]
离开NULL
和sq_length
的人。如果将它们也设置为sq_concat
并不安全,我会感到惊讶,因为您可以对所有其他成员(包括sq_repeat
和NULL
都这样做)对于序列的概念而言,它似乎比其他序列更基本),但是这种假设实际上是正确的吗?
如果让它们sq_item
是不安全的,那么仅通过设置一个错误来声明不支持这两个功能并返回sq_length
来实现它们是安全的吗?
答案 0 :(得分:1)
所有这些都是可选的。
将sq_item
设置为NULL
意味着PySequence_Check()
失败,因此这实际上不是一个序列-我不知道您要考虑的“可选”。 / p>
所有PySequence_*
方法都将检查NULL
指针,它们只会设置Python TypeError
而不是崩溃,因此将这些成员设置为NULL
是安全的。只是为了表明您不确定的两个:
PySequence_Concat
和PySequence_Repeat
都具有以下形式的代码:
if (m && m->sq_repeat)
return m->sq_repeat(o, count);
遍历其余功能并确保它们使用相同的模式非常简单。