Буферный аргумент open (), похоже, игнорируется при работе с текстовым вводом / выводом - PullRequest
0 голосов
/ 17 января 2019

Аргумент буферизации встроенной функции open (), похоже, игнорируется при работе с текстовым вводом / выводом:

Текстовый ввод / вывод :

>>> 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$

Двоичный ввод / вывод :

>>> 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$

Почему? Это предполагаемое поведение?

1 Ответ

0 голосов
/ 17 января 2019

Я немного поковырялся. Действительно документация гласит:

buffering - необязательное целое число, используемое для установки политики буферизации. Пропуск 0, чтобы отключить буферизацию (разрешено только в двоичном режиме), 1, чтобы выбрать буферизацию строки (можно использовать только в текстовом режиме), и целое число> 1, чтобы указать размер в байтах куска буфера фиксированного размера ...

Следовательно, было бы разумно ожидать, что указание buffering=2 приведет к использованию буфера размером 2B (и файлы будут очищены при использовании этого буфера вверх). Однако в текстовом режиме это, кажется, (и документация не совсем ясно указывает, что в этом месте) влияет на подчеркивание BufferedWriter, но TextIOWrapper, чей write(), который вы в конечном итоге вызываете, по-прежнему «свое дело». .. Начиная с 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 не открыт (пока).

...