Не удалось закрыть файл функциональным способом в python3.1? - PullRequest
5 голосов
/ 10 сентября 2010

Я написал строку кода, используя лямбду, чтобы закрыть список файловых объектов в python2.6:

map(lambda f: f.close(), files)

Это работает, но не в python3.1. Почему?

Вот мой тестовый код:

import sys

files = [sys.stdin, sys.stderr]

for f in files: print(f.closed)   # False in 2.6 & 3.1

map(lambda o : o.close(), files)

for f in files: print(f.closed)   # True in 2.6 but False in 3.1

for f in files: f.close()        

for f in files: print(f.closed)   # True in 2.6 & 3.1

Ответы [ 2 ]

6 голосов
/ 10 сентября 2010

map возвращает список в Python 2, но итератор в Python 3. Таким образом, файлы будут закрыты, только если вы перебираете результат.

Никогда не применяйте map или подобный «функционал»функции к функциям с побочными эффектами.Python не является функциональным языком и никогда не будет.Используйте петлю for:

for o in files:
    o.close()
4 голосов
/ 10 сентября 2010

Потому что map в Python 3 - это ленивый итератор. Цитируя документы :

Возвращает итератор, который применяет функцию к каждому элементу итерируемого, давая результаты.

например. в Python 2 map(f, seq) эквивалентно [f(i) for i in seq], но в Python 3 это (f(i) for i in seq) - слегка другой синтаксис, но очень разная семантика. Чтобы заставить работать вариант карты, вам нужно использовать итератор. Поэтому проще (и более идиоматично: у карты, понимания и генераторов не должно быть побочных эффектов!) Использовать явный цикл for.

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