Каков наилучший способ прочитать значения конфигурации для программы на Python?Ссылка на класс Enum, определенный в другом файле, является общей? - PullRequest
0 голосов
/ 17 мая 2019

Например, я мог бы попробовать следующую конфигурацию:

class Defaults(Enum):
    a = 1
    b = 2

Тогда из моего основного файла я могу сослаться на него:

import myconfig
windowSize = Defaults.a

Это позволило бы мне изменять значения enum всякий раз, когда я хочу изменить работу моей программы. Это распространенный способ использования Enums в конфигурации Python?

1 Ответ

0 голосов
/ 30 мая 2019

Я думаю, вы спрашиваете, принято ли сохранять параметры конфигурации в качестве членов перечисления.В качестве более четкого примера:

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, который пользователи могут копировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...