Скрипт Python Аннулирует Сотни Статей


Эта новость интересна не только потому, что она является уроком для всех нас, но и из-за того, что о ней сообщают как об “Ошибке в скрипте Python …” с предположением, что причиной проблемы является Python. Правда, на самом деле, гораздо интереснее.

Скрипт содержит около 1000 строк на Python, и, следовательно, это не маленькая программа. Он используется с 2014 года и был создан Патриком Уиллоуби, Мэтью Янсмой и Томасом Хойе для сбора необработанных данных и расчета сдвигов ЯМР. В журнале Nature Protocols этот предмет упоминается как сценарии “Уиллоуби-Хойе”. 

Все шло хорошо, пока исследователи из Гавайского университета не заметили, что они получают разные результаты, когда одни и те же данные и сценарии запускаются в разных операционных системах. Windows и версия macOS дали правильные ответы, но другая версия macOS и Ubuntu дала неправильные результаты. Это не то поведение, которое вы ожидаете от ошибки – ошибки обычно плохо себя ведут везде, а не только в определенных средах.

Так в чем же была проблема?

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

Виновником во многих новостных сообщениях считается модуль стандартной библиотеки Python glob, который возвращает список файлов, соответствующих спецификации файла/пути, включая подстановочные знаки. Он работает, но не возвращает результаты в указанном порядке. Это ошибка? Не совсем. Документация для glob начинается с предложения:

“Модуль glob находит все имена путей, соответствующие указанному шаблону, в соответствии с правилами, используемыми оболочкой Unix, хотя результаты возвращаются в произвольном порядке.”

Так что вряд ли это ошибка. В чем же тогда дело? Причинно-следственные пользователи, программисты, чья задача на самом деле не заключается в программировании, часто делают предположения о том, что разумно, и не думают о последствиях отказа от написания защитного кода. Могла ли документация оказать всем услугу, выделив жирным шрифтом “возвращаются в произвольном порядке”? Было бы разумнее навязать приказ, а не оставлять его как неопределенное поведение? Проблема усугубляется тем, что некоторые операционные системы, по-видимому, возвращают отсортированный список, что подтверждает предположения пользователей. Должна ли операционная система приложить больше усилий для возврата списка в произвольном порядке? 

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

Можно сказать, что лучшие навыки программирования помогли бы. Например, включение некоторых тестов, вероятно, выявило бы проблему, но так ли это? Если вы собираетесь написать тест, вам нужно знать о своих предположениях, и если бы программисты знали об этом критическом предположении, они бы заметили первое предложение в документации и избежали его. Требуется большая дисциплина, чтобы написать тесты на то, что, как вы знаете, должно быть правдой.

Если вы хотите поразмыслить над хорошими новостями, вы можете принять позицию, что наука, похоже, работает. Ошибка была обнаружена, и документы были отозваны/исправлены.

Как нам уменьшить вероятность того, что это произойдет снова?

Майк Джеймс-автор книги Programmer’s Python: Everything-это объект, опубликованный издательством I/O Press как часть библиотеки I Programmer. С подзаголовком “Что-то совершенно другое” это для тех, кто хочет понять более глубокую логику в подходе, который Python 3 применяет к классам и объектам.


Добавить комментарий