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]
?