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

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

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

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

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

比如我之前在JAVA中

class Config{USER_NUMBER = 6IP_ADDRESS = 192.168.122.4
}

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

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

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

下面是代码:


class Config(object):class ConstError(TypeError):passclass ConstCaseError(ConstError):passdef __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] = valuedef __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 = FalseNAMETEST = os.environ.get('NAMETEST','here is father class')os.environ['MONEY'] = "90W"@staticmethoddef init_app(app):passclass DevelopmentConfig(Config):DEBUG = TrueSQLALCHEMY_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 = TrueSQLALCHEMY_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。

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

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

后续再看看

Python定义常量,设置config.py文件相关推荐

  1. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  2. python多个for的执行顺序-python顺序执行多个py文件

    假如我要执行code目录下的python程序,假设该目录下有1.py,2.py,3.py,4.py四个文件,但是我想执行1.py,2.py,4.py,则可在该目录下创建一个python文件,代码如下: ...

  3. python如何调用另一个py文件的所有函数

    在工程大的时候,可能会有这样的困惑,python如何调用另一个py文件的所有函数呢? 分成两种情况,1·在同一个文件夹下的调用 2·不在一个文件夹下的相互调用. 1·在同一个文件夹下 调用函数: A. ...

  4. Python如何引用另一个py文件中的变量

    Python如何引用另一个py文件中的变量 1.新建一个aa.py文件 2.新建一个bb.py文件 将变量和函数功能分开保存,这样可以简化自己的代码,看起来更简洁也便于维护,今天需要用到录入很多多维l ...

  5. Python模块包中__init__.py文件的作用

    2019独角兽企业重金招聘Python工程师标准>>> 在eclipse中用pydev开发Python脚本时,我遇到了一个这样的现象,当我新建一个pydev package时,总会自 ...

  6. from import 导入时找不到module的解决办法(Python模块包中_init_.py文件的作用)

    文章目录 背景 正文 Ⅰ.报错信息 Ⅱ.问题解决 Ⅲ.问题分析 Ⅳ._init_.py文件作用 背景 最近在使用Pycharm开发python脚本时,遇到这样一个现象:打开别人给的工程,环境配置都没有 ...

  7. python程序打包多个py文件_不使用setup.py,打包 Python 项目

    我编写了许多开源项目,并允许其他人通过PyPI访问这些项目.为此,我需要从这些项目构建一个源代码分发版(sdist)和一个可选的wheel包,并将二者上传到PyPI.最后,这个sdist和wheel包 ...

  8. python定义常量

    常量是指一旦初始化后就不能修改的固定值. c++中使用const保留字指定常量,而python并没有定义常量的保留字. 但是python并没有提供const关键字,但是我们可以通过自定义一个常量类来实 ...

  9. python怎么调用另一个py文件的变量,Python中py文件引用另一个py文件变量的方法

    Python中py文件引用另一个py文件变量的方法 最近自己初学Python,在编程是遇到一个问题就是,怎样在一个py文件中使用另一个py文件中变量,问题如下: demo1代码 import requ ...

最新文章

  1. 在Ubuntu 16.04.3 LTS上搭建Go语言环境实录
  2. jquery通知插件toastr
  3. SQL2000 好书 《SQL Server 2000数据库管理与开发技术大全》----求是科技 人民邮电出版社
  4. iOS 9音频应用播放音频之iOS 9音频播放进度
  5. 【漫天烟花】绚烂烟花点亮夜空也太美了叭、某程序员携带烟花秀给大家拜年啦~
  6. stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗
  7. [BZOJ3781]小B的询问
  8. 社会治理智慧平台、联动指挥、综合执法、数据汇集、数据研判、智慧政务、图表模板、大屏、可视化、智慧工厂、办公、能源、医疗、校园、自动化综合车间大屏、车间数据、人力资源、员工考核、医院、rp原型
  9. mySAP标准培训教材全套列表
  10. 2017微软校园招聘笔试题
  11. git报错:index.lock File exists
  12. 高考临近,各地考点附近1公里范围内的酒店房量处于紧张状态
  13. Pandas - 5.缺失值处理
  14. 第九章 情归情理归理 好话丑话最好都说在前面
  15. 【将百分制转换成五分制】
  16. ubuntu下git搭建服务器(gitosis)
  17. 大数据分析-智能消息推送策略
  18. Sketch for Mac(矢量绘图软件)
  19. VS2017运行时控制台一闪即逝解决方法
  20. Android Studio插件Gsonformat的安装和使用

热门文章

  1. 如何将mysql导出数据泵_Oracle数据库之ORACLE 数据泵导入导出数据
  2. F. [usaco 2009 dec]游荡的奶牛 总结
  3. css hover变成手_css鼠标样式cursor介绍(鼠标手型)
  4. iOS-中集成百度echarts3-0
  5. kaggle 2018 data science bowl 细胞核分割学习笔记
  6. 函数前后带两个下划线
  7. 用Remix部署Solidity合约
  8. 一个工程师对潘多拉开发板的使用体验
  9. ACC自适应巡航和定速巡航的区别
  10. 东周科目三考场5号线_深圳东周科目三考场路线及注意事项