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

Python 当函数只能返回str时,mypy抱怨返回值类型不兼容(得到“Optional[str]”,预期为“str”),python,mypy,Python,Mypy,对于这个函数,mypy会抱怨 import os from typing import Optional _DEFAULT = 'abc' def _get_value(param: Optional[str]) -> str: return param or os.getenv("PARAM", _DEFAULT) 但我认为这个函数永远不会返回None。我遗漏了什么吗?mypy类型检查器似乎无法解析或设置条件。必须显式检查无值: 编辑:上面的代码从技术上

对于这个函数,mypy会抱怨

import os
from typing import Optional

_DEFAULT = 'abc'

def _get_value(param: Optional[str]) -> str:
    return param or os.getenv("PARAM", _DEFAULT)
但我认为这个函数永远不会返回None。我遗漏了什么吗?

mypy类型检查器似乎无法解析或设置条件。必须显式检查无值:

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

mypy类型检查器似乎无法解析或设置条件。必须显式检查无值:


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

mypy似乎缺少对旧式三元函数的一些推断,即形式为A或B或A和B或C的函数

查看这三个表达式的显示类型

if param:
    return param
else:
    return os.getenv("PARAM", _DEFAULT)
您可以使用真正的三元函数来解决此问题:

def_get_valueparam:可选[str]->str: 如果param不是None-other os.getenvPARAM,则返回param,默认值为
mypy似乎缺少一些老式三元函数的推论——形式A或B或A和B或C

查看这三个表达式的显示类型

if param:
    return param
else:
    return os.getenv("PARAM", _DEFAULT)
您可以使用真正的三元函数来解决此问题:

def_get_valueparam:可选[str]->str: 如果param不是None-other os.getenvPARAM,则返回param,默认值为
# 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]'