Подтвердить что ты не робот

Шаблон Python для совместного использования конфигурации по всему приложению

У меня есть приложение, состоящее из базового приложения, которое содержит несколько модулей. Базовое приложение считывает файл параметров в хэш конфигурации, и я хочу поделиться им по всем моим модулям.

В настоящее время я передаю "родительский" объект до модулей, а затем эти модули делают такие вещи, как self.parent.config, для получения конфигурации.

Однако, поскольку в иерархии модулей имеется несколько уровней, я обнаружил, что делаю такие вещи, как self.parent.parent.config, который начинает выглядеть плохо.

Каковы некоторые лучшие шаблоны для совместного использования объекта конфигурации в приложении и его модулях? Я думаю о наличии модуля "config", который в основном создает глобальную конфигурационную переменную, которая может быть установлена ​​базовым приложением, а затем импортирована и доступна другим модулем, но я не уверен, что использование таких глобальных таблиц является плохой практикой для других причины.

Я достаточно новичок в Python, поэтому будьте красивыми =)

4b9b3361

Ответ 1

Вы могли бы просто:

import config

и иметь глобальный конфигурационный модуль


выдержки из моих комментариев:

Вы всегда можете добавлять специальные правила для нечетных ситуаций, просто говоря oddValue if isOddSituation() else config.normalValue.

Если вы хотите, чтобы модули конфигурации были иерархически подклассы (как и мой другой ответ), вы можете представить конфигурацию как класс или вы можете использовать модуль copy и сделать мелкую копию и изменить ее, или вы можете использовать "словарь конфигурации", например:

import config as baseConfig
config = dict(baseConfig, overriddenValue=etc)

Это не имеет большого значения, в какой области вы находитесь.

Ответ 2

Отвечая на старый вопрос:

Просто используйте инъекцию зависимостей, предложенную @Reed Copsey здесь. Например.

class MyClass:
    def __init__(myConfig):
        self.myConfig = myConfig
        ...

    def foo():
        self.myConfig.getConfig(key)
        ...
        self.myConfig.setConfig(key,val)
        ...

...
# myConfig is your configuration management Module/Class
obj = SomeClass(myConfig)

Ответ 3

Я думаю, что по модулю вы на самом деле ссылаетесь на "класс/объект". Объект является экземпляром класса, например:

class MyClass(object):
    def __init__(self, ...):
        ...
    ...

myObject = MyClass()

Модуль - это импортируемый файл .py, например:

import mymodule

Кажется маловероятным, что все классы, которые вы создаете, захотят получить доступ к глобальной конфигурации. Однако, если вам действительно нужно, чтобы все в вашем приложении имело доступ к некоторым глобальным параметрам, вы можете поместить их в свой собственный модуль config:

myParam1 = 1
myParam2 = 2

а затем из любого модуля или любого объекта или в любом месте, если вы сделали import config, вы могли бы просто сказать print(config.myParam1)

В качестве альтернативы, если вы хотите, чтобы большая иерархия объектов позволяла всем предоставлять доступ к одному и тому же свойству, вам не нужно ссылаться на нее с помощью ручной настройки self.parent. Пока вы используете наследование, вы можете делать такие вещи, как:

class Parent(object):
    def __init__(self, theConfig):
        self.theConfig = theConfig

class Child(Parent):
    ...
    def method(self,...):
        print(self.theConfig)