Сначала это должен был быть комментарий, но для объяснения примера требовалось больше форматирования и места.;)
Если вы:
- знаете, что делаете,
- может оправдать использование
- , не используйте изменяемые аргументы по умолчанию (они слишком запутаны в том, как ведут себя, я не могу себе представить причину, по которой их использование будет когда-либо оправданным)
- не используйте глобальные изменяемые таблицы где-то рядом (изменение изменяемогосодержимое global И изменение содержимого изменяемого аргумента?)
- и, самое главное, документирование этой вещи,
эта вещь не должна причинять большой вред (но все жеможет укусить вас, если вы только думаете вы знаете, что делаете, но на самом деле это не так) и могут быть полезны!
Пример:
Я работал со скриптами (созданными другими программистами), которые использовали изменяемые аргументы.В данном случае: словари.
Предполагалось, что скрипт запускается с потоками, но также допускает однопоточный запуск.Использование словарей вместо возвращаемых значений устранило разницу в получении результата в одно- и многопотоковых запусках:
Обычно значение, возвращаемое потоком, инкапсулировано, но мы все равно использовали значение только после .join
и не делалине заботятся о потоках, убитых исключениями (однопотоковый запуск был в основном для отладки / локального запуска).
Таким образом, словари (более одного в одной функции) использовались для добавления новых результатов при каждом запускебез необходимости собирать возвращаемые значения вручную и фильтровать их (вызываемая функция знала, в какой файл нужно помещать результат, использовала блокировку для обеспечения безопасности потока).
Было ли это "хорошо" или«неправильный» способ делать вещи?
По-моему, это был питонический способ ведения дел:
- , легко читаемый в обеих формах - работа с результатом была одинаковой в одно- имногопоточные
- данные были «автоматически» красиво отформатированы - в отличие от удаления из них результирующих результатов, их ручного сбора и анализа
- и довольно легко понять - с первым и последним пунктом в моемсписок выше;)