Python 和循环导入再次

标签 python import circular-dependency

假设我有一个如下所示的模块:

circlejerking/
├── bar.py
├── foo.py
└── __init__.py

bar.py:

from .foo import Foo

class Bar(Foo):
    pass

foo.py:

from .bar import Bar

class Foo(object):
    my_bar = Bar()

__init__.py:

from .foo import Foo
from .bar import Bar

__all__ = [
    'Foo',
    'Bar'
]

由于循环导入,使用该模块失败。

In [1]: from circlejerking import Foo
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-2258014c7099> in <module>()
----> 1 from circlejerking import Foo

/home/me/circlejerking/__init__.py in <module>()
----> 1 from .foo import Foo
2 from .bar import Bar
3
4 __all__ = [
5 'Foo',

/home/me/circlejerking/foo.py in <module>()
----> 1 from .bar import Bar
2
3 class Foo(object):
4 my_bar = Bar()

/home/me/circlejerking/bar.py in <module>()
----> 1 from .foo import Foo
2
3 class Bar(Foo):
4 pass

ImportError: cannot import name Foo

我理解这个问题,并且我知道,与 python 相关的循环导入问题已经讨论过多次,但我似乎无法让它发挥作用。 对于这个问题,两个 goto 答案是:

  1. 重新设计您的代码,您的做法是错误的或者
  2. 仅在需要时导入其他模块。

我相当确定,我的设计没问题,是的,我确信这两个类实际上不是一回事。

将其他类导入到其他地方不是一个选择,因为我需要它们就在它们所在的地方。

有什么想法吗?

最佳答案

一般来说,您可以使用注入(inject)模式来解决这个问题:

这个模块按原样就很好:

from .foo import Foo
class Bar(Foo):
    pass

然后你的其他模块就变成:

class Foo(object):
    bar = None

    @classmethod
    def set_bar(cls, bar):
        cls.bar = bar

然后由使用 Foo 的任何内容来确保在使用 set_bar 之前正确调用它。

关于Python 和循环导入再次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660234/

相关文章:

php - 导出pdf表格数据导入mysql

mysql - 导入数据库 phpMyAdmin - 错误格式参数不正确

c - 解决循环 typedef 依赖?

c# - 如何打破这种循环依赖

python - 获取 PEP8 "invalid escape sequence"警告试图在正则表达式中转义括号

python - 计算到具有特定值的行的距离

python - 正确安装 shapely 到系统解释器中以避免段错误

python - 做出开发网络抓取模块的Python式决定

python - 如何指定 Microsoft Azure Jupyter Notebooks 的路径?

Swift 泛型 : parameters cyclic dependencies resolution