Python:数据类/前向变量声明的循环依赖?

标签 python python-3.x forward-declaration circular-reference python-dataclasses

所以,我在一个文件中有这两个数据类:

@dataclass
class A:
    children: List[B]

@dataclass
class B:
    parent: A

,这可以通过使用 __future__.annotations 特性来实现。

然后我有另外两个文件,每个文件都有一堆针对每种类型的对象,这些对象对于我的项目来说是静态的。

文件 objects_A:

import objects_B

obj_a1 = A(
    children=[
        objects_B.obj_b1,
        objects_B.obj_b2
    ]
)

文件 objects_B:

import objects_A

obj_b1 = B(
    parent=objects_A.obj_a1
)

obj_b2 = B(
    parent=objects_A.obj_a1
)

很明显,文件之间存在循环依赖问题,但即使它们在同一个文件中也不行,因为一种类型的变量依赖于另一种类型的变量才能成功。
初始化 obj_a1 中的 B 对象也不会起作用,因为这里没有 self 的概念。

目前,我将 parent 设置为 None(针对类型提示),然后在 obj_a1 上循环以设置它们:

for obj_b in obj_a1.children:
    obj_b.parent = obj_a1

伙计们有什么好主意吗?
不知道是否有帮助,但这些对象是静态的(它们在这些声明后不会改变)并且它们具有某种父子关系(正如您肯定已经注意到的那样)。
如果可能的话,我希望将每种类型的变量放在不同的文件中。

最佳答案

我知道我迟到了,但我会在这里留下我的答案供其他人使用。

根据 PEP 563 , python 3.7 引入了注释的惰性求值,这在循环依赖的情况下非常有用。

@dataclass
class StudentData:
    school: 'SchoolData'

@dataclass
class SchoolData:
    students: StudentData

如您所见,SchoolData 类型注释包含在引号内,这样您就可以在声明之前引用 SchoolData 类型。

关于Python:数据类/前向变量声明的循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61512751/

相关文章:

python - 如何使用 DataNitro 和 python 保存 excel 文件

python - 如何在python中按行对二维数组进行排序?

python - 检查列表中的元素

python - 如何更改 Python 类的字符串表示形式?

c - ‘sizeof’ 对不完整类型的无效应用

c++ - 什么时候需要提前声明?

c++ - 无法在 std::map 成员变量中分配具有前向声明值的类

python - 通过 python 和 dbus 启动用户 systemd 服务

python - 在多维数组中写入值数组的坐标

python-3.x - 从 Windows 命令提示符复制 Anaconda 环境