【问题标题】:Evaluate boolean environment variable in Python在 Python 中评估布尔环境变量
【发布时间】:2020-11-16 20:22:25
【问题描述】:

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

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

【问题讨论】:

  • 环境变量永远不能是布尔值,它们总是一个字符串(或不存在)。
  • 所以,我应该写: if os.environ['ENV_VAR'] == 'true': ..... 对吧?
  • 这取决于特定环境变量的语义。它们只是字符串,但程序当然可以赋予特定的字符串一些特殊的含义,比如“真相”。这是否是“真的”。 “真”、“真”、“是”或“1”取决于应用程序。

标签: python-3.x if-statement boolean


【解决方案1】:

我认为这很好用:

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

它允许:trueTrueTRUE1"1"TrUetT、...

更新:看了克拉斯的评论后,我将原来的代码my_env = bool(os.getenv(...更新为my_env = os.getenv(...,因为in会产生bool类型

【讨论】:

  • 您可以在列表中添加['true', '1'] 其他选项,例如:['true', '1', 'yes', 'y', 't']
  • 在上面的例子中使用bool 是多余的......无论如何a in b 总是一个布尔值
  • @KlaasvanSchelven,没错,你是对的,我会更新的。谢谢
【解决方案2】:

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

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

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

【讨论】:

  • 我会把它设为 os.getenv('DEBUG', 'False').lower() == 'true' 但很棒,谢谢。
【解决方案3】:

我推荐使用strtobool函数

示例:

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

您可以在 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"))

输出

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'

【讨论】:

  • 来自包文档:Note: The entire distutils package has been deprecated and will be removed in Python 3.12
【解决方案4】:

接受“假”、“假”、“真”或“真”的另一种选择:

import os
import ast

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

【讨论】:

  • 这并不像一开始看起来那么好,因为ast.literal_eval 会给出令人惊讶和令人困惑的(对用户而言)错误消息,例如SyntaxErrorIndentationError 与深错误输入的堆栈跟踪。
【解决方案5】:

这两种方式都行不通。如果键不存在,os.environ['ENV_VAR'] 单独会导致 KeyError,如果存在则返回与 'ENV_VAR' 关联的值。在任何一种情况下,您都会出错,或者与True"true" 进行比较,这将始终导致False(除非与环境变量关联的值恰好是"true";但这不是你在追求)。

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

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

【讨论】:

    【解决方案6】:

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

    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)
    

    【讨论】:

      【解决方案7】:

      强烈推荐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.")
      

      【讨论】:

        【解决方案8】:

        环境变量不是布尔值。默认情况下它们是字符串。您可以按如下方式检查是否存在。

        import os
        
        my_env = os.getenv("ENV_VAR")
        
        if bool(my_env):  # if my_env: gives the same result
          # Env exists
        else:
          # Env not set
        

        如果找不到变量,os.getenv("ENV_VAR") 返回None

        如果找到了 env 变量 bool(my_env) -> bool("False")bool("True") 两者都将评估为 True,因为 my_env 不再是 None

        【讨论】:

        • 得到了这个解决方案:bool("False") 评估为True
        猜你喜欢
        • 2021-08-28
        • 2020-11-17
        • 2010-10-14
        • 2010-12-25
        • 2011-07-04
        • 2018-01-15
        • 1970-01-01
        • 2020-07-12
        • 2010-09-28
        相关资源
        最近更新 更多