Python定义常量,设置config.py文件

写在前面:学习之作,诸多不足,共同进步。

最近工作涉及到算法的部署上线,

一个项目中,往往会有一些常量定义,比如主机ip,数据库连接,全局变量这种基础的需求。

所谓常量,就是一旦设定,基本上不再进行改动,或者很少进行改动。

常规来讲,都是字母大写,如果有分割的话,会用下划线进行分割。

比如我之前在JAVA中

class Config{
    USER_NUMBER = 6
    IP_ADDRESS = 192.168.122.4
}

在python中没有(我简直不敢相信我的眼睛.jpg).

查了下相关资料,需要自己定义。

很好玩,也很有意思。需要override(重写)2个函数就可以了。

下面是代码:


class Config(object):
    class ConstError(TypeError):
        pass
    class ConstCaseError(ConstError):
        pass



    def __setattr__(self, name, value):
        if name in self.__dict__.keys():
            #存在性验证, 如果已经设置过了
            raise  self.ConstCaseError("Can't change a const variable: '%s'" % name)
        # if not name.isupper():
        #     #语法规范验证, 如果不是大写
        #     raise self.ConstCaseError("Const variable must be combined with upper letters:'%s'" % name)
        self.__dict__[name] = value

    def __str__(self):
        _str = '<====== Configs information ======>\n'
        for name, value in self.__dict__.items():
            _str += '  {}  \t{}\n'.format(name, value)
        return _str
if __name__ == "__main__":
    config = Config()
    config.NAME="handsome"

    config.LOCAL_IP="192.168.172.1"
    print(config)

输出结果为

这样在项目中期地方使用的时候直接引用就行了。 

-------------------------------------------------------------------------------------------------------------------------------

2022年7月12日

这样设置够用了,但是随之而来产生了一个问题。

随着参数设置越来越多,在部署和测试的时候,修改的东西和不断的修改带来了很多困扰。

优化第二版本。

介绍一下os.environ这个方法。

简单来说,有以下几个功能

os.environ['MONEY'] = "90W"
#如果有赋值,则传递对应赋值,否则使用默认定义
NAMETEST = os.environ.get('NAMETEST','here is father class')

我们直接上代码

import os
basedir = os.path.abspath(os.path.dirname(__file__))

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY',"hard to guess string")
    MAIL_SERVER = os.environ.get('MAIL_SERVER', 'smtp.googlemail.com')
    MAIL_PORT = int(os.environ.get('MAIL_PORT', '587'))
    MAIL_USE_TLS = os.environ.get('MAIL_USE_TLS', 'true').lower() in \
    ['true', 'on', '1']
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
    FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    NAMETEST = os.environ.get('NAMETEST','here is father class')
    os.environ['MONEY'] = "90W"
    

    @staticmethod
    def init_app(app):
        pass


class DevelopmentConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \
    'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite')
    NAMETEST = os.environ.get('NAMETEST','here is dev class')


class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
    'sqlite://'


class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
    'sqlite:///' + os.path.join(basedir, 'data.sqlite')


config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}



if __name__ == "__main__":
    config = config["default"]     
    
    print(" The data is {}".format(config.NAMETEST))
   

基础逻辑:

基础变量设置在config里面,同时继承了好几个子类。

当变量需要改变时,在子类里面重写一下就可以了。

比如我测试环境一个,生产环境一个,开发环境一个。

这样子需要修改的时候,不需要动父类的默认定义,

开发组自己用开发的config,

生产环境用devconfig。

再也不担心几百行代码看得人头疼了。。

到这里为止我觉得够用了。

后续再看看

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`config.py` 文件一般用于存放程序的配置信息,它是一个 Python 模块,可以在其它模块中导入并使用。在 `config.py` 文件中,我们可以定义一些常量、变量、函数等,用于存放程序运行所需的配置信息,比如数据库连接信息、API 接口地址、文件路径等等。通过将这些配置信息单独存放在一个文件中,我们可以方便地对它们进行修改和管理,从而提高代码的可维护性和可扩展性。 在 `config.py` 文件中,通常会定义一个 `get_config()` 函数,用于读取配置信息并返回一个字典或对象,以便其它模块可以方便地调用这些配置信息。同时,我们也可以在 `config.py` 文件中添加一些注释,以便于理解和维护。例如: ```python # 数据库连接信息 DB_HOST = 'localhost' DB_PORT = 3306 DB_USER = 'root' DB_PASSWD = '123456' DB_NAME = 'mydb' # 文件路径 LOG_PATH = '/var/log/myapp.log' CONFIG_PATH = '/etc/myapp/config.ini' def get_config(): # 读取配置信息并返回一个字典 return { 'db_host': DB_HOST, 'db_port': DB_PORT, 'db_user': DB_USER, 'db_passwd': DB_PASSWD, 'db_name': DB_NAME, 'log_path': LOG_PATH, 'config_path': CONFIG_PATH, } ``` 这样,在其它模块中,我们就可以通过 `get_config()` 函数来获取这些配置信息。例如: ```python # 导入 config 模块 from config import get_config # 获取配置信息 config = get_config() # 打印数据库连接信息 print(f"database host: {config['db_host']}") print(f"database port: {config['db_port']}") print(f"database user: {config['db_user']}") print(f"database passwd: {config['db_passwd']}") print(f"database name: {config['db_name']}") # 打印文件路径 print(f"log path: {config['log_path']}") print(f"config path: {config['config_path']}") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值