在 Python 中评估布尔环境变量

Ric*_*ano 19 if-statement boolean python-3.x

在 Python 中,如何评估 env 变量是否为布尔值 True?使用是否正确:

if os.environ['ENV_VAR'] is True:
      .......
Run Code Online (Sandbox Code Playgroud)

Rui*_*ins 44

我认为这很有效:

my_env = os.getenv("ENV_VAR", 'False').lower() in ('true', '1', 't')
Run Code Online (Sandbox Code Playgroud)

它允许:true, True, TRUE, 1, "1", TrUe, t, T, ...

更新:在我阅读了 Klaas 的评论后,我将原始代码更新my_env = bool(os.getenv(...my_env = os.getenv(...因为in会导致一个bool类型

  • 在上面的例子中使用 `bool` 是多余的......无论如何,`a in b` 总是一个布尔值 (3认同)
  • 您可以向列表中添加 `['true', '1']` 其他选项,例如: `['true', '1', 'yes', 'y', 't']` (2认同)
  • 这样做的问题是,如果将环境变量设置为“ttrue”时出现拼写错误,则不会引发异常。我认为,对于环境变量解析,您控制代码的行为,您不需要强验证,并且很乐意接受像“ttrue”这样的值被默默地接受为 False。 (2认同)

Val*_*Duz 27

我建议使用strtobool函数

例子:

DEBUG = strtobool(os.getenv("DEBUG", "false"))
Run Code Online (Sandbox Code Playgroud)

您可以在 python 文档中查看它们 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"))
Run Code Online (Sandbox Code Playgroud)

输出

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'
Run Code Online (Sandbox Code Playgroud)

  • 从包文档中:“注意:整个 distutils 包已被弃用,并将在 Python 3.12 中删除” (33认同)

Are*_*k S 12

都是一样的,但对我来说这是最易读的版本:

DEBUG = (os.getenv('DEBUG', 'False') == 'True')
Run Code Online (Sandbox Code Playgroud)

这里的任何东西True都会评估为 False。除非True在 ENV 中明确设置为 DEBUG 为 False

  • 我会让它 os.getenv('DEBUG', 'False').lower() == 'true' 但很棒,谢谢。 (12认同)

yeg*_*ski 10

强烈推荐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.")
Run Code Online (Sandbox Code Playgroud)


Car*_*ate 8

你的这两种方法都行不通。os.environ['ENV_VAR']如果键不存在,单独将导致 a ,如果存在KeyError则返回与 a 关联的值。'ENV_VAR'无论哪种情况,您都会出错,或者与Trueor进行比较"true",这总是会导致结果False(除非与环境变量关联的值恰好是"true";但这不是您想要的)。

要检查映射是否包含特定键,您可以使用in

if 'ENV_VAR' in os.environ:
    # It contains the key
else:
    # It doesn't contain the key
Run Code Online (Sandbox Code Playgroud)


Lat*_*ova 5

另一种接受“false”、“False”、“true”或“True”的替代方案:

import os
import ast

def getenv_bool(name: str, default: str = "False"):
    raw = os.getenv(name, default).title()
    return ast.literal_eval(raw)
Run Code Online (Sandbox Code Playgroud)


Sai*_*ish 5

我使用以下内容来进行更严格的输入并支持输入中更广泛的布尔变化

import os

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

用法 :

feature_1=getenv_bool('FEATURE_1', False)
Run Code Online (Sandbox Code Playgroud)