使用有限API的Python C扩展:如何获取__debug__的值?

问题描述 投票:0回答:1

我正在为 Python 编写 C 扩展。

我使用了非限制 API,最近改用了 Python 的限制 API。使用新的 API,我找不到获取全局

__debug__
变量值的方法。

之前我使用了

Py_OptimizeFlag
变量,但该变量在有限的 API 中不可用。 (并且在 Python 3.12 中已弃用,因此我们无论如何都不会在有限的 API 中看到它)。

有人有解决办法吗?

我尝试了很多很多解决方案。我自己在文档中找不到任何有用的东西,谷歌也没有帮助。

python-c-api
1个回答
0
投票

__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 的实现复制的,但它应该是解决此问题的一种非常通用的方法。)

© www.soinside.com 2019 - 2024. All rights reserved.