考虑两个模块(在同一个文件夹中):首先,person.pyfrom typing import Listfrom .pet import Pet class Person: def __init__(self, name: str): self.name = name self.
考虑两个模块(在同一个文件夹中):
首先,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'
使其发挥作用的一些方法:
例如:
class Pet:
def __init__(self, name: str, owner):
我发现到目前为止我列出的所有选项都存在一些缺点。
还有其他方法吗?可以让我
或者:是否有很好的理由去遵循我已经列出的解决方案之一?
我有一个类似的由于类型注释而导致循环依赖错误的用例。考虑以下项目结构:
my_module
|- __init__.py (empty file)
|- exceptions.py
|- helper.py
内容:
# exceptions.py
from .helper import log
class BaseException(Exception):
def __init__(self):
log(self)
class CustomException(BaseException):
pass
# helper.py
import logging
from .exceptions import BaseException
def log(exception_obj: BaseException):
logging.error('Exception of type {} occurred'.format(type(exception_obj)))
现在,更新后的内容 helper.py
如下所示:
# helper.py
import logging
def log(exception_obj: 'BaseException'):
logging.error('Exception of type {} occurred'.format(type(exception_obj)))
注意参数类型注释中添加的引号 exception_obj
。这帮助我安全地删除了导致循环依赖的导入语句。
注意:如果您使用的是 IDE(如 PyCharm),您仍可能会收到导入类的建议,并且 IDE 的类型提示不会按预期工作。但代码运行时没有任何问题。当您想保留注释的代码以供其他开发人员理解时,这将很有帮助。