【问题标题】:How does Python's `file.read` function figure out the size of the file?Python 的 `file.read` 函数如何计算文件的大小?
【发布时间】:2013-12-16 06:01:31
【问题描述】:

我正在查看Python-2.7.6 的源代码来解决这个问题。

Objects/fileobject.c,第1052行,有一个函数叫file_read,我猜它对应于Python中文件对象上的函数read

在同一文件的第 1067 行,我看到以下行。请注意,bytesrequested 在函数的下方用于决定分配用于存储文件的缓冲区的大小。

 if (!PyArg_ParseTuple(args, "|l:read", &bytesrequested))

看起来请求的字节数以某种方式编码在args 中,其类型为PyObject*。因此,继续搜索的自然位置是找出调用file_read 的位置。

但是,我在整个 Python 源代码树(递归 grep)中找不到实际调用 file_read 的任何位置,因此我无法继续跟踪以了解实际计算 bytesrequested 的方式。 file_read 在源代码树的不同部分是否以不同的名称被调用?

【问题讨论】:

  • bytesrequests 不是来自用户态 Python 吗?见:help(file.read)
  • 糟糕,我完全忘记检查了。我一直认为file.read 不带参数,因为我从未见过带参数调用它。
  • 确实如此。可选参数。我怀疑你会发现更多的 C 源代码来检查是否也传递了 Null/None 参数:)

标签: python c python-2.7 cpython


【解决方案1】:

line 2114

file_read 是 python 的 file.read 方法。 C 代码中的args 是您传递给file.read 的参数。 bytesrequested 是您作为参数传递给 file.read 的任何内容

with open('file') as fin:
    fin.read(5)  # bytesrequested will be 5.

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多