8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何避免python中指针属性的类型提示导致的循环依赖

Dem Pilafian 1月前

27 0

考虑两个模块(在同一个文件夹中):首先,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'

使其发挥作用的一些方法:

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

例如:

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

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

还有其他方法吗?可以让我

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

或者:是否有很好的理由去遵循我已经列出的解决方案之一?

帖子版权声明 1、本帖标题:如何避免python中指针属性的类型提示导致的循环依赖
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Dem Pilafian在本站《class》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我有一个类似的由于类型注释而导致循环依赖错误的用例。考虑以下项目结构:

    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 的类型提示不会按预期工作。但代码运行时没有任何问题。当您想保留注释的代码以供其他开发人员理解时,这将很有帮助。

返回
作者最近主题: