实现目标:

  • 支持配置文件继承
  • 支持本地配置文件
  • 支持配置文件别名
  • 简单的配置文件操作

最新的代码可以参考 https://github.com/blackmatrix7/matrix-toolkit/blob/master/toolkit/config.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # @Time : 2017/8/18 上午9:31
  4. # @Author : Matrix
  5. # @Github : https://github.com/blackmatrix7/
  6. # @Blog : http://www.cnblogs.com/blackmatrix/
  7. # @File : config.py
  8. # @Software: PyCharm
  9. import os
  10.  
  11. __author__ = 'blackmatrix'
  12.  
  13. class ConfigMixin:
  14.  
  15. """
  16. Config混合类,支持部分dict协议,实现以类似操作dict的方式操作配置文件。
  17. """
  18.  
  19. def __setattr__(self, key, value):
  20. raise AttributeError
  21.  
  22. def __setitem__(self, key, value):
  23. raise AttributeError
  24.  
  25. def __delitem__(self, key):
  26. raise AttributeError
  27.  
  28. def __getitem__(self, item):
  29. try:
  30. return getattr(self, item)
  31. except AttributeError as ex:
  32. raise KeyError('{0} object has no key {1}'.format(self.__class__.__name__, item)) from ex
  33.  
  34. def __iter__(self):
  35. return (k for k in dir(self) if k.upper() == k)
  36.  
  37. def __contains__(self, key):
  38. return hasattr(self, key)
  39.  
  40. def items(self):
  41. return {k: getattr(self, k, None) for k in dir(self) if k.upper() == k}.items()
  42.  
  43. def get(self, item, value=None):
  44. return getattr(self, item, value)
  45.  
  46. class BaseConfig(ConfigMixin):
  47. """
  48. 配置文件基类
  49. """
  50. # 项目路径
  51. PROJ_PATH = os.path.abspath('')
  52.  
  53. def get_current_config(config_name='default'):
  54. """
  55. 对本地配置文件的支持,当项目根目录存在localconfig.py文件时
  56. 优先从localconfig.py中读取配置,如果不存在读取config.py的配置。
  57. localconfig.py 应该加入git的忽略文件
  58. :return:
  59. """
  60. try:
  61. from localconfig import configs
  62. current_config = configs[config_name]
  63. except ImportError:
  64. from config import configs
  65. current_config = configs[config_name]
  66. return current_config

使用示例:

在项目根目录创建 config.py 和 localconfig.py。

localconfig.py可以不创建(如果不需要本地配置文件的话),如果创建localconfig.py,需要在.gitignore中,将localconfig.py排除掉。

当项目根目录同时存在config.py 和 localconfig.py时,优先读取localconfig.py的配置项。

config.py 完整代码:

  1. from toolkit.config import BaseConfig, get_current_config
  2.  
  3. __author__ = 'blackmatrix'
  4.  
  5. class DefaultConfig(BaseConfig):
  6.  
  7. """
  8. 配置文件的具体实现,所有的配置项都必须是全部大写
  9. """
  10.  
  11. # DEBUG
  12. DEBUG = False
  13.  
  14. # Cache
  15. CACHE_MEMCACHED_SERVERS = ['127.0.0.1:11211']
  16. CACHE_KEY_PREFIX = ''
  17.  
  18. # RabbitMQ
  19. RABBITMQ_HOST = '127.0.0.1'
  20. RABBITMQ_PORT = 5672
  21. RABBITMQ_USER = 'user'
  22. RABBITMQ_PASS = 'password'
  23.  
  24. """
  25. 以下为测试用数据
  26. """
  27.  
  28. class BaseDemoConfig(BaseConfig):
  29.  
  30. # HOST
  31. HOST = '127.0.0.1'
  32.  
  33. """
  34. 对于需要通过其他属性运算获得的属性参数,需要定义在特性中
  35. """
  36. LOGIN_URL = property(lambda self: 'http://{host}/login'.format(host=self.HOST))
  37.  
  38. class DemoConfig01(BaseDemoConfig):
  39. # HOST
  40. HOST = '192.168.1.10'
  41.  
  42. class DemoConfig02(BaseDemoConfig):
  43. # HOST
  44. HOST = '10.10.10.10'
  45.  
  46. default = DefaultConfig()
  47. demo01 = DemoConfig01()
  48. demo02 = DemoConfig02()
  49.  
  50. configs = {'default': default,
  51. 'demo01': demo01,
  52. 'demo02': demo02}
  53.  
  54. # 读取配置文件的名称,在具体的应用中,可以从环境变量、命令行参数等位置获取配置文件名称
  55. config_name = 'default'
  56.  
  57. current_config = get_current_config(config_name)

