首页 > 解决方案 > C Python实现上的函数`_PyIO_str_readline`的实现在哪里?

问题描述

关于这个问题,文件是如何实现的?我了解了open()方法是如何实现的,但是我找不到_PyIO_str_readline在其实现中使用的函数是在哪里定义的。

  1. https://docs.python.org/3/c-api/object.html
  2. https://github.com/python/cpython/search?q=_PyIO_str_readline

标签: cpython

解决方案


你的问题是你认为,_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实际情况。


推荐阅读