Какие члены PySequenceMethods являются необязательными? - PullRequest
0 голосов
/ 03 мая 2019

Я бы хотел, чтобы мои объекты расширения передавались в функцию Python len(), и я понимаю, что способ сделать это - реализовать sq_length член PySequenceMethods, но сейчас я не могуесть время, чтобы реализовать все методы протокола последовательности, и я не могу понять, какие из методов являются необязательными, а какие (если таковые имеются) требуются.

В документации для tp_as_sequence ничего не говорится о необязательных членах.

В документации для PySequenceMethods прямо указано, что sq_item, sq_ass_item, sq_contains, sq_inplace_concat и sq_inplace_repeat можно оставить равными NULL.

Кроме того, документация для sq_item подразумевает, что sq_length также можно оставить равным NULL:

Если sq_length равно NULL , индекс передается как [...]

, который оставляет sq_concat и sq_repeat,Я был бы удивлен, если бы не было безопасно также установить их на NULL, учитывая, что вы можете сделать это для всех остальных членов (включая sq_item и sq_length, оба из которых кажутся более фундаментальными дляконцепция последовательности, чем другие), но действительно ли это предположение правильно?

Если это не безопасно оставить их NULL, безопасно ли реализовать их просто, чтобы установить ошибкузаявляя, что эти две функции не поддерживаются и возвращают NULL?

1 Ответ

1 голос
/ 07 мая 2019

Все они являются необязательными.

Установка sq_item на NULL означает, что PySequence_Check() не удалась, и поэтому это не совсем последовательность - я не знаю, как «необязательно» выхочу учесть это.

Все PySequence_* методы проверяют на NULL указатели и просто устанавливают Python TypeError вместо сбоя, поэтому можно безопасно установить эти члены на NULL.Просто чтобы показать два, в которых вы не были уверены:

PySequence_Concat и PySequence_Repeat оба имеют код вида:

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

Довольно просто пройтись по остальным функциям и увидеть, что они используют один и тот же шаблон.

...