python - mypy:基类没有属性x,如何在基类中输入提示

标签 python annotations type-hinting mypy

我最近发现了 mypy,我希望用它对我的代码进行类型检查。

我有一个 Connector 基类:

class Connector():
    ... some methods, but no __init__ ...

而且我有几个子类,它们都是连接器,只是类型不同:

class Siphon(Connector)
    def __init__():
        short_name = "S"


class Tube(Connector)
    def __init__():
        short_name = "T"

当我使用这些对象时,我通常将它们放在一个列表中:

c1 = Siphon()
c2 = Tube()
list_connectors: List[Connector] = list()
list_connectors.append(c1)
list_connectors.append(c2)

现在假设我想编写一个函数来返回所有连接器的所有短名称,作为一个列表。我会写这样的东西:

def get_names(list_connectors: List[Connector]) -> List[str]:
    tmp_list: List[str] = list()
    for c in list_connectors:
        tmp_list.append(c.short_name)
    return tmp_list

当我这样做时,mypy 会提示:

error: "Connector" has no attribute "short_name"

没错,基类连接器没有这个属性,只有子类。但是所有的连接器子类都会有这个属性。

我该如何纠正?我不能在这里使用类属性,因为我的所有子类都需要它们自己的 short_name 属性。

我应该在我的 get_names 函数的类型提示中使用联合吗(在我的现实生活中,有两种以上的连接器,我的 API 的用户可以添加他自己的)?

我也不确定我是否可以编写一个基 __init_ 函数并在子类中覆盖它,因为子类都有不同的 init

最佳答案

您将该属性添加到基本类型;你不需要给它一个值:

class Connector:
    short_name: str

这使用 Python 3.6 的 Variable Annotation syntax ,这是 Python 3.6 或更新版本中的新功能。它定义了 instance 属性的类型,而不是类属性(有 a separate syntax )。

否则你可以使用注释,此时你必须给属性一个初始值,并且是一个类属性:

class Connector:
   short_name = ''  # type: str

关于python - mypy:基类没有属性x,如何在基类中输入提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51191061/

相关文章:

python - 在 Django 的 subview 中获取 url 父参数

python - python解释器如何处理对象的负引用计数?

python - 数据框:创建新的数据框,在多列的基础上保持重复超过 2 次(时间限制)

java - spring 注解可以访问方法参数吗?

typescript - 类类型作为 TypeScript 中的参数

python - 检查 python 类型模块中范围的类型

python - Celery - 如何使用多个队列?

Java 互操作 : Apply @JvmName to getters of properties in interface or abstract class

python - 在 Django 中连接与查询集中记录的多行相关的字段

python - 结合python中的几种结构类型