Подтвердить что ты не робот

Имя файла vs file object как аргумент функции

Если функция принимает в качестве ввода имя текстового файла, я могу его реорганизовать, вместо этого возьму файл-объект (я называю его "потоком", есть ли лучшее слово?). Преимущества очевидны - функция, которая принимает поток в качестве аргумента:

  • гораздо проще написать unit test для, так как мне не нужно создавать временный файл только для теста
  • более гибкий, так как я могу использовать его в ситуациях, когда у меня как-то уже есть содержимое файла в переменной

Есть ли недостатки в потоках? Или я должен всегда реорганизовать функцию из аргумента имени файла в аргумент потока (если, конечно, файл является текстовым)?

4b9b3361

Ответ 1

В стандартной библиотеке python есть множество функций, которые принимают обе строки, которые являются именами файлов или открытыми файловыми объектами (я предполагаю, что вы называете "потоком" ). Это действительно не сложно создать декоратор, который вы можете использовать, чтобы ваши функции принимали один.

Один серьезный недостаток использования "потоков" заключается в том, что вы передаете его своей функции, а затем ваша функция читает ее - эффективно меняя ее. В зависимости от вашей программы восстановление этого состояния может быть беспорядочным, если это необходимо. (например, вам может понадобиться поместить код с помощью f.tell(), а затем f.seek().)

Ответ 2

... Вот как модуль xml.etree.ElementTree реализует функцию parse:

def parse(self, source, parser=None):
    close_source = False
    if not hasattr(source, "read"):
        source = open(source, "rb")
        close_source = True
    ...

Поскольку имя файла - это строка, у него нет метода read() (здесь проверяется любой атрибут этого имени); однако открытый файл имеет его. Четыре строки делают остальную часть кода общей. Единственное осложнение состоит в том, что вы должны помнить, следует ли закрыть файл-объект (здесь он называется source) или нет. Если он был open внутри, тогда он должен быть закрыт. В противном случае он не должен быть закрыт.

Собственно, файлы немного отличаются от кремов. Потоки потенциально бесконечны, в то время как файлы обычно отсутствуют (если какое-либо устройство не отображается, как если бы это был файл). Важным отличием при обработке является то, что вы никогда не сможете сразу прочитать поток в памяти. Вы должны обработать его кусками.