На самом деле, это не ошибка дизайна, и это происходит не из-за внутренних компонентов, а из-за производительности. Это происходит просто из-за того, что функции в Python являются первоклассными объектами, а не только частью кода.
Как только вы додумаетесь до этого, тогда это полностью имеет смысл: функция - объект, оцениваемый по его определению; параметры по умолчанию являются «данными-членами», и поэтому их состояние может меняться от одного вызова к другому - точно так же, как и к любому другому объекту.
В любом случае Effbot имеет очень хорошее объяснение причин это поведение в Значения параметров по умолчанию в Python . Я нашел это очень ясным, и я действительно предлагаю прочитать его, чтобы лучше узнать, как работают объекты функций.
1) Я бы рекомендовал максимально избегать переменных окружения.
Плюсы переменных окружения
Недостатки переменных окружения
Мое мнение
They are global and accessible from anywhere, which is less elegant from architectural point of view, but limits the amount of code
напоминает мне об обоснованиях использования глобальных переменных;) . Мои шрамы из первых рук испытывают ужасы перегрузки окружающей среды
2 ) Ограничения
Если бы я нажимал пределы того, что может удерживать командная строка, или то, что может обрабатывать среда, я бы реорганизовал немедленно.
Я использовал JSON в прошлое для приложения с командной строкой, для которого потребовалось много параметров. Было очень удобно использовать словари и списки, а также строки и номера. Приложение заняло всего несколько аргументов командной строки, одним из которых было расположение файла JSON.
Преимущества этого подхода
What won't fit into command line parameters?
), такие как списки Примечание. Я хочу отличить это от подхода .config-file - это не для хранения пользовательская конфигурация. Может быть, я должен назвать это «параметром командной строки», потому что я использую его для программы, для которой требуется множество значений, которые не подходят хорошо в командной строке.
3 ) Переносимость решения: я не очень разбираюсь в различиях между Mac, ПК и Linux в отношении переменных окружения и аргументов командной строки, но могу вам сказать:
Да, я знаю - это было не очень полезно. Прости. Но ключевым моментом является то, что вы можете ожидать, что разумное решение будет переносимым, хотя вы определенно хотите проверить это для своих программ (например, являются ли аргументы командной строки аргументами с учетом регистра на любых платформах? На всех платформах? Я не знаю ).
Одна последняя точка:
Как отметил Томаш, это не имеет значения для большинства приложений, в которых были получены параметры.
Я думаю, что на этот вопрос уже довольно хорошо ответил, но я чувствую, что он заслуживает обновления 2018 года. Я чувствую, что неизменное преимущество экологических переменных заключается в том, что они обычно требуют меньше котельного табличного кода для работы. Это делает более понятным код. Однако серьезным недостатком является то, что они удаляют слои изоляции из разных приложений, работающих на одной машине. Я думаю, что именно здесь Докер действительно сияет. Мой любимый шаблон дизайна - исключительно использовать переменные среды и запускать приложение внутри контейнера Docker. Это устраняет проблему изоляции.
Вы должны абстрагировать параметры чтения с помощью шаблона Strategy . Создайте абстракцию с именем ConfigurationSource
, имеющую метод readConfig(key) -> value
(или возвращающий некоторый объект / структуру Configuration
) со следующими реализациями:
CommandLineConfigurationSource
EnvironmentVariableConfigurationSource
WindowsFileConfigurationSource
- загрузка из файла конфигурации из C:/Document and settings...
WindowsRegistryConfigurationSource
NetworkConfigrationSource
UnixFileConfigurationSource
- - загрузка из файла конфигурации из /home/user/...
DefaultConfigurationSource
- значения по умолчанию Вы также можете использовать Цепь ответственности для привязки источников в различных конфигурациях, таких как: если аргумент командной строки не указан, попробуйте переменную окружения, и если все остальное не выполнено, верните defauls.
Ad 1. Этот подход не только позволяет абстрагировать конфигурацию чтения, но вы можете легко изменить базовый механизм без какого-либо влияния на код клиента. Кроме того, вы можете использовать сразу несколько источников, отступать или собирать конфигурацию из разных источников.
Ad 2. Просто выберите, какая из реализаций подходит. Конечно, некоторые записи конфигурации не подходят, например, к аргументам командной строки.
Объявление 3. Если некоторые реализации не переносимы, имейте два, один молча игнорируемый / пропущенный, если он не подходит для данной системы.
rem
и set
. Если вы создаете процесс, вы просто setenv
хотите, прежде чем spawnl
-инг. Это удобно, читаемо и гибко. Почему вы используете .config вместо среды? Это вопрос. i>
– Janusz Lenar
16 September 2011 в 12:26