检查环境变量是否存在的好习惯是什么?

新手上路,请多包涵

我想检查我的环境是否存在变量,例如 "FOO" ,在 Python 中。为此,我正在使用 os 标准库。阅读图书馆的文档后,我找到了两种实现目标的方法:

方法一:

 if "FOO" in os.environ:
    pass

方法二:

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

我想知道哪种方法(如果有的话)是好的/首选条件以及原因。

原文由 Kshitij Saraogi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

使用第一个;它直接尝试检查 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") 如果你真的想用你可能得到的值做某事。

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 3.0 许可协议

两种解决方案都有一种情况,具体取决于您要以环境变量的存在为条件执行的操作。

情况1

当你想纯粹根据环境变量的存在而采取不同的动作,而不关心它的值时,第一种解决方案是最佳实践。它简洁地描述了您测试的内容:环境变量列表中的“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)

原文由 hugovdberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题