ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-23 10:55:47  阅读:215  来源: 互联网

标签:type-hinting python annotations 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"

这是真的,基类连接器没有这个属性,只有子类.但是所有Connector子类都将具有此属性.

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

我应该在我的get_names函数的类型提示中使用Union(在我的实际情况中,有两种以上的连接器,我的API的用户可以自己添加)?

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

解决方法:

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

class Connector:
    short_name: str

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

您可以使用注释,此时您必须为该属性赋予初始值,并且是一个类属性:

class Connector:
   short_name = ''  # type: str

标签:type-hinting,python,annotations,mypy
来源: https://codeday.me/bug/20190823/1697387.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有