Возвращает ли встроенный open () генератор? - PullRequest
1 голос
/ 13 июля 2020

Это вопрос о правильной терминологии, используемой для «генераторов». Давайте посмотрим на файловый объект, возвращаемый встроенной функцией open().

1. Встроенная функция open(), официальная документация

В официальной python документации функция open(), как говорится, возвращает «файловый объект» и документацию для файловый объект на самом деле не говорит, что это за существо, кроме того, что у него есть методы read() и write() и

Файловые объекты также называются файловыми объектами или потоками .

?‍♂️ Что ж, это полезно, правда?

2. Слова из числа rnet

Вот несколько примеров, в которых файловый объект, возвращаемый open(), называется генератором.

2.1. Как использовать генераторы и доходность в Python (Real python .com)

(выделено мной)

открыть () возвращает объект-генератор , который вы можете лениво перебирать строка за строкой

2.2. Ленивый метод чтения большого файла в Python?

(принятый ответ с оценкой 400+, выделено мной)

Если файл построчный, файловый объект уже является ленивым генератором строк:

for line in open('really_big_file.dat'):
    process_data(line)

2.3. Генераторы в Python - 5 вещей, которые нужно знать (medium.com)

(выделено мной)

с использованием open() метод открытия файла ЭЭГ создает файловый объект, который функционирует как генератор , который каждый раз выдает строку данных в виде строки.

Вероятно, можно легко найти больше таких примеров отовсюду на Inte rnet ..

3. Проверка, является ли объект файла, возвращаемый open() генератором

Следуя Как проверить, является ли объект объектом-генератором в python? , мы можем сформировать несколько тестов для файлового объекта :

In [7]: o = open(r'C:\tmp\test.csv')

In [8]: type(o)
Out[8]: _io.TextIOWrapper

In [9]: import inspect

In [10]: inspect.isgenerator(o)
Out[10]: False

In [12]: inspect.isgeneratorfunction(o)
Out[12]: False

In [13]: import types

In [14]: isinstance(o, types.GeneratorType)
Out[14]: False

Все эти тесты терпят неудачу, намекая, что файловый объект, возвращенный open(), не является генератором. Тем не менее, многие люди склонны называть его генератором.

4. Генераторы включены - или нет?

Итак, коллеги-питонисты, правильно ли сказано, что функция open() возвращает генератор? И включает ли следующее

for line in open('file.csv'):
    do_something(line)

использование генераторов?

1 Ответ

1 голос
/ 13 июля 2020

Функция python open возвращает объект TextIOWrapper , который не является генератором.

Причина, по которой вы можете выполнять итерацию по объекту, заключается в том, что он определяет __next__ метод. Вы можете найти его исходный код здесь , это поможет прояснить ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...