python-3.x mypy“作为类型”无效,对于使用`type()`构造的类型

erhoui1w  于 2023-08-08  发布在  Python
关注(0)|答案(3)|浏览(118)

mypy投诉error: Variable "packagename.Foo" is not valid as a type

Foo = type('Foo', (), {})
Bar = Optional[Foo]

字符串
此错误可以通过将类型定义为类来修复:

class Foo:
    pass

Bar = Optional[Foo]


还有别的办法吗我需要保持类型定义的动态。

1wnzp6jl

1wnzp6jl1#

这个怎么样,作为一个解决方案?

from typing import Optional, TYPE_CHECKING

if TYPE_CHECKING:
    class Foo: pass
else:
    Foo = type('Foo', (), {})
    
Bar = Optional[Foo]

字符串
typing.TYPE_CHECKING是一个常量,在编译时总是True,在运行时总是False。通过这种方式,我们可以只告诉MyPy静态定义,但在运行时,我们可以像我们喜欢的那样动态。
但是,您应该意识到,这只是一种变通方法,而不是解决方案。通过这种方式,我们本质上是在欺骗类型检查器Foo的真正定义。这意味着MyPy可能无法发现某些地方的错误,并且可能在其他地方不存在错误的地方引发错误。在运行时动态构造类型在某些情况下非常有用,但它违背了Python中类型检查的一些基本原则,所以如果没有某种黑客,你很难让类型检查器批准你正在做的事情。

p3rjfoxz

p3rjfoxz2#

这里有一个相关的mypy issue 8897。在我的情况下给出这个例子:

Bla = type("Bla", (), {})  # type: ignore[valid-type, misc]        

class Foo(Bla):
    pass

字符串
我可以通过显式键入赋值的LHS来说服mypy接受Bla

Bla: type = type("Bla", (), {})


仅使用mypy 1.3.0 (compiled: yes)进行测试。

wqsoz72f

wqsoz72f3#

这对你有用吗?

from typing import TypeVar, Optional

Foo = TypeVar('Foo')
Bar = Optional[Foo]

字符串

相关问题