1

基础/dir1/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()

当我开始走这条路时,这在实际代码中是一个严重的混乱。

4

2 回答 2

2

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

你应该能够做到

import base.dir2.b as b

将名称缩短为易于管理的名称。

于 2013-05-31T00:17:12.330 回答
1

它失败了,因为它试图在“编译时”解析导入。如果您进行延迟导入,它会起作用。后期导入(第一次之后)的成本只是在 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'
于 2013-05-31T01:38:57.100 回答