【问题标题】:Need type annotation for variable in python 3.5 codepython 3.5代码中的变量需要类型注释
【发布时间】:2017-11-20 18:53:49
【问题描述】:

我在我的 python 3.5 代码中使用mypy,我收到了很多如下所示的消息:

文件:行号:错误:变量需要类型注释

但我在python 3.6 中读到了新功能,它仅在python 3.6 中引入了变量注释的语法:

PEP 484 引入了函数参数类型注释的标准,也就是类型提示。这个 PEP 为 Python 添加了用于注释变量类型的语法,包括类变量和实例变量...

如果我尝试在python 3.5 程序中为我的变量添加变量类型注释,它会抛出SyntaxError

我该怎么办?忽略此消息?更新到python 3.6?为什么mypy 编译我的代码就像写在python 3.6 中一样?

【问题讨论】:

    标签: python python-3.x type-hinting mypy


    【解决方案1】:

    使用 cmets 对变量类型进行注解

    x = 5  # type: int
    my_list = []  # type: List[str]
    

    检查备忘单

    https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html

    【讨论】:

    • 正是我想要的。请注意,在 Python 3.6 上,flake8 表示在内联注释之前需要 2 个空格,因此(例如)我必须将 x = 5 # type: int# 之前的单个空格)更改为 x = 5 # type: int(@ 之前的两个空格987654327@).
    • Pylance 要求相同
    【解决方案2】:

    您的代码混淆了mypy 尝试执行的类型推断。例如,在下面的 sn-p 中重新定义一个名称,不允许 mypy 推断出f 的类型:

    f = []
    f = {}
    

    由于它无法理解f 的类型应该是什么,它会抱怨并告诉你它需要一个变量的注解。您可以通过以下方式显式提供类型提示:

    • Python 3.5 的类型注释。
    • Python 3.6 的变量注释

    mypy 没有在3.6 中编译,这个错误在两个版本中都存在。不同之处在于您如何解决它。

    【讨论】:

    【解决方案3】:

    如果你有空值,你必须定义变量的类型。例如:

    my_val: str = ""
    my_val1: dict = {}
    my_val2: list = []
    

    等等。在你的情况下,我会考虑将 python 的版本更改为 3.6 并且需要更新代码。

    【讨论】:

      【解决方案4】:

      mypy 文档提到空集合通常需要针对某些复杂情况进行类型注释。

      https://mypy.readthedocs.io/en/stable/common_issues.html#types-of-empty-collections

      【讨论】:

        猜你喜欢
        • 2016-06-19
        • 1970-01-01
        • 2020-06-06
        • 2020-08-17
        • 2017-09-24
        • 2016-01-24
        • 2016-05-25
        • 2016-11-07
        • 2021-07-03
        相关资源
        最近更新 更多