Шаблон Python для совместного использования конфигурации по всему приложению
У меня есть приложение, состоящее из базового приложения, которое содержит несколько модулей. Базовое приложение считывает файл параметров в хэш конфигурации, и я хочу поделиться им по всем моим модулям.
В настоящее время я передаю "родительский" объект до модулей, а затем эти модули делают такие вещи, как self.parent.config, для получения конфигурации.
Однако, поскольку в иерархии модулей имеется несколько уровней, я обнаружил, что делаю такие вещи, как self.parent.parent.config, который начинает выглядеть плохо.
Каковы некоторые лучшие шаблоны для совместного использования объекта конфигурации в приложении и его модулях? Я думаю о наличии модуля "config", который в основном создает глобальную конфигурационную переменную, которая может быть установлена базовым приложением, а затем импортирована и доступна другим модулем, но я не уверен, что использование таких глобальных таблиц является плохой практикой для других причины.
Я достаточно новичок в Python, поэтому будьте красивыми =)
Ответы
Ответ 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)
Ответ 4
Взгляните на это. Это может помочь вам:
https://gist.github.com/dgarana/c052a3287629dd7c0b0c9d7921081e9d