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