PyId_ 变量如何在 CPython 中解析?

问题描述

我已经在 cpython 源代码中看到了 PyId_ 变量的用法。我无法追溯到其中任何一个的定义。

示例包括 PyId___name__ 和其他。

谁或什么将它们解析为字符串?我在 cpython 源代码上看到了一个带有 kNown.csv 文件的 C 分析器,列出了其中的大部分(但不是全部)。不确定是否相关。

解决方法

正如@jasonharper 所说,PyId_ 变量是使用 _Py_IDENTIFIER 定义的,通常位于源文件的顶部。

片段:

#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname,#varname)

_Py_IDENTIFIER 使用 stringizing and token-parsing 运算符工作,允许您以编程方式定义新变量。

然后将字符串值驻留以提高内存效率。