open() 的缓冲参数在处理文本时似乎被忽略 I/O

buffering argument of open() seemingly ignored when working with text I/O

在处理文本时似乎忽略了内置 open() 函数的缓冲参数 I/O:

正文I/O:

>>> f = open("myfile_text.txt", "w",buffering=2)
>>> f.write('1')
1
>>> f.write('1')
1
>>> f.write('1')
1

mymachine:~ myuser$ cat myfile.txt ; echo
mymachine:~ myuser$

二进制I/O:

>>> f = open("myfile_binary.txt", "wb",buffering=2)
>>> f.write('1'.encode())
1
>>> f.write('1'.encode())
1
>>> f.write('1'.encode())
1

mymachine:~ myuser$ cat myfile.txt ; echo
11
mymachine:~ myuser$

为什么?这是有意为之的行为吗?

我已经查了一下。事实上,文档指出:

buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate the size in bytes of a fixed-size chunk buffer...

因此,可以合理预期指定 buffering=2 会导致使用大小为 2B 的缓冲区(并在使用该缓冲区时查看刷新的文件)。然而,在文本模式下,它似乎(并且文档并没有真正清楚地表明在这个地方)影响下划线 BufferedWriter,但是 TextIOWrapper 你最终调用的 write() 仍然存在"its own thing"... 从 Python 3.7 开始,您告诉它不要这样做,并通过在您打开的文件上调用 f.reconfigure(write_through=True) 让它立即将写入传递给基础对象。


实际上 write_through 的所有代码和检查值都已经在 Python 3.6 中(我已经检查了 3.6.8)(事实上 _io_TextIOWrapper_write_impl,即_io.TextIOWrapper.write,在两个版本中是相同的),但是 write_through 属性还没有公开。