mypy 可以跟踪字符串文字吗?

有没有办法让这个工作成功


from typing import Literal

def foo(bar: Literal["bar"]) -> Literal["foo"]:

    foo = "foo"

    return foo



bar = "bar"

foo(bar)

这是错误


foo.py:4: error: Incompatible return value type (got "str", expected "Literal['foo']")

foo.py:8: error: Argument 1 to "foo" has incompatible type "str"; expected "Literal['bar']"

很明显,foo变量 和bar是文字,因为它们被分配给文字,所以这是安全的,但 mypy 似乎没有跟踪这一点。我有什么遗漏的吗?


慕森卡
浏览 71回答 1
1回答

呼如林

MyPy 将文字推断为它们的内置类型,而不是Literal它们的值。mypy文档 » 文字类型您必须显式向变量添加注释以声明它具有文字类型。[..] 没有此注释的变量不被假定为文字。为了允许推断Literal值,请将变量注释为Final:from typing import Finalfrom typing_extensions import Finalbar: Final = "bar"reveal_type(bar)  # Revealed type is 'Literal['bar']?'将变量注释为Final表示其值不会被类似类型的值替换。这使得将类型推断为特定Literal值而不仅仅是一般类型是正确的。Literal请注意,此推断是上下文相关的:对于所有需要 a 的情况都会推断出类型Literal。对于需要类型的情况,无论是文字类型、基本类型还是 TypeVar,该类型都会被推断为通用类型。reveal_type([bar])  # Revealed type is 'builtins.list[builtins.str*]'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python