Примечание заранее: в Интернете я нашел (очень!) Тесно связанные вопросы и информацию, но ничего, что вполне решает проблему, с которой я сталкиваюсь.
Эта проблема относится к этой статье, в частности, опция list-all-files, которая включает использование функции next()
на os.walk()
.Чтобы сузить его, я создал этот трехстрочный скрипт:
import os
allFiles = next(os.walk(os.path.dirname(__file__)))[2]
print(allFiles)
Когда я запускаю этот скрипт на 32-битной версии Python 3.7.2 (для Windows), он завершается нормально и распечатывает все файлыв папке скрипта.
Но когда я запускаю его на 64-битной версии 3.7.2 (также для Windows), он заканчивается трассировкой, указывающей исключение StopIteration:
Traceback (most recent call last):
File "test.py", line 3, in <module>
allFiles = next(os.walk(os.path.dirname(__file__)))[2]
StopIteration
Вопрос не в том, почему я получаю это исключение?потому что ответ очевиден, я получаю его, потому что в next()
закончились элементы.
Скорее вопрос: "Почему этот код прекрасно работает на 32-битной версии Python, ноне в 64-битной версии? " И, кроме того, " Какая версия демонстрирует правильное / намеченное поведение? "
Единственный совет, который я нашел, было это утверждение в документации по Python :
Изменено в версии 3.7: Включить PEP 479 для всего кода по умолчанию: ошибка StopItra, возникающая в генераторе, преобразуется в RuntimeError.
Похоже, что запись для PEP 479 говорит о том, что поведение, которое я вижу в 64-битной версии, было преднамеренным изменением в 3.7, чтобы уменьшить неожиданности и предотвратить неясные и скрытые ошибки.Если я правильно читаю, то 64-битная версия верна, а 32-битная неверна.Хотя у меня возникли проблемы с пониманием этого, тем более что в статье , которая в первую очередь привела меня к этой проблеме, представляет использование next(os.walk(...))
в качестве простой опции, которая всегда будет работать ... но сейчас, это не так.
Эта запись на github , похоже, относится к этой проблеме - и если я прав в этом, это также означает, что я не единственный, кто былудивлен этим изменением, чтобы предотвратить неожиданности.