我可以import module as md
我可以import module.submodule as smd
那为什么我不能做以下任何一种情况?
import module as md
import md.submodule as smd
或
import module as md
from md import submodule as smd
提出不同的问题:为什么我必须使用长名称,而不是我给它的名字?
在第一行之后,md
应该只是内存中的第一类对象。为什么决定不让我从这个对象导入? (特别是考虑到代码"读取"好像module
在开始时已经在内存中可用 - Python人明确选择了这种语法,而不是md = import("module")
)
答案 0 :(得分:3)
因为md
可能是现有模块,并且因为python是允许的,所以它会让你替换它的名字,但你仍然可以随时导入它,例如:
>> import urllib2 as json
虽然json是一个真正的模块并且可以导入,但是如果你想在之后导入它会怎么样呢?
所以当你在这种情况下检查json时
>> json
>> <module 'urllib2' from '/usr/lib/python2.7/urllib2.pyc'>
它指向urllib2,但您仍然可以导入真实json的子模块:
>> from json import tool as tl
json将保持与之前相同的状态,即urllib2。 但你可以把它拿回来
>> import json
>> <module 'json' from '/usr/lib/python2.7/json/__init__.pyc'>
所以为了回答你的问题,它可能是一种让你可以从你所谓的别名中获取模块的方法(如果它是一个真实模块的名称)。
答案 1 :(得分:1)
只需看看模块dis
及其documentation所说的内容可能会澄清后台发生的事情。
>>> def g():
... import numpy as np
...
>>> def h():
... import np.ma as ma # note: np is not defined!
...
>>> dis.dis(g)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (numpy)
9 STORE_FAST 0 (np)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
>>> dis.dis(h)
2 0 LOAD_CONST 1 (-1)
3 LOAD_CONST 0 (None)
6 IMPORT_NAME 0 (np.ma)
9 STORE_FAST 0 (np)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
引用文档,IMPORT_NAME表示:
导入模块co_names [namei]。弹出TOS和TOS1并提供
__import__()
的fromlist和level参数。模块对象被压入堆栈。当前命名空间不受影响:对于正确的import语句,后续STORE_FAST指令会修改命名空间。
(TOS和TOS1是堆栈顶部和第二个最顶层的堆栈项目。)
因此,我会说它不起作用的原因是import
语句当且仅当您传递的令牌实际上是模块名称(不是对象)时才有效,因为这样做传递给__import__
函数,该函数需要模块名称,而不是引用/变量/其他。
有关其工作原理的更多信息,请参见__import__
文档页面。