2011-07-26 20 views
2

根据官方文档,PyImport_AppendInittab将在失败时返回-1。但是,它并没有说明为什么这个功能会失败。PyImport_AppendInittab如何失败?

我想知道它是否只能由于程序员的错误而失败(错误的参数,没有在正确的时间被调用等),或者它也可能因为其他因素而失败程序员的控制(就像没有安装Python一样)。

我在问,因为我想知道我是否应该用断言或异常来处理这个问题。此外,万一我应该用异常来处理它,有什么办法让我从Python API中捕获一条错误消息,指出函数调用失败的原因?

回答

5

根据文档,PyImport_AppendInittab()是围绕PyImport_ExtendInittab()的便利包装,并返回-1“如果表不能被扩展”。此外,PyImport_ExtendInittab()返回-1“如果内存不足以分配内存扩展表”。这两个函数“应在Py_Initialize()之前调用”。

因此,如果程序内存不足,这些函数只能失败。我想他们也可能在提供无效参数时失败,例如当试图注册一个与现有名称相同的内置模块时。后一种情况很容易避免,因为内置模块的名称是众所周知的。总之,你可以假设-1的返回值意味着“内存不足”,并且这种情况不会发生,因为函数只在进程的早期被调用(在Py_Initialize()之前),加上所需的内存量对于模块表来说是相当小的。

如果PyImport_AppendInittab()失败,Python不会提供错误字符串。要抛出一个有意义的异常,您只需报告此时知道的信息:未能将MODULENAME模块添加到解释器的内置模块中。