Я думаю, вы спрашиваете, принято ли сохранять параметры конфигурации в качестве членов перечисления.В качестве более четкого примера:
class Defaults(Enum):
window_width = 600
window_height = 480
font_size = 14
Технически, я думаю, это сработало бы, но какое преимущество дает перечисление?Enum
полезно для предоставления вариантов выбора для выбора.Если вы действительно хотите это сделать, я думаю, что простой класс, класс данных или просто переменные уровня модуля будут менее запутанными.Файл конфигурации settings.py
в Django, кажется, наиболее близок к вашей идее, которую я видел в обычном использовании.
Ваш более широкий вопрос заключается в том, как прочитать значения конфигурации для программы на Python.Лично мне нравится стиль, рекомендованный Приложение с двенадцатью факторами .
Приложение с двенадцатью факторами сохраняет конфигурацию в переменных среды (часто сокращается до env vars или env ).Env vars легко переключать между развертываниями без изменения кода;в отличие от конфигурационных файлов, существует небольшая вероятность того, что они случайно попадут в репозиторий;и в отличие от пользовательских файлов конфигурации или других механизмов конфигурации, таких как Java System Properties, они являются независимым от языка и ОС стандартом.
Самый гибкий способ, который я нашел, - это использование argparse
и использовать переменные окружения в качестве значений по умолчанию.Таким образом, вы можете переопределить переменные окружения в командной строке.Будьте осторожны при вводе паролей в командной строке, потому что другие пользователи могут видеть аргументы вашей командной строки в списке процессов.
Вот пример , который использует argparse
и переменные среды:
def parse_args(argv=None):
parser = ArgumentParser(description='Watch the raw data folder for new runs.',
formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument(
'--kive_server',
default=os.environ.get('MICALL_KIVE_SERVER', 'http://localhost:8000'),
help='server to send runs to')
parser.add_argument(
'--kive_user',
default=os.environ.get('MICALL_KIVE_USER', 'kive'),
help='user name for Kive server')
parser.add_argument(
'--kive_password',
default=SUPPRESS,
help='password for Kive server (default not shown)')
args = parser.parse_args(argv)
if not hasattr(args, 'kive_password'):
args.kive_password = os.environ.get('MICALL_KIVE_PASSWORD', 'kive')
return args
Установка этих переменных среды может быть немного запутанной, особенно для системных служб.Если вы используете systemd, посмотрите на сервисный блок и будьте осторожны, чтобы использовать EnvironmentFile
вместо Environment
для любых секретов.Environment
значения могут быть просмотрены любым пользователем с systemctl show
.
Я обычно делаю значения по умолчанию полезными для разработчика, работающего на их рабочей станции, чтобы они могли начать разработку без изменения какой-либо конфигурации.
Если вы хотите поместить параметры конфигурации в файл settings.py
, просто будьте осторожны, чтобы не передать этот файл в систему контроля версий.Я часто фиксирую файл settings_template.py
, который пользователи могут копировать.