2024-09-21 02:57:50 发布
网友
我只是想知道为什么__import__()在加载包时调用__init__模块两次。在
__import__()
__init__
test.py testpkg/ __init__.py
test.py:
test.py
__init__.py:
__init__.py
print "Called."
调用python test.py后,调用了。将打印两次。为什么python要两次执行__init__“模块”?在
python test.py
python-dev显然不赞成使用fromlist=['']方法导入特定模块。虽然它是filed as an issue,但它被修复的可能性很低,这是因为这被视为一开始就误用了fromlist,而不一定是一个bug,而且还有更好的解决方案。在
fromlist=['']
fromlist
您应该使用importlib.import_module(可从python2.7和python3.1的标准库中获得,或者从PyPI兼容到python2.3,并从1.1开始作为django.utils.importlib包含在Django中)。它将防止此问题的发生,为导入模块提供了更好的编程接口,甚至允许您在指定从中导入的包时使用相对导入。在
importlib.import_module
django.utils.importlib
如果您真的不能使用importlib(例如,不允许PyPI依赖项,即使由于PSF许可证您可以自由地复制代码,而且它相当短),那么您应该做__import__("some.module"); mod = sys.modules["some.module"]。这是python开发人员认可的官方解决方案(但只有在之后,才不能使用importlib)。在
__import__("some.module"); mod = sys.modules["some.module"]
importlib
这是一个Python bug。将空字符串作为fromlist的元素传递是非法的,应该引发异常。在
不需要在fromlist中包含"";这是隐式的,总是加载模块本身。实际发生的是module.submodule字符串使用空字符串,导致模块名testpkg.,后面有一个句点。它被逐字导入,由于它的名称与testpkg不同,所以它作为一个单独的模块导入。在
""
module.submodule
testpkg.
testpkg
试试这个:
pkg = __import__("testpkg", fromlist=['']) import sys print sys["testpkg"] print sys["testpkg."]
。。。你会看到复制的模块。在
如果还没有的话,可能应该有人为此申请一张罚单;我现在太累了,不能自己去做。在
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
不同,所以它作为一个单独的模块导入。在试试这个:
。。。你会看到复制的模块。在
如果还没有的话,可能应该有人为此申请一张罚单;我现在太累了,不能自己去做。在
相关问题 更多 >
编程相关推荐