PySequenceMethods 的哪些成员是可选的?
Which members of PySequenceMethods are optional?
我想让我的扩展对象被传递到 Python 的 len()
函数中,我知道这样做的方法是实现 sq_length
成员PySequenceMethods
,但现在我没有时间实现 all 序列协议的方法,我无法弄清楚哪些方法是可选的,哪些(如果有的话)是必需的。
documentation for tp_as_sequence
没有提及任何关于可选成员的内容。
documentation for PySequenceMethods
明确表示sq_item
、sq_ass_item
、sq_contains
、sq_inplace_concat
、sq_inplace_repeat
可以留给NULL
.
此外,documentation for sq_item
意味着 sq_length
也可以留给 NULL
:
If sq_length
is NULL, the index is passed as is [...]
剩下 sq_concat
和 sq_repeat
。如果将它们也设置为 NULL
不安全,我会感到惊讶,因为您可以对所有其他成员(包括 sq_item
和 sq_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);
浏览其余函数并发现它们使用相同的模式非常简单。
我想让我的扩展对象被传递到 Python 的 len()
函数中,我知道这样做的方法是实现 sq_length
成员PySequenceMethods
,但现在我没有时间实现 all 序列协议的方法,我无法弄清楚哪些方法是可选的,哪些(如果有的话)是必需的。
documentation for tp_as_sequence
没有提及任何关于可选成员的内容。
documentation for PySequenceMethods
明确表示sq_item
、sq_ass_item
、sq_contains
、sq_inplace_concat
、sq_inplace_repeat
可以留给NULL
.
此外,documentation for sq_item
意味着 sq_length
也可以留给 NULL
:
If
sq_length
is NULL, the index is passed as is [...]
剩下 sq_concat
和 sq_repeat
。如果将它们也设置为 NULL
不安全,我会感到惊讶,因为您可以对所有其他成员(包括 sq_item
和 sq_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);
浏览其余函数并发现它们使用相同的模式非常简单。