Tôi đang làm việc thông qua tài liệu Mở rộng C của Python để xác định các loại mới và vừa hoàn thành phần Providing finer control over data attributes.Có lợi ích gì khi sử dụng Py_DECREF thay cho Py_XDECREF cho phần mở rộng của Python C không?
Trong phần này, họ thay đổi mã ví dụ để đảm bảo rằng các first
và last
thuộc tính của Noddy
struct bao giờ có thể NULL
, ví dụ bằng cách khởi tạo các thuộc tính thành các chuỗi sản phẩm nào trong new
và thêm getter và setter mà nâng TypeError
nếu người dùng cố gắng xóa hoặc đặt các thuộc tính này thành Null.
Thêm vào đó (và điểm của câu hỏi của tôi), tác giả thay đổi tất cả các Py_XDECREF
-Py_DECREF
cho những thuộc tính này, nói rằng:
Với những thay đổi này, chúng tôi có thể đảm bảo rằng các thành viên đầu tiên và cuối cùng là không bao giờ NULL vì vậy chúng tôi có thể loại bỏ các kiểm tra cho các giá trị NULL trong hầu như tất cả các trường hợp. Điều này có nghĩa rằng hầu hết các cuộc gọi Py_XDECREF() có thể được chuyển đổi sang các cuộc gọi Py_DECREF(). Nơi duy nhất chúng tôi không thể thay đổi các cuộc gọi này là trong deallocator, nơi có khả năng khởi tạo của các thành viên này thất bại trong constructor.
Dường như với tôi rằng nó sẽ chỉ được an toàn hơn để sử dụng Py_XDECREF
, cho rằng Py_DECREF
kết quả trong một segmentation fault
nếu nó thông qua một giá trị NULL
.
Lợi ích khi sử dụng Py_DECREF
qua Py_XDECREF
là gì?