变量 "foo_class" 作为类型无效,但为什么呢?

Variable "foo_class" is not valid as type, but why?

我有类似的东西:

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 生态系统不支持创建具有动态基类型的 classes。

这可能是因为支持这样的功能不值得额外的复杂性:类型检查器将需要实施额外的 logic/additional 遍,因为它不再能够通过检查清楚地确定父类型到底是什么当前在范围内的变量名称集,并且在一般情况下也无法再使用新的动态 class 准确键入检查代码。

无论如何,我建议要么重新设计您的代码以避免这样做,也许通过使用组合而不是继承或其他方法。

或者,您可以通过添加 # 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)())