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)
是首选传递配置对象还是仅传递所需的字符串,还是有更好的不同方法我没有提到?
提前致谢。
在 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)
最后在主文件中导入配置类并调用它
| 归档时间: |
|
| 查看次数: |
3598 次 |
| 最近记录: |