Я работаю над документацией расширения Python C для определения новых типов и только что закончил Предоставление более точного управления атрибутами данных.
В этом разделе они изменяют код примера, чтобы гарантировать, что атрибуты first
и last
структуры Noddy
никогда не могут быть NULL
, например, инициализируя атрибуты пустыми строками в new
и добавляя геттеры и сеттеры, которые вызывают TypeError
, если пользователь пытается удалить или иным образом установить для этих атрибутов значение Null.
Кроме того (и суть моего вопроса), автор меняет все Py_XDECREF
на Py_DECREF
для этих атрибутов, заявляя, что:
Благодаря этим изменениям мы можем гарантировать, что первый и последний элементы никогда не будут равны NULL, поэтому мы можем удалить проверки на значения NULL почти во всех случаях. Это означает, что большинство вызовов Py_XDECREF() можно преобразовать в вызовы Py_DECREF(). Единственное место, где мы не можем изменить эти вызовы, — это делокатор, где существует вероятность того, что инициализация этих членов в конструкторе не удалась.
Мне кажется, что было бы безопаснее использовать Py_XDECREF
, учитывая, что Py_DECREF
приводит к segmentation fault
, если передается значение NULL
.
В чем преимущество использования Py_DECREF
вместо Py_XDECREF
?