[Python-Dev] Inconsistency of PyModule_AddObject() (original) (raw)

Serhiy Storchaka storchaka at gmail.com
Wed Apr 27 14:02:19 EDT 2016


On 27.04.16 15:31, Hrvoje Niksic wrote:

On 04/27/2016 09:14 AM, Serhiy Storchaka wrote:

There are three functions (or at least three documented functions) in C API that "steals" references: PyListSetItem(), PyTupleSetItem() and PyModuleAddObject(). The first two "steals" references even on failure, and this is well known behaviour. But PyModuleAddObject() "steals" a reference only on success. There is nothing in the documentation that points on this. This inconsistency has caused bugs (or, more fairly, potential leaks) before, see http://bugs.python.org/issue1782

Glad to hear I'm not the first faced with this problem.

Unfortunately, the suggested Python 3 change to PyModuleAddObject was not accepted.

Bad. May be it happened because of the risk to break third-party working code.

I propose a gradual path to change PyModule_AddObject.

1. Add a new function PyModuleAddObject2(), that steals a reference even on failure. This sounds like a good idea, except the name could be prettier :), e.g. PyModuleInsertObject. PyModuleAddObject could be deprecated.

I have decided to not introduce new public function. But just control the behavior of old function with the macro. This needs minimal changes to user code.



More information about the Python-Dev mailing list