如何从pythoncc代码断言?

2024-09-27 22:19:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我试图将我的“库”代码分开(它应该与针对Python链接的代码分开),这样我就可以从其他C代码中使用它了。因此,我的Python方法是纯C代码的精简包装器。在

所以我不能在我的“库”代码中这样做:

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

纯Python污染了我的C代码。它也比简单的

^{pr2}$

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

Mac OS和Linux。在

救命啊!在

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


Tags: 方法代码用户if链接assert断言精简
3条回答

只需使用assert.h。distutils总是定义NDEBUG;它只对Windows上的微软msvc这样做,而且只有在从Python发布版本(而不是从Python调试构建)调用时才会这样做。在

要在自己的发布版本中定义NDEBUG,请将-D命令行选项传递给设置.py构建扩展

Edit:似乎默认情况下,NDEBUG是通过Python的Makefile的OPT设置定义的。要重置此项,请运行

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

setup.py中取消定义NDEBUG宏:

ext_modules = [Extension(
    ...
    undef_macros=['NDEBUG'],
)]

这将产生一个命令行

^{pr2}$

它(虽然丑陋)做了正确的事情,也就是说,它使断言保持启用状态。在

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

相关问题 更多 >

    热门问题