图中对等节点之间的Python循环导入

图中对等节点之间的Python循环导入,python,Python,基本/直接1/a.py from base.dir2.b import B class A: def get_peer(self): return B() 基本/dir2/b.py from base.dir1.a import A class B: def get_peer(self): return A() 这实际上代表了一个非常复杂的树中的对等关系。A是一种叶节点,B是另一种叶节点。他们可以像同龄人一样拥有彼此 这不起作用,因为我有循

基本/直接1/a.py

from base.dir2.b import B

class A:
    def get_peer(self):
        return B()
基本/dir2/b.py

from base.dir1.a import A

class B:
    def get_peer(self):
        return A()
这实际上代表了一个非常复杂的树中的对等关系。A是一种叶节点,B是另一种叶节点。他们可以像同龄人一样拥有彼此

这不起作用,因为我有循环导入

我试图找出什么是最佳的项目结构,这样A&B都可以彼此实例化,而不会导致周期性导入

编辑:我真的想要一个看起来不像这样的解决方案:

import base

class A:
    def get_peer(self):
        return base.dir2.b.B()

当我开始走这条路时,实际代码中会出现严重的混乱。

如果可以导入模块而不是类,它应该可以正常工作

你应该能做到

import base.dir2.b as b

将名称缩短为可管理的名称。

它失败,因为它试图在“编译时”解析导入。如果您执行了延迟导入,它将起作用。延迟导入的成本(在第一次导入之后)只是sys.modules中的一个查找,因此没有理由不这样做,只是因为它很时髦。好的评论解释了你为什么这么时髦,这对你很有帮助

# A.py
from base.d1 import B

class A:
    def get_peer(self):
        return B()

# B.py
class B:
    def get_peer(self):
        from base.d2 import A
        return A()

# If you want to be cool and make hard-to-maintain code to reuse crappy pattern
import importlib

class Base(object):
    peer = None
    def get_peer(self):
        if not self.peer:
            raise ValueError("Missing peer")
        mod = '.'.join(self.peer.split('.')[:-1])
        cls = self.peer.split('.')[-1]
        return getattr(importlib.__import__(mod), cls)

class A(Base):
    peer = 'base.d2.B'

问题是,我的代码现在变得一团糟:c=base.dir2.b.b(),请记住,这在实际代码中得到了简化,名称更长,并且在一条语句中被多次引用。它太笨拙了。@amirpc
import荒唐地将.long.name.of.module作为shortname导入。
。没有辅助对象的版本。