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

问题描述 投票:1回答:1

我有类似的东西:

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>

我在做什么错?

python-3.x mypy python-typing
1个回答
0
投票

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)())
© www.soinside.com 2019 - 2024. All rights reserved.