python 3.5代码中的变量需要类型注释

Posted

技术标签:

【中文标题】python 3.5代码中的变量需要类型注释【英文标题】:Need type annotation for variable in python 3.5 code 【发布时间】: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 中一样?

【问题讨论】:

【参考方案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 中编译,这个错误在两个版本中都存在。不同之处在于您如何解决它。

【讨论】:

@YuvalPruss 如果您打算使用变量注释,请查看此处***.com/questions/39971929/… 了解更多信息。【参考方案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

【讨论】:

以上是关于python 3.5代码中的变量需要类型注释的主要内容,如果未能解决你的问题,请参考以下文章

Python >=3.5:在运行时检查类型注释

Python基础(注释/算数运算符/变量类型/拼接字符串)

Python 3.5+中的递归类型[重复]

python注释输入格式化输出输出及数据类型

Python 3.5 中的注释给出 unicode 错误

使用 python 3.5 样式类型注释进行鸭子打字