在问题上,How is file implemented?我了解了open()
方法的实现方式,但是我找不到在其实现中使用的_PyIO_str_readline
函数的定义位置。
答案 0 :(得分:1)
您的问题是您认为_PyIO_str_readline
是一个函数,但实际上它只是一个声明为here的全局变量(类型为PyObject *
):
extern PyObject *_PyIO_str_readline;
并定义了here:
PyObject *_PyIO_str_readline = NULL;
为NULL
,但顾名思义,任何字符串对象都可以(例如Python3中的unicode或Python2中的字节)。
_PyIO_str_readline
是一种缓存(在CPython中通常称为“中间字符串”-参见PyUnicode_InternFromString
),因此每次使用{readline“作为方法调用PyObject_CallMethodObjArgs
时,名称,则不能重新构造相应的对象。
_PyIO_str_readline
使用宏ADD_INTERNED
在PyInit__io
中初始化为其实际值:
/* Interned strings */
#define ADD_INTERNED(name) \
if (!_PyIO_str_ ## name && \
!(_PyIO_str_ ## name = PyUnicode_InternFromString(# name))) \
goto fail;
...
ADD_INTERNED(readline)
..
即_PyIO_str_readline
是值为readline
的Unicode对象。实际使用的readline
方法是在运行时解决的,取决于实际的self
。