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

Python mypy可以跟踪字符串文本吗?,python,mypy,Python,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 "

有没有办法让这一切顺利

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似乎没有跟踪这一点。有什么我遗漏的吗?

MyPy将文本推断为其内置类型,而不是其值的
文本

麦皮 您必须显式地向变量添加注释,以声明它具有文字类型。没有此注释的[…]变量不被假定为文字

要允许推断
文字值
值,请将变量注释为
最终值

从输入import Final开始
从键入扩展导入最终版本
bar:Final=“bar”
显示类型(条形)#显示类型为“文字['bar']?”
将变量注释为
Final
表示其值不会被类似类型的值替代。这使得将类型推断为特定的
Literal
值是正确的,而不仅仅是常规类型

reveal_type([bar])  # Revealed type is 'builtins.list[builtins.str*]'
请注意,此推断是基于上下文的:对于所有需要
文本
的情况,该类型都被推断为
文本
。对于预期类型的情况,无论是文字类型、基类型还是TypeVar,都会将该类型推断为常规类型

reveal_type([bar])  # Revealed type is 'builtins.list[builtins.str*]'

我对Python类型不太了解,但一旦分配给变量,我认为它不再是文字;它是一个
str
对象。是否可以使用类似于get mypy的方法将列表文字解释为
list[literal[“a”,“b”]
,而不是
list[str]