如何检查环境变量是否存在是一个好的实践?

14 浏览
0 Comments

如何检查环境变量是否存在是一个好的实践?

我想在Python中检查我的环境中是否存在一个变量,比如说\"FOO\"。为此,我使用了标准库os。阅读了库的文档后,我找到了两种实现目标的方式:

方法1:

if "FOO" in os.environ:
    pass

方法2:

if os.getenv("FOO") is not None:
    pass

我想知道这两种方法中哪一种更好/更受推荐,以及为什么。

admin 更改状态以发布 2023年5月24日
0
0 Comments

这有一个因环境变量存在而采用两种不同解决方案的案例,具体取决于您想根据其存在与否进行的操作。

方案一

当您仅基于环境变量的存在而采取不同行动,并且不关心其值时,第一个方案是最佳实践。它简洁描述了您要测试的内容:'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"]

0
0 Comments

使用第一种方法;它直接尝试检查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")

0