簡體   English   中英

變量“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):行拋出這兩個錯誤(添加為注釋 ^ 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)())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM