2014-01-23 119 views
0

我在使用另一个python模块时出现问题。用例如下:使用python模块

请考虑以下情形。相应地评论了该错误。

在文件A.py:

import B 

... 
... 

在文件B.py:

import C 
import A 

c_func = C.func1() # works perfectly 
a_func = A.func2() # Error: 'module' object has no attribute 'func2' 

... 
... 

在文件C.py:

... 
... 

任何想法?提前致谢。

+1

告诉我们A.py的代码,它定义了'func2' ... – mhlester

回答

6

这是一个循环导入。一般来说,他们不工作。

请参阅How can I have modules that mutually import each other?在FAQ中的解释,以及解决它的一些不同方法。 Fredrik Lundh的effbot网站上还有一个Circular Imports部分。但是简单地说:

  • A开始执行。
  • A达到import B
  • B开始执行。
  • B达到import A。由于A已经存在,这什么都不做。无论代码A还没有运行 - 就像A.func2 -still的定义尚未运行。
  • B尝试使用尚未定义的A.func2,因此会出现错误。

(更简单,但不准确。B取决于A,这取决于B,这意味着B不能运行,直到B运行这可能会帮助你得到这个问题的一个直观的了解,这可能帮助你理解上面的更完整/准确的解释。)

你可能想要做什么是AB需要移动代码到一个单独的模块,这既AB可以导入,这将不再需要导入AB。这不是只有可能的解决方案(请参阅其他两个想法的常见问题解答条目),但是如果可以干净地做到这一点,很难打败它。 (没有实际的代码,很难给出比这更具体的答案。)

+0

但是只要函数被调用,它就可以工作导入完成后,对不对? – mhlester

+0

@mhlester:是的。常见问题解答中提出的一种可能的解决方案是将所有'B'的顶级代码移到一个函数中,并且只有在函数需要定义的时候才让'A'调用该函数。另一个可能的解决方案是将'import B'向下移动到'A'中,直到'func2'被定义为止。 – abarnert

+0

@abarnert:非常感谢您的解释。我知道了.. –