处理环境常数的简单方法。
constants的Python项目详细描述
有问题吗?
大多数应用程序使用常量。许多常数基于不同的值 在执行应用程序的环境中。
考虑数据库凭据而不是开发、测试、登台、生产或 股票市场对开发、测试、纸张、生产的执行力…
解决方案
不知羞耻地受到app_constants宝石的启发,constants旨在解决这个问题。 问题(仅此问题)。
.ini文件
constants使用.ini文件格式指定应用程序常量 每个环境中的值。默认值在每个环境中都可用 除非在节中特别重写。
[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。但是 您可以使用任何想要的文件名cf.Instantiation。
环境
定义应用程序将在其中运行的环境。默认环境 存储该值的变量是常数,但您可以使用任何变量 你想要的名字。
大多数平台都有办法做到这一点,在bash中:
export __CONSTANTS__=a_section
实例化
>>> import constants >>> consts = 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
警告
“我们是负责任的成年人”,然而,受马修·威尔逊的suggestion的启发 尝试更改常量时引发异常$ 问题warnings…
>>> 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
它同样适用于类似于dict的作业。
>>> 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公民,在 伐木树。
所有对logger方法的调用都会公开一个名为method的额外logrecord键。
当日志级别设置为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: {...}
在调试级别,它变得有点噪音。
>>> 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