为什么排序在Python类型提示中很重要?

鲁本·甘恩

为什么这样可以

class Ship:

    def __init__(self, parent):
        self.parent = parent

class Fleet:

    def __init__(self):
        self.ships = []

    def add_ship(self, ship: Ship):
        self.ships.append(ship)

但这不是吗?

class Fleet:

    def __init__(self):
        self.ships = []

    def add_ship(self, ship: Ship):
        self.ships.append(ship)

class Ship:

    def __init__(self, parent):
        self.parent = parent

我知道您在导入时不能有循环引用。但是,这不是重要的事情:它们都在同一个文件中。在这两种情况下,都对Ship进行了定义,但似乎好像先定义了Fleet一样,它找不到Ship的定义。如果我以前检查过类型,那不对isinstance的。

def add_ship(self, ship):
    if isinstance(ship, Ship): # works fine
        self.ships.append(ship)

但是,这不允许我的IDE(PyCharm)查看定义和自动完成语法。

实际上,以下设计模式似乎可以正常工作

class Fleet:

    def __init__(self):
        self.ships = []

    def add_ship(self, ship):
        if isinstance(ship, Ship):
            self.ships.append(ship)

class Ship:

    def __init__(self, parent):
        if isinstance(parent, Fleet):
            self.parent = parent

但是,同样,不允许我的IDE找出类型。这是Python 3.6.5 / Anaconda / Windows 10。

深空

def add_ship(self, ship: Ship):定义时间进行评估当时Ship尚未定义。

if isinstance(ship, Ship):仅在add_ship调用时评估(希望)只有在Ship定义之后。

PEP 563(在python 3.7及更高版本中实现)通过使类型注释评估变得懒惰来解决此问题。

如果升级,则可以添加from __future__ import annotations到文件的顶部,该示例将起作用。

这将在Python 4.0中完全实现,这意味着from __future__ import annotations不需要。

Python 3.7之前的解决方案

如果您不能或不想升级到Python> = 3.7,则可以使用字符串文字注释(我链接到的PEP中也提到了该注释):

def add_ship(self, ship: 'Ship'):

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么JavaScript中的单态和多态很重要?

为什么Java中的getter和setter方法很重要?

为什么Java安全编码很重要?

为什么[0] byte在结构中的位置很重要?

为什么在MongoDB中索引的方向很重要?

为什么素数在密码学中很重要?

为什么类型声明在静态类型语言中很重要?

为什么内核,ramdisk的加载地址在引导中很重要?

为什么导入OnInit很重要

为什么在Rails中强大的参数顺序很重要?

为什么在带有双括号(“ [[”)的Bash中对等号运算符(“ ==”)进行排序很重要?

为什么在着色器中顺序很重要?

为什么在fmincon中A的行大小很重要

为什么cmp指令中的参数顺序很重要?

为什么可变借入的顺序在Rust中很重要?

为什么依赖的numba jitt'ed函数的排序很重要?

为什么“或”条件中的语句顺序很重要?

为什么发行很重要?

什么是分词?为什么它在Shell编程中很重要?

为什么指针中的内存地址很重要

为什么CSS中的注释很重要?

为什么方法声明中的顺序很重要?

为什么顺序在Observable.merge的用法中很重要?

为什么在MagicMock断言的Kwarg参数中顺序很重要?

什么时候在python中乘法的顺序很重要?

CSS文件排序很重要,如果要,为什么呢?

为什么-C在git命令中的位置很重要?

为什么先决条件的顺序在 makefile 中很重要?

什么是 express 中的压缩响应,为什么它很重要?