如何检查环境变量是否存在是一个好的实践?
如何检查环境变量是否存在是一个好的实践?
我想在Python中检查我的环境中是否存在一个变量,比如说\"FOO\"
。为此,我使用了标准库os
。阅读了库的文档后,我找到了两种实现目标的方式:
方法1:
if "FOO" in os.environ: pass
方法2:
if os.getenv("FOO") is not None: pass
我想知道这两种方法中哪一种更好/更受推荐,以及为什么。
admin 更改状态以发布 2023年5月24日
这有一个因环境变量存在而采用两种不同解决方案的案例,具体取决于您想根据其存在与否进行的操作。
方案一
当您仅基于环境变量的存在而采取不同行动,并且不关心其值时,第一个方案是最佳实践。它简洁描述了您要测试的内容:'FOO'是否在环境变量列表中。
if 'KITTEN_ALLERGY' in os.environ: buy_puppy() else: buy_kitten()
方案二
当您想要在环境变量中未定义该值时设置默认值时,第二个解决方案实际上很有用,尽管它不是您编写的形式:
server = os.getenv('MY_CAT_STREAMS', 'youtube.com')
或许
server = os.environ.get('MY_CAT_STREAMS', 'youtube.com')
请注意,如果您的应用程序有几个选项,您可能需要查看ChainMap
,它允许根据键合并多个字典。在ChainMap
文档中有一个示例:
[...] combined = ChainMap(command_line_args, os.environ, defaults)
正如@Levon指出的那样,如果变量被设置但为空,这可能会返回意外结果。因此,您也应该检查返回的值。例如:
combined = ChainMap(command_line_args, os.environ) server = combined.get("MY_CAT_STREAMS") or defaults["MY_CAT_STREAMS"]
使用第一种方法;它直接尝试检查environ
中是否定义了某个东西。虽然第二种形式同样有效,但从语义上来说欠缺一些,因为仅在存在时返回一个值,然后将其用于比较。
你想要查看environ
中是否存在某个东西,为什么不直接进行比较然后抛弃呢?
这正好是getenv
的作用:
获取环境变量,如果不存在则返回
None
。可选的第二个参数可以指定备用默认值。
(这也意味着你的检查可以简单地用if getenv("FOO")
)
你不想获取它,而是想检查它是否存在。
无论哪种方式,getenv
只是environ.get
的包装器,但你不会看到人们用以下方式检查映射成员关系:
from os import environ if environ.get('Foo') is not None:
总之,如果你只想检查是否存在,使用:
if "FOO" in os.environ: pass
而如果你实际上想对你可能得到的值执行某些操作,则使用getenv("FOO")
。