2010-03-25 43 views
6

我有一个Python包mymodule和一个子包utils(即一个包含每个函数的模块的子目录)。这些功能与它们所在的文件/模块具有相同的名称。从一个同名的Python模块中导入一个函数/类

我希望能够访问如下功能,

from mymodule.utils import a_function

奇怪但是,有时候我可以导入使用上述符号的功能,但其他时间我不能。我一直无法弄清楚为什么(最近,例如,我重命名了一个函数和它所在的文件,并在utils.__init__.py文件中反映了该重命名,但它不再作为函数(而是作为模块)导入到一个文件中我的脚本。

utils.__init__.py读取类似,

__all__ = ['a_function', 'b_function' ...] 
from a_function import a_function 
from b_function import b_function 
... 

mymodule.__init__.py没有提及utils

想法?

回答

7

做你的utils的功能需要导入其他utils函数? (或导入导入其他utils函数的其他模块)。假设例如a_function.py包含包含“from mymodule.utils import b_function”。这是你的utils.py有一堆额外的评论:

# interpreter is executing utils.py 
# Right now, utils.a_function and utils.b_function are modules 

# The following line executes the a_function module, 
# then rebinds a_function to a_function.a_function 
from a_function import a_function 

# The following line executes the b_function module, 
# then rebinds b_function to b_function.b_function 
from b_function import b_function 

当a_function模块首先由utils.py进口,utils.b_function是一个模块不是一个函数。任何在执行最后一行之前声明“from mymodule.utils import b_function”的模块最终将引用b_function模块而不是b_function函数。

一般而言,我发现from somemodule import something成语充满了任何大型项目的风险。这对短脚本很好,但是一旦你开始引入循环导入依赖关系,就会遇到问题,需要小心使用它。

作为安全和节省打字之间的妥协,我会使用from mymodule import utils然后致电utils.a_function()。这样,您将始终获得绑定到utils.a_function的对象,而不是在导入过程中绑定到utils.a_function的任何事物。

+0

那么'import mymodule.utils as utils'和'from mymodule import utils'有什么区别? – 2010-03-26 01:19:12

+0

@Mike DeSimone:好点。我相应地更新了我的答案。 – 2010-03-26 01:31:26

相关问题