2

我做了我不应该做的事情,写了 4 个模块(6 小时左右),一路上没有运行任何测试。

我在被调用的内部有一个方法,在/mydir/__init__.py被调用的内部有一个get_hash()类。/mydir/utils.pySpamClass

/mydir/utils.pyget_hash()从进口/mydir/__init__

/mydir/__init__.pySpamClass从进口/mydir/utils.py

类和方法本身都可以正常工作,但由于某种原因,如果我尝试导入/mydir/,我会收到一个导入错误,说"Cannot import name get_hash"from /mydir/__init__.py

唯一的堆栈跟踪是表示 import 的__init__.pySpamClassSpamClass下一行是尝试导入时发生错误的位置get_hash。为什么是这样?

4

3 回答 3

2

这是一个很容易遇到的问题。发生的事情是解释器__init__.py逐行评估您的文件。当您有以下代码时:

 import mydir.utils
 def get_hash(): return 1

解释器将暂停处理__init__.py直到import mydir.utils它完全执行 'mydir/utils.py' 所以当 utils.py 尝试导入 get_hash() 时,它没有被定义,因为解释器还没有得到它的定义。

于 2010-04-15T17:02:36.990 回答
2

为了补充其他人所说的,避免循环导入问题的另一个好方法是避免 from module import stuff.

如果您只是import module在每个脚本的顶部执行标准,并写入module.stuff您的函数,那么当这些函数运行时,导入将完成并且模块成员都将可用。

然后,您也不必担心某些模块可以更新/更改其成员之一(或让顽皮的第三方对其进行猴子修补)的情况。如果您已导入from该模块,您仍然拥有该成员的旧的、过时的副本。

就个人而言,我只将from-import用于我可能经常引用的简单、无依赖的成员:特别是符号常量。

于 2010-04-15T17:13:37.813 回答
1

在没有更多信息的情况下,我会说你有一个你没有解决的循环导入。mydir/__init__.py最简单、最明显的解决方法是不要 mydir. 因此,将您的get_hash功能移动到包内的另一个模块mydir,并将该模块导入您需要的地方。

于 2010-04-15T17:02:10.690 回答