Mypy:在类列表上执行函数 -> “错误”:“对象”没有属性“my_function”

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

MyPy 抱怨

error: "object" has no attribute "my_function"  [attr-defined]
当我遍历类列表并为每个类执行一个函数时:


    list_of_classes = [ClassA(), ClassB(), ...]
    for current_class in list_of_classes:
        result = current_class.my_function(arguments)

代码运行良好,只是mypy有问题。我需要以特殊方式声明类吗?

提前致谢!

python mypy
1个回答
0
投票

没有类型提示,

mypy
推断出
list_of_classes
的类型为
list[object]
,因为
object
似乎是
ClassA
等人最具体的基类。有共同点。如果只知道
current_class
object
的一个实例,则不能假设它具有
my_function
属性。

有两种选择:

  1. 使用名义子类型。在名义子类型下,如果

    A
    B
    的子类,则
    A
    B
    的子类型。

    定义一个定义

    my_function
    的基类,并有
    ClassA
    等。从那个基类继承。然后类型推断应该选择该基类作为所有类继承自的最具体的类。 (如果没有,您可以使用显式类型提示
    list_of_classes: list[Base] = ...
    (其中
    Base
    是您定义的基类)。

  2. 使用结构子类型。在结构子类型下,如果

    A
    具有(至少)与
    B
    相同的属性,则
    A
    B
    的子类型。

    为具有

    my_function
    的类定义协议,并为
    list_of_classes
    提供显式类型提示。

     class HasMyFunction(typing.Protocol):
         def my_function(self, x):
             ...
    
    
     ...
    
     list_of_classes: list[HasMyFunction] = [ClassA(), ClassB()]
    

    任何提供

    my_function
    属性的类型都将被视为
    HasMyFunction
    的子类型。

© www.soinside.com 2019 - 2024. All rights reserved.