繁体   English   中英

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

[英]Importing a function/class from a Python module of the same name

我有一个Python包mymodule和一个子包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

想法?

您的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导入过程中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM