从同名的Python模块导入函数/类

时间:2010-03-25 21:24:27

标签: python import module

我有一个带有子包mymodule的Python包utils(即包含每个都带有函数的模块的子目录)。这些函数与它们所在的文件/模块具有相同的名称。

我希望能够按如下方式访问这些功能,

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

想法?

1 个答案:

答案 0 :(得分: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

当utils.py首次导入a_function模块时,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的任何内容。