# ...
import os
# ...
def get_variable(name: str, default_value: bool | None = None) -> bool:
true_ = ('true', '1', 't') # Add more entries if you want, like: `y`, `yes`, `on`, ...
false_ = ('false', '0', 'f') # Add more entries if you want, like: `n`, `no`, `off`, ...
value: str | None = os.getenv(name, None)
if value is None:
if default_value is None:
raise ValueError(f'Variable `{name}` not set!')
else:
value = str(default_value)
if value.lower() not in true_ + false_:
raise ValueError(f'Invalid value `{value}` for variable `{name}`')
return value in true_
# ...
my_env1 = get_variable("ENV_VAR1")
my_env2 = get_variable(name="ENV_VAR2") # Raise error if variable was not set
my_env3 = get_variable(name="ENV_VAR3", default_value=False) # return False if variable was not set
Value: 0
Traceback (most recent call last):
File "<string>", line 9, in <module>
File "/usr/lib/python3.8/distutils/util.py", line 319, in strtobool
raise ValueError("invalid truth value %r" % (val,))
ValueError: invalid truth value 'wrong value'
from environs import Env
env = Env()
MY_BOOL_VALUE = env.bool("MY_BOOL_VALUE", False)
if MY_BOOL_VALUE:
print("MY_BOOL_VALUE was set to True.")
else:
print("MY_BOOL_VALUE was either set to False or was not defined.")
# Copied from distutils.util.strtobool, which is deprecated
def strtobool (val):
"""Convert a string representation of truth to true (1) or false (0).
True values are case insensitive 'y', 'yes', 't', 'true', 'on', and '1'.
false values are case insensitive 'n', 'no', 'f', 'false', 'off', and '0'.
Raises ValueError if 'val' is anything else.
"""
val = val.lower()
if val in ('y', 'yes', 't', 'true', 'on', '1'):
return 1
elif val in ('n', 'no', 'f', 'false', 'off', '0'):
return 0
else:
raise ValueError("invalid truth value %r" % (val,))
9条答案
按热度按时间sqyvllje1#
选项1
我认为这样做效果很好:
它允许:
true
、True
、TRUE
、1
、"1"
、TrUe
、t
、T
等内容。更新:在我阅读了Klaas的注解之后,我将原来的代码
my_env = bool(os.getenv(...
更新为my_env = os.getenv(...
,因为in
将导致bool
类型选项2
更新:在@MattG注解之后,我添加了一个新的解决方案,该解决方案对
ttrue
之类的条目引发错误,而不是返回False
:wfauudbj2#
尽管如此,但这对我来说是最可读的版本:
此处除
True
之外的任何值都将计算为False。除非在ENV中显式设置为True
,否则DEBUG为Falseaf7jpaap3#
我建议使用
strtobool
函数例如:
您可以在python文档www.example.com中查看它们https://docs.python.org/3/distutils/apiref.html#distutils.util.strtobool
只有一个问题,如果传递错误的值,它们会引发错误
编码
输出量
fcg9iug34#
这两种方法都不起作用。如果键不存在,
os.environ['ENV_VAR']
本身将导致KeyError
,如果键存在,将返回与'ENV_VAR'
关联的值。或者与True
或"true"
比较,结果总是False
(除非与环境变量相关联的值碰巧是"true"
;但这不是你想要的)。要检查Map是否包含特定键,可以使用
in
:fslejnso5#
强烈推荐
environs
:mkh04yzy6#
另一种接受“假”、“假”、“真”或“真”的替代方法:
lf5gs5x27#
我使用下面的代码来进行更严格的类型输入,并支持输入中更广泛的布尔变量
用法:
ds97pgxw8#
另一种可能的解决方案是将值解析为JSON值:
try
用于无法直接转换的情况。wgmfuz8q9#
如果你不想使用上面提到的environs库,那么strtobool是最好的选择。唯一的问题是它是deprecated,似乎没有一个替代库,但幸运的是它只有几行简单的代码,没有依赖关系。只需实现代码:
使用方法如下:
YES,如果环境变量的某个值既不是true也不是false,这将引发错误。在大多数情况下,这可能是最好的操作过程。