【发布时间】:2021-10-05 11:36:49
【问题描述】:
这是一个非常基本的问题,实际上是两个问题合二为一。对于这两个问题来说,展示我的 Python 绿意的希望非常简单的答案可能是相同的。
以下代码有两个问题:
- A 类
a:A=A()创建一个NameError,因为A 类在其声明完成之前不知道A 类存在。 - A 类
b:B=B()创建一个NameError,因为在声明 B 类之前,A 类不知道 B 类存在。
#! /usr/bin/python3.10
class A:
a:A=A()
b:B=B()
class B:
a:A=A()
b:B=B()
我遇到类型错误并想使用 mypy.如果我在类声明之外创建变量作为属性或以其他方式隐藏所需的类型,那么 mypy 将看不到类型声明并且无法解析我的程序以查找类型错误。
你可能会问,我为什么要这个?递归数据结构有不定式应用,但是...
- A 类引用自身的情况是一个简单的链接列表。链接列表无需跟踪索引,同时允许简单的插入、删除和下一次迭代,代价是应用程序可能不需要的慢速索引。
- A 类引用 B 类而 B 类引用 A 类的情况是一个简单的容器,其中 B 类(容器)包含一组 A 类实例(项目),这些实例知道它们所在的容器。李>
Python 能否以 mypy 对类型声明满意的方式完成这些非常基本的事情?
我开始认为“python 方式”是让每个函数对每个参数进行类型检查。我考虑得越多,解释型语言提出这样的要求就越合乎逻辑,但我仍然希望使我的代码尽可能有条理和声明性。
【问题讨论】:
-
表示链表的类不需要引用自身。只有类的一个实例需要引用另一个实例。
-
你不能在同一个类体内创建一个类的实例,这个类还不存在。如果要使用尚不存在的类键入注释属性,可以使用
from __future__ import annotations -
您定义的是类属性,而不是实例属性(尽管
class语句中带注释的 name 可用于对实例属性进行类型提示)。
标签: python mypy recursive-datastructures