我有类似的东西:
from typing import Type
class Foo:
pass
def make_a_foobar_class(foo_class: Type[Foo]) -> Type[Foo]:
class FooBar(foo_class):
# this.py:10: error: Variable "foo_class" is not valid as a type
# this.py:10: error: Invalid base class "foo_class"
pass
return FooBar
print(make_a_foobar_class(Foo)())
正在运行mypy
会在行class FooBar(foo_class):
上引发这两个错误(作为注释^添加)
代码似乎可以正常工作:
$ python this.py
<__main__.make_a_foobar_class.<locals>.FooBar object at 0x10a422be0>
我在做什么错?
Mypy和一般的PEP 484生态系统不支持创建具有动态基本类型的类。
这很可能是因为支持这样的功能不值得付出额外的复杂性:类型检查器将需要实施附加的逻辑/附加过程,因为它不再能够仅通过检查变量名来明确地确定父类型到底是什么。当前处于范围内的代码,并且在一般情况下也无法再使用新的动态类准确键入检查代码。
在任何情况下,我都建议您重新设计代码以避免这样做,也许可以通过在继承上使用合成来实现。
或者,您可以通过添加# type: ignore
注释来抑制mypy生成的错误。一旦完成类型检查,此注释将滤除与该特定行相关的所有错误。
例如:
from typing import Type
class Foo:
pass
def make_a_foobar_class(foo_class: Type[Foo]) -> Type[Foo]:
class FooBar(foo_class): # type: ignore
pass
return FooBar
print(make_a_foobar_class(Foo)())