微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当函数只能返回 str 时,mypy 抱怨不兼容的返回值类型得到“Optional[str]”,预期为“str”

如何解决当函数只能返回 str 时,mypy 抱怨不兼容的返回值类型得到“Optional[str]”,预期为“str”

import os
from typing import Optional

_DEFAULT = 'abc'

def _get_value(param: Optional[str]) -> str:
    return param or os.getenv("ParaM",_DEFAULT)

对于这个功能,mypy 会抱怨

Incompatible return value type (got "Optional[str]",expected "str")

但我认为这个函数永远不会返回None。我错过了什么吗?

解决方法

mypy 类型检查器似乎无法解析 or 条件。您必须明确检查 None 值:

if param:
    return param
else:
    return os.getenv("PARAM",_DEFAULT)

编辑:上述代码在技术上检查 falsy 值而不是 None,但它在功能上与您的示例相同。

,

mypy 似乎缺少对“旧式三元”函数的一些推断——形式为 A or BA and B or C

查看 reveal_type 以获取三个表达式

# reveal_type(param)
t.py:9: note: Revealed type is 'Union[builtins.str,None]'
# reveal_type(os.getenv("PARAM",_DEFAULT)
t.py:10: note: Revealed type is 'builtins.str'
# param or reveal_type(os.getenv("PARAM",_DEFAULT)
t.py:11: note: Revealed type is 'Union[builtins.str,None]'

你可以通过使用真正的三元来解决这个问题:

def _get_value(param: Optional[str]) -> str:
    return param if param is not None else os.getenv("PARAM",_DEFAULT)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。