gpt4 book ai didi

python - 如何避免python中指针属性的类型提示引起的循环依赖

转载 作者:太空狗 更新时间:2023-10-30 01:32:00 24 4
gpt4 key购买 nike

考虑这两个模块(在同一文件夹中):

首先,person.py

from typing import List

from .pet import Pet


class Person:
def __init__(self, name: str):
self.name = name
self.pets: List[Pet] = []

def adopt_a_pet(self, pet_name: str):
self.pets.append(Pet(pet_name, self))

然后是pet.py

from .person import Person


class Pet:
def __init__(self, name: str, owner: Person):
self.name = name
self.owner = owner

由于循环依赖,上面的代码将无法运行。你会得到一个错误:

ImportError: cannot import name 'Person'

实现它的一些方法:

  1. 将类 Person 和 Pet 的定义保存在同一个文件中。
  2. 取消 pet.owner 属性(这是一个方便的指针)
  3. 不要在会导致循环引用的地方使用类型提示/注释:

例如只需:

class Pet:
def __init__(self, name: str, owner):

我发现到目前为止列出的所有选项都有一些缺点。

还有别的办法吗?一个让我能够

  • 将类拆分到不同的文件中
  • 结合使用类型注释和指针,如图所示

或者:是否有充分的理由改用我已经列出的解决方案之一?

最佳答案

最近遇到了类似的问题,用下面的方法解决了:

import typing

if typing.TYPE_CHECKING:
from .person import Person


class Pet:
def __init__(self, name: str, owner: 'Person'):
self.name = name
self.owner = owner

描述了第二种解决方案 here ,这需要 Python >= 3.7 && < 3.10。

from __future__ import annotations  # <-- Additional import.
import typing

if typing.TYPE_CHECKING:
from .person import Person


class Pet:
def __init__(self, name: str, owner: Person): # <-- No more quotes.
self.name = name
self.owner = owner

从 Python 3.10 开始,将不再需要 __future__ 导入。

关于python - 如何避免python中指针属性的类型提示引起的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46641078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com