【发布时间】:2013-08-09 22:18:27
【问题描述】:
我有一个测试环境来尝试了解如何避免使用import x 语句导入模块,而不是使用from x import y:
test/
__init__.py
testing.py
a/
__init__.py
m_a.py
b/
__init__.py
m_b.py
文件有以下内容:
testing.py:
from a.m_a import A
m_a.py:
import b.m_b
print b.m_b
class A:
pass
m_b.py:
import a.m_a
print a.m_a
class B:
pass
有一种情况我看不懂:
如果我从模块 m_a.py 和 m_b.py 或仅从 m_b.py 中删除打印语句,这可以正常工作,但如果打印出现在 m_b.py,则会引发以下错误:
File "testing.py", line 1, in <module>
from a.m_a import A
File "/home/enric/test/a/m_a.py", line 1, in <module>
import b.m_b
File "/home/enric/test/b/m_b.py", line 3, in <module>
print a.m_a
AttributeError: 'module' object has no attribute 'm_a'
你有什么想法吗?
【问题讨论】:
-
旁注:如果您打算在
test目录中以python testing.py运行它,那么您绝对不应该在test目录中有__init__.py文件。我不认为这与你的问题有关,但它仍然是一个糟糕的科。 -
真的吗?我不知道这个。将
test作为一个包有什么问题?同样的错误发生在同样的情况下。 -
您永远不应该将包或包内的任何目录作为您的 PWD 或
sys.path上的任何位置运行。这在文档中的某处进行了解释,但我不记得在哪里。无论如何,最大的问题是您最终可能会以两个不同的名称使用同一模块的两个副本(因此您的全局变量实际上不是全局的,等等)。 (还有一个事实是,即使你弄错了,这些东西似乎也能奏效。) -
@abarnert - 这对于具有多个级别的包来说是正常的。关于循环依赖的问题。
-
@Caumons,m_a 没有从
import b.m_b语句返回,甚至在 m_b 尝试使用它时还没有创建类 A。
标签: python circular-dependency