Это вопрос о правильной терминологии, используемой для «генераторов». Давайте посмотрим на файловый объект, возвращаемый встроенной функцией open()
.
1. Встроенная функция open()
, официальная документация
В официальной python документации функция open()
, как говорится, возвращает «файловый объект» и документацию для файловый объект на самом деле не говорит, что это за существо, кроме того, что у него есть методы read()
и write()
и
Файловые объекты также называются файловыми объектами или потоками .
?♂️ Что ж, это полезно, правда?
2. Слова из числа rnet
Вот несколько примеров, в которых файловый объект, возвращаемый open()
, называется генератором.
(выделено мной)
открыть () возвращает объект-генератор , который вы можете лениво перебирать строка за строкой
(принятый ответ с оценкой 400+, выделено мной)
Если файл построчный, файловый объект уже является ленивым генератором строк:
for line in open('really_big_file.dat'):
process_data(line)
(выделено мной)
с использованием 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)
использование генераторов?