gpt4 book ai didi

os.getenv 的 Python typehint 导致下游不兼容类型错误

转载 作者:行者123 更新时间:2023-12-01 06:22:49 25 4
gpt4 key购买 nike

当使用 os.getenv 时要检索环境变量,默认行为返回 Optional[str] 类型。这是有问题的,因为使用这些变量的任何下游方法/函数都可能被定义为接受 str明确键入。 是否有可接受的用法来解决此问题或强制执行 str返回类型?

getenv 的 stub 文件定义中在 typeshed你可以发现getenv返回类型可以为 Optional[str]Union[str, T_]取决于 default 的使用夸格。

我目前看到的四个选项是:

  1. 定义要接受的任何下游操作 Optional[str]类型作为参数。这感觉不太正确,因为函数/方法可能不会以 Optional 的方式构建。类型有意义。即该操作没有理由将特定参数设为 None .
  2. 使用default kwarg getenv并提供str默认值。这似乎更正确,但要求为 getenv 的每次使用设置一个默认值。 。我看到的唯一问题是这样做可能会混淆不同环境中的测试或使用。
  3. 定义某种变量检查函数。这可以是一个函数,它接受要加载的环境变量的名称,显式返回一个字符串,并在环境变量不存在时引发错误。
  4. 显式设置getenv返回值的类型成为一个海峡。我真的不喜欢这个,因为它期望环境始终被正确配置,根据我的经验,这不是一个好的假设。

下面是一个引发 mypy 错误的示例。

import os

SOME_VAR = os.getenv("SOME_VAR")


def some_func(val: str) -> None:
print(f"Loaded env var: {val}")


some_func(SOME_VAR)

上面引发了 mypy 错误:

error: Argument 1 to "some_func" has incompatible type "Optional[str]"; expected "str"

最佳答案

tl;dr 如果您确定它始终存在,请使用os.environ['SOME_VAR']

<小时/>

os.getenv 可以并且确实返回 None —— mypy 有助于显示那里有一个错误:

>>> repr(os.getenv('DOES_NOT_EXIST'))
'None'
>>> repr(os.getenv('USER'))
"'asottile'"

或者,您可以通过两种不同的方式说服 mypy 它属于您期望的类型:

  1. 利用断言:
x = os.getenv('SOME_VAR')
assert x is not None, x
# mypy will believe that it is non-None after this point
  • 利用强制转换:

    from typing import cast

    x = cast(str, os.getenv('SOME_VAR'))
    # mypy will believe that it is a `str` after this point
  • (强制转换有一些缺点,因为它永远不会被检查,而断言有望导致测试失败)

    我建议不要忽略这个错误/解决它,而是使用os.environ['SOME_VAR']来处理你希望永远存在的事情,或者写缺少时检查错误情况的条件

    关于os.getenv 的 Python typehint 导致下游不兼容类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60285688/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com