我正在为 Python 编写 C 扩展。
我使用了非限制 API,最近改用了 Python 的限制 API。使用新的 API,我找不到获取全局
__debug__
变量值的方法。
Py_OptimizeFlag
变量,但该变量在有限的 API 中不可用。 (并且在 Python 3.12 中已弃用,因此我们无论如何都不会在有限的 API 中看到它)。
有人有解决办法吗?
我尝试了很多很多解决方案。我自己在文档中找不到任何有用的东西,谷歌也没有帮助。
__debug__
可在 __builtins__
中使用。所以你可以做
PyObject *builtins, *debug_str, *debug;
int flag;
builtins = PyEval_GetBuiltins();
if (!builtins) goto bad;
debug_str = PyUnicode_FromStringAndSize("__debug__", 9);
if (!debug_str) goto bad;
debug = PyObject_GetItem(builtins, debug_str);
Py_DECREF(debug_str);
if (!debug) goto bad;
flag = PyObject_IsTrue(debug);
Py_DECREF(debug);
bad: // decide how to behave in case of errors
最后的
flag
表示__debug__
是真还是假。您可能希望缓存此结果以提高速度。
(此代码是从 Cython 的实现复制的,但它应该是解决此问题的一种非常通用的方法。)