我怎样才能从Python C代码断言?

时间:2010-12-27 20:24:01

标签: python c distutils python-c-api python-c-extension

我正在用C编写Python类,我想在我的调试代码中加入断言。 assert.h很适合我。这只会放入调试编译中,因此不会出现影响Python代码用户的断言失败*。

我正在尝试划分我的'库'代码(它应该与链接到Python的代码分开),所以我可以从其他C代码中使用它。因此,我的Python方法是我的纯C代码的薄包装。

所以我不能在我的'库'代码中执行此操作:

if (black == white)
{
    PyErr_SetString(PyExc_RuntimeError, "Remap failed");
}

因为这会使用Python污染我的纯C代码。它也比简单的

更加丑陋
assert(black != white);

我相信Distutils编译器总是设置NDEBUG,这意味着即使在调试版本中我也不能使用assert.h

Mac OS和Linux。

帮助!

*我听过一个论点反对在Python中调用的C代码断言。

3 个答案:

答案 0 :(得分:8)

只需使用assert.h即可。 distutils始终定义NDEBUG是一个神话;它只适用于Windows上的Microsoft的msvc,只有在从Python发布版本(而不是Python调试版本)调用时才会这样做。

然后在您自己的发布版本中定义NDEBUG,将-D命令行选项传递给setup.py build_ext。

编辑:似乎NDEBUG默认是通过Python的Makefile的OPT设置定义的。要重置此功能,请运行

OPT="-g -O3" python setup.py build

答案 1 :(得分:2)

针对不同情况创建自己的宏,例如myassert()。或者创建一个宏,它检查一个全局变量以查看宏是用于Python代码还是“普通”C. Python模块入口点必须将此变量设置为true,或者您可以使用函数指针,一个用于Python代码,C代码的另一个默认代码。

答案 2 :(得分:2)

setup.py

中取消定义NDEBUG宏
ext_modules = [Extension(
    ...
    undef_macros=['NDEBUG'],
)]

这将产生类似

的命令行
gcc ... -DNDEBUG ... -UNDEBUG ...

哪个(虽然丑陋)做正确的事情,即它保持启用断言。