轻松地建模和转换您关心的环境变量。

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并返回 合适的类型就行了。

生产使用

代码非常简单,并将遵守这些合同:

    不存在的变量将导致 e2e.env.exceptions.NoSuchVariableError待提高。*
  • 访问未映射的环境变量将引发一个AttributeError,如下所示 这是合理的预期。
  • 访问不带注释的映射将引发 映射名称和模型类。

*开放讨论。返回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如果你愿意 请参阅此功能。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在导入到Google工作表时使用ApachePOI显示系列标签   java在Swing表上修改数据生成SQL   java TCP数据包在网络级别合并   java自动连线bean在线程位置为空   javasocket。禁用无线连接时getOutputStream()阻塞   JSON上的javascript字符串数组。stringify输出unicode字符   java在Oracle数据库中存储不同类型数据的最佳体验   Spring MVC中模板引擎后的java进程输出   不知从哪里来的java空字符串。   如何加载java。使用Adobe Flex的客户端的属性文件?   java如何替换多层括号之间的所有内容?   {JSONObject必须以java'开头   java使用commandButton或commandLink返回并管理HTML控件值   java Android大文本视图动态   java JMock需要自定义类   java Android应用程序在emulator中工作,但在设备中失败   java连接到derby数据库时使用什么文件路径格式?   java在一个函数调用中返回两个结果?