cpython - C Python实现上的函数`_PyIO_str_readline`的实现在哪里?
问题描述
关于这个问题,文件是如何实现的?我了解了open()
方法是如何实现的,但是我找不到_PyIO_str_readline
在其实现中使用的函数是在哪里定义的。
解决方案
你的问题是你认为,_PyIO_str_readline
是一个函数,但实际上它只是一个全局变量(类型PyObject *
),它在这里声明:
extern PyObject *_PyIO_str_readline;
并在这里定义:
PyObject *_PyIO_str_readline = NULL;
是NULL
,但顾名思义,任何字符串对象都可以(即 Python3 中的 unicode 或 Python2 中的字节)。
_PyIO_str_readline
是一种缓存(在 CPython 中通常称为“interned string” - 请参阅PyUnicode_InternFromString
),因此每次PyObject_CallMethodObjArgs
以“readline”作为方法名称调用时,都不能重新构造相应的对象。
_PyIO_str_readline
使用宏初始化PyInit__io
为其实际值ADD_INTERNED
:
/* Interned strings */
#define ADD_INTERNED(name) \
if (!_PyIO_str_ ## name && \
!(_PyIO_str_ ## name = PyUnicode_InternFromString(# name))) \
goto fail;
...
ADD_INTERNED(readline)
..
ie_PyIO_str_readline
是一个带有 value 的 unicode 对象readline
。实际使用哪种readline
方法,在运行时解决,取决于self
实际情况。
推荐阅读
- c# - 如何根据其值更改WPF数据网格中单元格的背景颜色
- css - 将 css-loader style-loader 与 webpack 一起使用时,我的 css 文件被剪切(截断)
- c# - 如何使用预处理器知道 C# 的版本?
- php - $dom->loadHTMLFile() 在 WordPress 主题中挂断
- bash - 用于批处理和 TCL 模式的 Vivid Vivado sed 着色
- ios - 无法快速从包含多个锚点的字符串构造 URL
- javascript - Android webview的ondestroy运行后JS是否可以继续运行?
- selenium - 在 maven Robot 框架项目中调用 Java 库时出错
- c - 尽管指定了超时,但 poll() 会无限期等待
- java - Sentry ValidatorException:PKIX 路径构建失败