处理环境常量的简单方法。
项目描述
问题是什么?
大多数应用程序都使用常量。许多常量的值取决于应用程序执行的特定环境。
例如,数据库凭证在开发、测试、预生产、生产或股票市场执行中可能有所不同。
解决方案
受app_constants gem的启发,constants旨在解决该问题(以及该问题仅限于此)。
.ini文件
constants使用.ini文件格式来指定每个环境的应用程序常量值。除非在某个部分中明确覆盖,否则每个环境都可用DEFAULT值。
[DEFAULT] something = a_default_value all = 1 a_string = 0350 [a_section] something = a_section_value just_for_me = 5.0 flag = False minutes = 365 * 24 * 60
有关ini文件和部分的更多信息,请查阅Python标准库configparser文档。
默认文件是当前工作目录中的constants.ini,但您可以使用任何您想要的文件名(参看实例化)。
环境
定义应用程序将在其中运行的特定环境。默认环境变量用于存储该值是__CONSTANTS__,但您可以使用任何您想要的变量名(参看实例化)。
大多数平台都有一种方法可以做到这一点,在bash中
export __CONSTANTS__=a_section
实例化
>>> import constants >>> consts = constants.Constants()
在实例化时,常量会查找名为 __CONSTANTS__ 的环境变量,其值用于确定应使用 constants.ini 文件的哪个部分。
常量的构造函数接受两个(2)可选参数。参数 variable 允许您指定环境变量的名称,而 filename 则指定包含常量定义的 .ini 文件的绝对路径。
>>> consts = Constants(variable='AN_ENVIRONMENT_VARIABLE', ... filename='constants.cfg') # doctest: +SKIP
值
要访问值,可以使用实例像字典一样(getitem)使用。
>>> consts['something'] 'a_section_value'
当相关时,值会被转换为整数、浮点数或布尔值。
>>> consts['all'] 1 >>> consts.a_string '0350' >>> consts.flag False
表达式将被评估。
>>> consts.minutes 525600
值也可以使用点操作符(getattr)来访问。
>>> consts.all 1
警告
“我们是有责任感的成年人”,受 Matthew Wilson 在 建议 的启发,当尝试 更改常量 时抛出异常,constants 会发出 警告 …
>>> import warnings
>>> with warnings.catch_warnings(record=True) as warning: ... # reassigning the constant all ... consts.all = 2
>>> warning[0].message UserWarning('all changed to 2',)
… 并仍然更改常量。
>>> consts.all 2
它以类似字典的赋值方式做到这一点。
>>> with warnings.catch_warnings(record=True) as warning: ... consts['something'] = 'a_new_value'
>>> warning[0].message UserWarning('something changed to a_new_value',)
>>> consts['something'] 'a_new_value'
日志记录
constants 力求成为一个好的 logging 公民,将记录器嫁接到日志树中。
对记录器方法的所有调用都暴露了一个额外的 logRecord 键,称为 method。
当日志级别设置为 INFO 时,它会记录一条且仅有一条有用的消息。
>>> import sys >>> import logging >>> logging.basicConfig(level=logging.INFO, ... stream=sys.stdout, ... format='%(levelname)s %(name)s.%(method)s %(message)s') >>> consts = constants.Constants() # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS INFO constants.load variable: __CONSTANTS__, filename: constants.ini, environment: a_section, constants: {...}
在 DEBUG 级别时,它会变得有点 嘈杂。
>>> logging.root.setLevel(logging.DEBUG) >>> debug_me = consts.just_for_me # doctest: +ELLIPSIS DEBUG constants.__getattr__ begin (..., 'just_for_me') {} DEBUG constants.__getitem__ begin (..., 'just_for_me') {} DEBUG constants.cast begin ('5.0',) {} DEBUG constants.cast end 5.0 DEBUG constants.__getitem__ end 5.0 DEBUG constants.__getattr__ end 5.0
安装
constants 可在 PyPI 上获得 …
pip install constants
… 并且可以在 GitHub 上进行分叉。
项目详情
constants-2023.2.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c48048e3baa02803a0b4c31633c72bb9b2a029b025c76d552661f855e41ab86c |
|
MD5 | 6d292f2f04feda992a31def0ad4328ff |
|
BLAKE2b-256 | 72faf30ceeadac002c32ba72e87157293c7c1faeb5c3d2ad245365061c464134 |