__import_yu()调用两次?

2024-09-21 02:57:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是想知道为什么__import__()在加载包时调用__init__模块两次。在

test.py
testpkg/
        __init__.py

test.py:

^{pr2}$

__init__.py:

print "Called."

调用python test.py后,调用了。将打印两次。为什么python要两次执行__init__“模块”?在


Tags: 模块pytestimportinitprintcalledtestpkg
2条回答

python-dev显然不赞成使用fromlist=['']方法导入特定模块。虽然它是filed as an issue,但它被修复的可能性很低,这是因为这被视为一开始就误用了fromlist,而不一定是一个bug,而且还有更好的解决方案。在

您应该使用importlib.import_module(可从python2.7和python3.1的标准库中获得,或者从PyPI兼容到python2.3,并从1.1开始作为django.utils.importlib包含在Django中)。它将防止此问题的发生,为导入模块提供了更好的编程接口,甚至允许您在指定从中导入的包时使用相对导入。在

如果您真的不能使用importlib(例如,不允许PyPI依赖项,即使由于PSF许可证您可以自由地复制代码,而且它相当短),那么您应该做__import__("some.module"); mod = sys.modules["some.module"]。这是python开发人员认可的官方解决方案(但只有在之后,才不能使用importlib)。在

这是一个Python bug。将空字符串作为fromlist的元素传递是非法的,应该引发异常。在

不需要在fromlist中包含"";这是隐式的,总是加载模块本身。实际发生的是module.submodule字符串使用空字符串,导致模块名testpkg.,后面有一个句点。它被逐字导入,由于它的名称与testpkg不同,所以它作为一个单独的模块导入。在

试试这个:

pkg = __import__("testpkg", fromlist=[''])
import sys
print sys["testpkg"]
print sys["testpkg."]

。。。你会看到复制的模块。在

如果还没有的话,可能应该有人为此申请一张罚单;我现在太累了,不能自己去做。在

相关问题 更多 >

    热门问题