为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2023-08-08 10:21:35
有没有办法让这个工作成功from typing import Literaldef foo(bar: Literal["bar"]) -> Literal["foo"]:    foo = "foo"    return foobar = "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 似乎没有跟踪这一点。我有什么遗漏的吗?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

MyPy 将文字推断为它们的内置类型,而不是Literal它们的值。

mypy文档 » 文字类型

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

为了允许推断Literal值,请将变量注释为Final

from typing import Final


from typing_extensions import Final


bar: 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*]'


查看完整回答
反对 回复 2023-08-08
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信