PyImport_AppendInittab 如何会失败?

4 投票
1 回答
1444 浏览
提问于 2025-04-16 22:16

根据官方文档,PyImport_AppendInittab 这个函数在失败时会返回 -1。不过,文档并没有说明这个函数为什么会失败。

我想知道,这个函数的失败是否仅仅是因为程序员的错误(比如参数不正确、调用时机不对等),还是说也可能因为一些程序员无法控制的因素(比如 Python 没有安装)而失败。

我之所以问这个,是因为我想知道我应该用断言(assert)来处理这个问题,还是用异常(exception)。另外,如果我应该用异常来处理,有没有办法从 Python 的 API 中捕获到一个错误信息,说明这个函数调用失败的原因?

1 个回答

7

根据文档,PyImport_AppendInittab() 是一个方便的函数,它实际上是对 PyImport_ExtendInittab() 的封装。如果扩展表失败,它会返回 -1。还有,PyImport_ExtendInittab() 也会在“内存不足,无法扩展内部表”时返回 -1。这两个函数“应该在 Py_Initialize() 之前调用”。

因此,这些函数只有在程序内存不足时才会失败。我想它们也可能因为传入了无效的参数而失败,比如试图注册一个与已有模块同名的内置模块。不过后者的情况很容易避免,因为内置模块的名称是众所周知的。

总的来说,你可以认为返回 -1 就意味着“内存不足”,而这种情况不应该发生,因为这个函数只会在程序早期调用(在 Py_Initialize() 之前),而且扩展模块表所需的内存量相对较小。

如果 PyImport_AppendInittab() 失败,Python 不会提供错误信息。为了抛出一个有意义的异常,你可以报告你目前知道的信息:无法将模块 MODULENAME 添加到解释器的内置模块中

撰写回答