在config.py模块中:

每套配置都为独立的类,继承自BaseConfig,并将其实例化。

如有必要,在多套配置文件类中,可以互相继承。比如DemoConfig01继承自BaseDemoConfig。

在配置文件类的继承中,比较特别的是需要通过其他属性参与运算获取的配置项,需要使用property定义。

例如下面示例代码的LOGIN_URL,需要通过HOST计算得来。

那么就必须写成 LOGIN_URL = property(lambda self: 'http://{host}/login'.format(host=self.HOST))

而不能写成 LOGIN_URL = 'http://{host}/login'.format(host=self.HOST) ,否则在配置文件类的继承时,会出现和预想不一致的情况。

因为在父类(BaseDemoConfig)创建的时候,LOGIN_URL已经通过计算生成。

子类(DemoConfig01)继承自BaseDemoConfig,即使对HOST进行修改,也不会影响到LOGIN_URL的值。那么子类的LOGIN_URL一直是父类创建时的状态。

  1. class BaseDemoConfig(BaseConfig):
  2.  
  3. # HOST
  4. HOST = '127.0.0.1'
  5.  
  6. """
  7. 对于需要通过其他属性运算获得的属性参数,需要定义在特性中
  8. """
  9. LOGIN_URL = property(lambda self: 'http://{host}/login'.format(host=self.HOST))
  10.  
  11. class DemoConfig01(BaseDemoConfig):
  12. # HOST
  13. HOST = '192.168.1.10'
  14.  
  15. class DemoConfig02(BaseDemoConfig):
  16. # HOST
  17. HOST = '10.10.10.10'
  18.  
  19. default = DefaultConfig()
  20. demo01 = DemoConfig01()
  21. demo02 = DemoConfig02()

configs变量为dict,存储配置文件别名和对应的配置文件对象。

  1. configs = {'default': default,
  2. 'demo01': demo01,
  3. 'demo02': demo02}

模块存储名为config_name的变量,为配置文件别名。

  1. # 读取配置文件的名称,在具体的应用中,可以从环境变量、命令行参数等位置获取配置文件名称
  2. config_name = 'default'

再声明变量current_config,由get_current_config(config_name)取值,表示当前的配置文件。

get_current_config会根据配置文件别名,加载不同的配置项。

  1. current_config = get_current_config(config_name)

localconfig.py也进行如此配置,甚至可以从config.py中继承。

唯一不同的是,localconfig.py中,不需要声明config_name和current_config变量。

配置文件的使用:

在需要使用配置项的代码中,使用如下代码导入当前的配置文件

  1. # 读取当前配置项
  2. # current_config会根据当前的config_name获取到匹配的配置文件对象
  3. # 如果项目根目录存在localconfig.py,则优先从localconfig.py中读取
  4. from config import current_config

获取配置文件中的属性

  1. # 获取配置文件中的属性
  2. # 配置文件对象,支持以.(点号)运算符获取对象的属性,也支持以key的形式获取对象的属性
  3. # 以下两种方式都能获取的配置项
  4. RABBITMQ_HOST = current_config.RABBIT_HOST
  5. RABBITMQ_PORT = current_config['RABBITMQ_PORT']

配置文件支持遍历

  1. keys = [key for key in current_config]
  2. assert isinstance(keys, list)
  3. values = {k: v for k, v in current_config.items()}
  4. assert isinstance(values, dict)

