轻松地建模和转换您关心的环境变量。
e2e.env的Python项目详细描述
e2e.env
基于类的环境变量建模及其类型转换。
特别适用于使用环境变量的自动化测试 丰富,甚至可以在应用程序中受益于这些映射。
要求
为了易于实现,需要使用Python3.6 PEP-526变量 注释。
概述
环境变量访问是常见的,通常通过基于模块的 接近。
SERVICE_HOST=os.getenv('COMPANY_APP_HOST')SERVICE_PORT=int(os.getenv('COMPANY_APP_PORT'))
这工作很好,但有时他们需要刷新…
# Whoops, forgot the int conversion!SERVICE_PORT=os.getenv('COMPANY_APP_PORT')
…不是很好。
此外,有时您可能需要跟踪名称,并环境中的值,
# This is getting verbose quicklyENVNAME_SERVICE_HOST='COMPANY_APP_HOST'SERVICE_HOST=os.getenv(ENVNAME_SERVICE_HOST)ENVNAME_SERVICE_PORT='COMPANY_APP_PORT'SERVICE_PORT=int(os.getenv(ENVNAME_SERVICE_PORT))
一下子,我们就可以映射出环境变量 转换为本机类型,并获取值或名称:
classServiceVars(e2e.env.EnvMapper):host:str='COMPANY_APP_HOST'port:int='COMPANY_APP_PORT'# Get the port via instanceprint(ServiceVars().port)# 8080type(ServiceVars().port)# <class 'int'># Get the name of the port environment variable via classprint(ServiceVars.port)# COMPANY_APP_PORTtype(ServiceVars.port)# <class 'str'>
使用您自己的“转换器”
所有EnvMapper
所做的就是读取类型注释并构造返回的
将环境值传递给它的值。
也就是说,在建模时,
mapped_name:annotated_type='ENV_VAR_NAME'
…通过EnvMapper
实例访问时,将变成…
annotated_type(os.getenv('ENV_VAR_NAME'))
例如,在上面的例子中,我们有port: int = 'COMPANY_APP_PORT'
。
这基本上被混入int(os.getenv('COMPANY_APP_PORT'))
。所以
任何可以在其构造函数中接受单个str
并返回
合适的类型就行了。
生产使用
代码非常简单,并将遵守这些合同:
- 访问未映射的环境变量将引发一个
AttributeError
,如下所示 这是合理的预期。 - 访问不带注释的映射将引发 映射名称和模型类。
e2e.env.exceptions.NoSuchVariableError
待提高。**开放讨论。返回None
可以工作。将None
传递给类型
转换器通常不会在类型之间产生一致的行为,因此不能
被确定为特殊情况(例如,str(None)
给出"None"
,int(None)
引发一个TypeError
)。见
Issue #1了解更多信息。
未来工作
- 支持
raise_on_dne
或类似于更改 找不到环境变量。请竖起大拇指 Issue #1如果你愿意 请参阅此功能。classServiceVars(e2e.env.EnvMapper,raise_on_dne=False):...
classServiceVars(e2e.env.EnvMapper,dne=lambda:None):...
- 支持将映射合并为一个更大的映射,用于组织 目的。请竖起大拇指 Issue #2如果你愿意 请参阅此功能。