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

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

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 19 апреля 2011

Вы можете просто:

import config

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


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

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

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

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

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

3 голосов
/ 13 сентября 2013

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

Просто используйте внедрение зависимостей, как предложено @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)
0 голосов
/ 14 июля 2017

Взгляните на это.Это может помочь вам: https://gist.github.com/dgarana/c052a3287629dd7c0b0c9d7921081e9d

0 голосов
/ 19 апреля 2011

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

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)
...