Python配置文件实现的更多相关文章

  1. python 配置文件__ConfigParser

    基础读取配置文件 -read(filename)               直接读取文件内容 -sections()                      得到所有的section,并以列表的形 ...

  2. python配置文件的加载

    背景: 微信机器人项目用到了mysql数据库配置,阿里云OSS上传文件配置:现在需要将这些配置参数统一写到一个配置文件中统一管理,而不是分散的写在代码中 1. 使用.ini文件作为配置文件 例如: s ...

  3. python配置文件转dict

    配置文件有很多种,如JSON,properties,conf,xml等. 除非需要跟别的语言进行交互,python本身是完全可以取代所有配置文件的.使用python进行配置可以使用非常灵活地执行一些逻 ...

  4. python配置文件读取

    在代码实现的过程中,我们经常选择将一些固定的参数值写入到一个单独的配置文件中.在python中读取配置文件官方提供了configParser方法. 主要有如下方法(找官文):   (这家伙很懒,直接复 ...

  5. python 配置文件 ConfigParser模块

    ConfigParser模块 用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式如下 [DEFAULT] Se ...

  6. python配置文件

    python有两种配置文件,file.ini和file.json 一.ini文件如下: db_config.ini [baseconf] host=127.0.0.1 port=3306 user=r ...

  7. python配置文件configparser详解

    Python中一般需要配置文件,配置文件一般以.cfg, .conf, .ini结尾.配置文件可以将数据库抽离到以 .ini(Windows)结尾的文件中,这样做的优点在于可在配置文件中添加多个数据库 ...

  8. python:配置文件configparser

    #-*- coding:utf8 -*- # Auth:fulimei import configparser #第一个标签 conf=configparser.ConfigParser() conf ...

  9. python 配置文件返回的两种方式,写法不一样而已

    配置文件如下: [MODE]mode:{ "register":"all"} 或者 mode = {"register":"all ...

随机推荐

  1. SQL Server插入数据和删除数据

    首先在我的Student表中插入几条数据,由于我的表已经创建完成了,所以就没有创建表的 sql 语句了,不过可以看我的上一篇文章: http://www.cnblogs.com/Brambling/p ...

  2. SharePoint 2013 引发类型为“System.ArgumentException”的异常。 參数名: encodedValue

    SharePoint 2013 引发类型为"System.ArgumentException"的异常. 參数名: encodedValue 具体错误信息 说明: 运行当前 Web ...

  3. ArcGIS教程:创建特征

    摘要 创建由输入样本数据和一组栅格波段定义的类的 ASCII 特征文件. 使用方法 · 输出特征文件应使用扩展名 .gsg. · 输入栅格波段和输入栅格或要素样本数据必须具有重叠范围.将仅为公共区域计 ...

  4. 在Office Add-in中实现单点登陆(SSO)

    作者:陈希章 发表于 2017年12月27日 这篇文章经过多次修改,终于在今天晚上写完了,演示用的范例代码也终于跑通了.因为这个SSO的功能目前只是Preview的状态,所以本篇文章严格参考了官方的文 ...

  5. 原生js版分页插件

    之前我在自己的博客里发表了一篇用angularJs自定义指令实现的分页插件,今天简单改造了一下,改成了原生JavaScript版本的分页插件,可以自定义一些简单配置,特此记录下来.如有不足之处,欢迎指 ...

  6. [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路--验证码

    上一篇博客我们已经基本完成了部署工作,目前发现了验证码出现500错误,分析其代码,我们可以看到验证码使用的是System.Drawing命名空间下的类库, GDI+ 位图,这个在肯定是平台相关的,所以 ...

  7. Robotframework-Appium系列:登录操作

    之前Appium的环境已经配置完成(参考Robotframework-Appium系列:安装配置),接下来就是如何使用Appium来完成我们的apk的测试工作. 一.环境准备 所需的软件列表如下 Ro ...

  8. 队列queue(1) 结构体实现队列

    前言 首先,我们先来做一道解密题:一串数列 7  6  8  6  6  7  0  4  1  ,规定一个回收站,把第一个数删除,添加到回收站里,然后把第二个数排到队伍最末尾,把第三个删除,添加到回 ...

  9. Ionic2 cordova angular2 打包到Android apk环境搭建

    一.前言 前段时间,公司有个APP项目需要支持不同平台,于是采用了Ionic2 + cordova + angular2,在搭建环境过程中遇到了不少问题,刚好最近有时间整理出来. 二.开发环境搭建 参 ...

  10. windows下 安装 rabbitMQ 及操作常用命令(操作创建用户密码 角色等)

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...