Python Mypy can';t从文字列表推断项目的类型
我有一个变量Python Mypy can';t从文字列表推断项目的类型,python,mypy,typing,Python,Mypy,Typing,我有一个变量x和一个文本列表(比如0、1、2)。我想将x转换为这些文本之一:如果x在列表中,我将返回它;否则,我将返回一个回退值: 通过键入import Literal,设置 Foo=Literal[0,1,2] foos:Set[Foo]={0,1,2} def convert_to_foo(x:int)->foo: 如果foos中有x: #x必须具有Foo类型,但这不进行类型检查 y:Foo=x 返回y 返回0 不幸的是,这并不是类型检查。Mypy返回以下消息(请参阅): 如果我属于Foo
x
和一个文本列表(比如0、1、2)。我想将x
转换为这些文本之一:如果x
在列表中,我将返回它;否则,我将返回一个回退值:
通过键入import Literal,设置
Foo=Literal[0,1,2]
foos:Set[Foo]={0,1,2}
def convert_to_foo(x:int)->foo:
如果foos中有x:
#x必须具有Foo类型,但这不进行类型检查
y:Foo=x
返回y
返回0
不幸的是,这并不是类型检查。Mypy返回以下消息(请参阅):
如果我属于
Foo
s列表,那么我就是Foo
,对吗?我在文档中找不到答案,有人能告诉我正确的方向吗?我已经在windows Python3.8上测试了你的代码,没有发现任何问题
from typing import Literal, Set
Foo = Literal[0, 1, 2]
foos: Set[Foo] = {0, 1, 2}
def convert_to_foo(x: int) -> Foo:
if x in foos:
# x must have type Foo, yet this doesn't type check
y: Foo = x
print(y)
return y
return 0
>>> convert_to_foo(3)
0
>>> convert_to_foo(2)
2
2
你到底想做什么?这里它检查3是否返回0,2是否返回2。
这不是你要检查的吗?我试过这个
x:Any,默认值:int
from typing import Literal, Set
from typing import *
Foo = Literal[0, 1, 2]
foos: Set[Foo] = {0, 1, 2}
def convert_to_foo(x:Any, default: int) -> Foo:
if x in foos:
# x must have type Foo, yet this doesn't type check
y: Foo = x
return y
return 0
成功:在1个源文件中未发现任何问题非常好的问题。我认为cast
可能是唯一的出路:
从输入import Literal、Set、cast开始
Foo=Literal[0,1,2]
foos:Set[Foo]={0,1,2}
def convert_to_foo(x:int)->foo:
如果foos中有x:
y:Foo=cast(Foo,x)
返回y
返回0
这是mypy中的一个键入问题。如果您不知道mypy,请仔细检查文档,问题在于mypy静态键入,而不是代码本身。在这里您自己可以看到错误:不幸的是,或多或少地使用Any
会关闭类型检查器(从:“您可以使用类型Any
的值做任何事情,并且类型检查器不会抱怨”),因此我们正在失去静态类型的好处。谢谢你的努力,虽然我认为mypy不能仅仅因为它属于集合[Foo]
就推断出x
是Foo
。如果集合子类重写了\uuuuu contains\uuu
方法以始终返回true,该怎么办?
from typing import Literal, Set
from typing import *
Foo = Literal[0, 1, 2]
foos: Set[Foo] = {0, 1, 2}
def convert_to_foo(x:Any, default: int) -> Foo:
if x in foos:
# x must have type Foo, yet this doesn't type check
y: Foo = x
return y
return 0