图中对等节点之间的Python循环导入
基本/直接1/a.py图中对等节点之间的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是另一种叶节点。他们可以像同龄人一样拥有彼此 这不起作用,因为我有循
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导入。
。没有辅助对象的版本。