Python 中的配置类

F.M*_*.F. 7 python oop configuration class

在面向对象编程中使用配置的pythonic方法是什么?

我想到了以下2个设置:

class Main():
    def __init__(self):
        self.config = ConfigClass("config_file.cfg")
        self.worker = WorkerClass(self.config.USER_NAME)
        self.worker2 = WorkerClass2(self.config)

    def run(self):
        self.worker.work()
        self.worker2.work()

class ConfigClass():
    def __init__(self, file_name):
        self.config = ConfigParser.ConfigParser()
        self.config.read(file_name)

    @property
    def USER_NAME(self):
        return self.config.get("USER", "NAME")

class WorkerClass():
    def __init__(self, user_name):
        self.user = user_name

    def work(self):
        print(self.user)

class WorkerClass2():
    def __init__(self, config):
        self.config = config
        self.user = self.config.USER_NAME

    def work(self):
        print(self.user)
Run Code Online (Sandbox Code Playgroud)

是首选传递配置对象还是仅传递所需的字符串,还是有更好的不同方法我没有提到?

提前致谢。

ali*_*m91 4

在 Flask 中,我们有工厂模式来在 diff 环境之间以简单灵活的方式初始化应用程序。使用python-dotenv包,允许您在.env文件中加载变量,该文件对于每个环境(dev、staging、prod...)都是唯一的。您可以使用相同的模式。

这是本地.env文件的示例,您希望使用 diff 数据库来进行 diff 目的(开发、测试...)

DATABASE_URI=postgresql://exercise_user:pass@127.0.0.1:5432/exercise_new_db
DATABASE_TEST_URI=postgresql://exercise_user:pass@127.0.0.1:5432/exercise_db_test
DATABASE_DOCKER_URI=postgresql://docker_exercise_user:pass@db/docker_exercise_db
Run Code Online (Sandbox Code Playgroud)

为了让软件知道正在运行哪个环境,请编写一个shell start.sh脚本来导出主环境变量

export ENV=development
python main.py
Run Code Online (Sandbox Code Playgroud)

这是一个配置文件的示例,其中您定义一个抽象类,其中包含所有环境都相同的所有配置,然后为每个环境创建一个从该基类继承的类,并且这些类包含唯一的配置。

from os import environ, path
from dotenv import load_dotenv, find_dotenv


basedir = path.abspath(path.dirname(__file__))
# here we we load environment variables from .env, must be called before init. class
load_dotenv(find_dotenv(), verbose=True)


class ConfigFactory(object):
    def factory():
        env = environ.get("ENV", "development")
        if env is 'testing':
            return Testing()
        elif env is 'development':
            return Development()
        elif env is 'docker':
            return Docker()
        elif env is 'production':
            return Production()


class Config:

    """Base config."""
    SQLALCHEMY_TRACK_MODIFICATIONS = False


class Development(Config):
    DEBUG = True
    TESTING = False
    SQLALCHEMY_DATABASE_URI = environ.get('DATABASE_URI')


class Testing(Config):
    DEBUG = True
    TESTING = True
    SQLALCHEMY_DATABASE_URI = environ.get('DATABASE_TEST_URI')


class Docker(Config):
    DEBUG = True
    TESTING = False
    SQLALCHEMY_DATABASE_URI = environ.get('DATABASE_DOCKER_URI')


class Production(Config):
    DEBUG = True
    TESTING = False
    SQLALCHEMY_DATABASE_URI = environ.get('DATABASE_URI')
Run Code Online (Sandbox Code Playgroud)

最后在主文件中导入配置类并调用它