跳转到主要内容

处理环境常量的简单方法。

项目描述

问题是什么?

大多数应用程序都使用常量。许多常量的值取决于应用程序执行的特定环境。

例如,数据库凭证在开发、测试、预生产、生产或股票市场执行中可能有所不同。

解决方案

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 (5.4 kB 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面