生物芯片
biodome的Python项目详细描述
生物穹顶
受控环境
使用os.environ读取环境变量非常简单,但是在 有一段时间,人们厌倦了把变量转换成正确的类型 以及处理退回到默认值。
这个库提供了一种读取环境变量和回滚的干净方法 以理智的方式违约。
你是如何做到的:
importostry:TIMEOUT=int(os.environ.get('TIMEOUT',10))exceptValueError:TIMEOUT=10
冗长、陈词滥调、干巴巴的违规行为等。
您将如何做:
importbiodomeTIMEOUT=biodome.environ.get('TIMEOUT',10)
是的,它变成了一条线。但这里有一个魔术:如何 biodome知道应该将TIMEOUT设置为int吗?它知道 因为它查看默认参数的类型。这很管用 不同的事物:
# Listsos.environ['IGNORE_KEYS']='[1, 2, 3]'biodome.environ.get('TIMEOUT',[])==[1,2,3]# Dictsos.environ['SETTINGS']='{"a": 1, "b": 2}'biodome.environ.get('SETTINGS',{})==dict(a=1,b=2)
如果您仔细查看上面的内容,您可以看到我们set通过 stdlibos.environ字典;没错,biodome.environ是 替换为os.environ。你甚至不需要离开 你的整个代码库,你可以一块一块地做。
当我们讨论settingenv vars时,使用biodomeyou 不需要先铸,它会自动在内部铸弦, 不像os.environ:
# Dictsbiodome.environ['SETTINGS']=dict(b=2,a=1)# No cast requiredbiodome.environ.get('SETTINGS',{})==dict(a=1,b=2)
加载env文件
biodome还提供了一个函数来加载指定 环境变量的值。这样一个env文件的示例:
# myconfig.env # This sets the log level for all the loggers in the program LOGGER_LEVEL=info # Hourly backups are stored at this path and named with a timestamp. BACKUP_PATH=/data/backups/ # The number of times to retry outgoing HTTP requests if the status # code is > 500 RETRY_TIME=5
环境变量的名称必须在左侧,并且 在右边。每个变量必须在自己的行上。以开头的行 #被视为注释并被忽略。
这个env文件可以这样加载:
>>>importbiodome>>>biodome.load_env_file('myconfig.env')>>>print(biodome.environ['RETRY_TIME'])5
对与错
我不知道你的情况,但我经常在环境变量中使用bool设置, 所以妥善处理这件事对我来说很重要。打电话时 biodome.environ.get('SETTING',default=<value>),默认值 也可以是bool,即True或False。在这种情况下,任何 以下值、和的大小写等价值将是 识别为True:
['1','y','yes','on','active','activated','enabled','true','t','ok','yeah']
任何不在此列表中的内容都将被视为False。你有主意吗 更多应该被认为是True的东西?我要减贫战略!
可赎回
为了便于解释,通常可以方便地声明和加载环境 使用它们的模块顶部的变量:
""" My new module """importbiodomeENABLE_SETTING_XYZ=biodome.environ.get('ENABLE_SETTING_XYZ',True)defblah():print(ENABLE_SETTING_XYZ)
您可以在函数和方法中调用environ.get()。 使用,但这样就失去了记录所有 模块顶部的可用环境变量。作为解决方案 这个问题,biodome提供了一种为特定的 设置这样做的另一个好处是 动态使用环境变量中的更改。这是 修改示例:
""" My new module """importbiodomeENABLE_SETTING_XYZ=biodome.environ.get_callable(# Same as before'ENABLE_SETTING_XYZ',True)defblah():print(ENABLE_SETTING_XYZ())# Now a callable!
如何在内部工作
这里的关键主题是使用缺省值的type来确定 如何转换输入值。这适用于以下类型:
- int
- float
- str
- list
- dict
- set(注意:仅在python 3+中受支持,因为ast.literal_eval())
- tuple
对于容器,我们使用ast.literal_eval(),这比 使用eval(),因为代码未计算。安全第一!(多亏了 @nickdrienzo代表小费)