我在 Python 3 中有以下代码:
class Position:
def __init__(self, x: int, y: int):
self.x = x
self.y = y
def __add__(self, other: Position) -> Position:
return Position(self.x + other.x, self.y + other.y)
但是我的编辑器 (PyCharm) 说引用 Position
无法解析(在 __add__
方法中)。我应该如何指定我希望返回类型为 Position
类型?
编辑:我认为这实际上是一个 PyCharm 问题。它实际上在其警告和代码完成中使用了这些信息。
但如果我错了,请纠正我,并且需要使用其他语法。
原文由 Michael van Gerwen 发布,翻译遵循 CC BY-SA 4.0 许可协议
TL;DR :截至今天(2019 年),在 Python 3.7+ 中,您可以使用“未来”语句
from __future__ import annotations
打开此功能。(由
from __future__ import annotations
启用的行为 可能 成为未来 Python 版本的默认行为,并且 将 成为 Python 3.10 中的默认行为。但是,3.10 中的更改在最后一刻 被恢复,现在可能根本不会发生。)在 Python 3.6 或更低版本中,您应该使用字符串。
我猜你有这个例外:
这是因为
Position
必须先定义,然后才能在注释中使用它,除非您使用启用了 PEP 563 更改的 Python。Python 3.7+:
from __future__ import annotations
Python 3.7 引入了 PEP 563:延迟评估注释。使用 future 语句
from __future__ import annotations
的模块将自动将注释存储为字符串:这已计划成为 Python 3.10 中的默认设置,但现在已推迟此更改。由于 Python 仍然是一种动态类型语言,因此在运行时不进行类型检查,类型注释应该不会对性能产生影响,对吧?错误的!在 Python 3.7 之前,typing 模块曾经是 核心中最慢的 python 模块之一, 因此 对于涉及导入
typing
模块的代码,当你升级到 3.7 时,你会看到 性能提升高达 7 倍.Python <3.7: 使用字符串
根据 PEP 484 ,您应该使用字符串而不是类本身:
如果您使用 Django 框架,这可能很熟悉,因为 Django 模型也使用字符串进行前向引用(外部模型为
self
或尚未声明的外键定义)。这应该适用于 Pycharm 和其他工具。来源
PEP 484 和 PEP 563 的相关部分,让你免去此行:
class Position(object): …
class Position: … def add(self, other): return self.class(self.x + other.x, self.y + other.y)
Position.add.annotations[‘return’] = Position Position.add.annotations[‘other’] = Position
”`
恐怕太麻烦了。