Используйте переменные конфигурации проекта в разных скриптах Python - PullRequest
0 голосов
/ 31 января 2020

Я работаю над проектом с несколькими каталогами, каждый из которых содержит несколько python сценариев. И это включает использование определенных ключевых параметров , которые я передаю, используя yaml файл конфигурации.

В настоящее время используется метод (я бы сказал, что это наивно, как) он просто анализирует yaml в python словарь, который затем импортируется в другие скрипты и осуществляется доступ к значениям.

Из того, что я мог найти, есть:

  1. Abseil библиотека, которая может использоваться для доступа к флагам в разных сценариях, но ее использование громоздко.
  2. Другой подход с использованием класса (предпочтительно синглтона), помещение в него всех глобальных переменных и представление экземпляра этого класса в других сценариях.

Я хотел спросить, есть ли какая-либо другая библиотека, которая может использоваться для этой цели? И какая методология pythoni c наиболее с этим справляется?

Любая помощь будет очень признательна. Спасибо!

1 Ответ

1 голос
/ 07 марта 2020

Чтобы сделать глобальные значения доступными для модулей, я использую метод Class (singleton).

Код, который я перечислю ниже, также находится в моем Gisthub https://gist.github.com/auphofBSF/278206afff675cd30377f4894a5b2b1d

Мой универсальный c GlobalValues ​​синглтон-класс и использование следующие. Этот класс находится в подкаталоге ниже основного. В примере использования, который я также прикрепляю, я помещаю класс GlobalValues ​​в файл globals.py в папке myClasses

class GlobalValues:
    """
    a Singleton class to serve the GlobalValues
    USAGE: (FirstTime)
    from myClasses.globals import GlobalValues
    global_values = GlobalValues()
    global_values.<new value> = ...
    ... = global_values.<value>

    USAGE: (Second and n'th time, in same module or other modules)
        NB adjust `from myClasses.globals` dependent on relative path to this module 
    from myClasses.globals import GlobalValues 
    global_values = GlobalValues.getInstance()
    global_values.<new value> = ...
    ... = global_values.<value>


    """
    __instance = None
    DEFAULT_LOG_LEVEL="CRITICAL"

    @staticmethod
    def get_instance():
        """ Static access method. """
        if GlobalValues.__instance == None:
            GlobalValues()
        return GlobalValues.__instance
    def __init__(self):
        """ Virtually private constructor. """
        if GlobalValues.__instance != None:
            raise Exception("This class is a singleton! once created use global_values = Glovalvalues.get_instance()")
        else:
            GlobalValues.__instance = self

Мой пример использования выглядит следующим образом

Файл примера layout

        <exampleRootDir>
            Example_GlobalValues_Main.py  #THIS is the main 
            myClasses # A folder
                globals.py #for the singleton class GlobalValues 
                exampleSubModule.py # demonstrates use in submodules

Example_GlobalValues_Main.py

print(
    """ 
        ----------------------------------------------------------
        Example of using a singleton Class as a Global value store
        The files in this example are in these folders

        file structure:
        <exampleRootDir>
            Example_GlobalValues_Main.py  #THIS is the main 
            myClasses # A folder
                globals.py #for the singleton class GlobalValues 
                exampleSubModule.py # demonstrates use in submodules
        -----------------------------------------------------------
    """
)

from myClasses.globals import GlobalValues

globalvalues = GlobalValues() # THe only place an Instance of GlobalValues is created

print(f"MAIN: global DEFAULT_LOG_LEVEL is {globalvalues.DEFAULT_LOG_LEVEL}")
globalvalues.DEFAULT_LOG_LEVEL = "DEBUG"
print(f"MAIN: global DEFAULT_LOG_LEVEL is now {globalvalues.DEFAULT_LOG_LEVEL}")

#Add a new global value:
globalvalues.NEW_VALUE = "hello"

#demonstrate using global modules in another module
from myClasses import exampleSubModule

print(f"MAIN: globalvalues after opening exampleSubModule are now {vars(globalvalues)}")

print("----------------- Completed -------------------------------")

exampleSubModule.py выглядит следующим образом и находится в папке myClasses


"""
Example SubModule using the GlobalValues Singleton Class
"""
# observe where the globals module is in relation to this module . = same directory
from .globals import GlobalValues

# get the singleton instance of GlobalValues, cannot instantiate a new instance
exampleSubModule_globalvalues = GlobalValues.get_instance() 

print(f"exampleSubModule: values in GlobalValues are: {vars(exampleSubModule_globalvalues)}")

#Change a value
exampleSubModule_globalvalues.NEW_VALUE = "greetings from exampleSubModule"  
#add a new value
exampleSubModule_globalvalues.SUBMODULE = "exampleSubModule"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...