交叉导入模块上的导入错误

J_yang

我对 Python 中的整个交叉导入感到非常困惑。我有一个包含主模块main.py和几个子模块b.pyc.py 的包,每个模块中有一个类,分别是class main,class bclass c

__init__.py 中

from .main import main
from .b import b
from .c import c

main.py 中

from .b import b 
from .c import c
class main:

b.py 中

from .main import main 
class b:

会引发ImportError,为了解决它,我们可以:

class b:
    def __init__(self):
        from .main import main

这会没事的。但我不太明白为什么。如果我在b.py 中有多个类或方法该怎么办在每个方法中给 import main 会非常低效甚至影响性能吗?

非常感谢。

布鲁诺·德舒利耶

Python 不是 Java,既不要求也不推荐使用“每个类一个模块”的方案——实际上恰恰相反——无论如何都不支持循环依赖——正如你已经发现的那样。IOW,如果您有两个相互依赖的类(或函数或其他任何东西),那么它们显然应该位于同一个模块中(无论如何,这就是“低耦合,高内聚”规则所要求的)。

在函数或方法体中导入被认为是不好的做法,确实会在每次调用时增加一些开销(不是那么多开销,但在一个巨大的数据集上的紧密循环中它会产生很大的不同),并且实际上应该只用作最后的临时 Q&D hack。

你有什么建议可以让模块不那么混乱,因为将它们放在一个模块中会导致一个非常大的文件有太多的行(至少我喜欢)

如果不知道代码实际上是什么样子,就不可能回答这个问题,但是如果 3(三个!)类足以达到您的“行数太多”限制,那么您的类很可能做得太多并且会从重构中受益不同的类(可能还有普通的函数——python 并不强制所有代码都存在于类中),其中一些可能会被提取到其他实用程序模块中。“单一职责”原则在这里是一个很好的指南......您可能还有一些可以以更简洁(但仍然可读)的方式重写的代码 - 看起来您对 Python 没有太多经验,而且您很有可能'没有利用完整的语言(和 stdlib)功能。

现在有时即使有最好的设计和编码,你仍然会得到相当大的模块,因为域本质上是复杂的,需要相当多的代码......这是生活中的事实,你必须学会​​忍受,抱歉。

哦,是的:当然,这一切还取决于您认为“太大而无法满足您的喜好”的标准 - 根据记录,1000 多行模块非常普通。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章