在Python中计算布尔环境变量

pod7payv  于 2022-11-26  发布在  Python
关注(0)|答案(9)|浏览(206)

在Python中,如果一个env变量是布尔值True,我该如何用途:

if os.environ['ENV_VAR'] is True:
      .......
sqyvllje

sqyvllje1#

选项1

我认为这样做效果很好:

my_env = os.getenv("ENV_VAR", 'False').lower() in ('true', '1', 't')

它允许:trueTrueTRUE1"1"TrUetT等内容。
更新:在我阅读了Klaas的注解之后,我将原来的代码my_env = bool(os.getenv(...更新为my_env = os.getenv(...,因为in将导致bool类型

选项2

更新:在@MattG注解之后,我添加了一个新的解决方案,该解决方案对ttrue之类的条目引发错误,而不是返回False

# ...
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
wfauudbj

wfauudbj2#

尽管如此,但这对我来说是最可读的版本:

DEBUG = (os.getenv('DEBUG', 'False') == 'True')

此处除True之外的任何值都将计算为False。除非在ENV中显式设置为True,否则DEBUG为False

af7jpaap

af7jpaap3#

我建议使用strtobool函数
例如:

DEBUG = strtobool(os.getenv("DEBUG", "false"))

您可以在python文档www.example.com中查看它们https://docs.python.org/3/distutils/apiref.html#distutils.util.strtobool
只有一个问题,如果传递错误的值,它们会引发错误
编码

from distutils.util import strtobool

print("Value: ", strtobool("false"))

print("Value: ", strtobool("Wrong value"))

输出量

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'
fcg9iug3

fcg9iug34#

这两种方法都不起作用。如果键不存在,os.environ['ENV_VAR']本身将导致KeyError,如果键存在,将返回与'ENV_VAR'关联的值。或者与True"true"比较,结果总是False(除非与环境变量相关联的值碰巧是"true";但这不是你想要的)。
要检查Map是否包含特定键,可以使用in

if 'ENV_VAR' in os.environ:
    # It contains the key
else:
    # It doesn't contain the key
fslejnso

fslejnso5#

强烈推荐environs

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.")
mkh04yzy

mkh04yzy6#

另一种接受“假”、“假”、“真”或“真”的替代方法:

import os
import ast

def getenv_bool(name: str, default: str = "False"):
    raw = os.getenv(name, default).title()
    return ast.literal_eval(raw)
lf5gs5x2

lf5gs5x27#

我使用下面的代码来进行更严格的类型输入,并支持输入中更广泛的布尔变量

import os

def getenv_bool(name: str, default: bool = False) -> bool:
    return os.getenv(name, str(default)).lower() in ("yes", "y", "true", "1", "t")

用法:

feature_1=getenv_bool('FEATURE_1', False)
ds97pgxw

ds97pgxw8#

另一种可能的解决方案是将值解析为JSON值:

import json
import os

def getenv(name, default="null"):
    try:
        return json.loads(os.getenv(name, default))
    except json.JSONDecodeError:
        return name

try用于无法直接转换的情况。

assert getenv("0") == 0
assert getenv("1.1") = 1.1
assert getenv("true") == True
assert getenv("Hello") = "Hello"
assert getenv('["list", "of", "strings"]') == ["list", "of", "strings"]
wgmfuz8q

wgmfuz8q9#

如果你不想使用上面提到的environs库,那么strtobool是最好的选择。唯一的问题是它是deprecated,似乎没有一个替代库,但幸运的是它只有几行简单的代码,没有依赖关系。只需实现代码:

# 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,))

使用方法如下:

my_env_var_value = strtobool(os.getenv("ENV_VAR", "False"))

YES,如果环境变量的某个值既不是true也不是false,这将引发错误。在大多数情况下,这可能是最好的操作过程。

相关问题