使用别名导入模块
Import modules using an alias
尝试从别名 import
时 - 这在 scala
中很常见,我很惊讶地看到以下结果:
创建别名
import numpy as np
使用别名导入它包含的模块
from np import linalg
ImportError: No module named np.linalg
python 中还有其他 syntax/equivalent 对导入模块有用吗?
使用 import module as name
不会 创建别名。你误解了导入系统。
导入做两件事:
- 将模块加载到内存中并将结果存储在
sys.modules
中。这仅完成 一次;随后的导入重新使用已经加载的模块对象。
- 在您当前的命名空间中绑定一个或多个名称。
as name
语法可让您在最后一步控制名称。
对于 from module import name
语法,您仍然需要命名完整的模块,因为 module
是在 sys.modules
中查找的。如果你真的想要一个别名,你必须在那里添加额外的引用:
import numpy # loads sys.modules['numpy']
import sys
sys.modules['np'] = numpy # creates another reference
但是,当您同时导入子模块时,这样做可能会产生副作用。一般来说,您不想通过在 sys.modules
中四处寻找来为包创建别名,而不想为所有(可能的)子模块创建别名,因为不这样做可以 .
在这个具体案例中,导入numpy
也会触发numpy.linalg
的加载,所以你真正需要做的是:
import numpy as np
# np.linalg now is available
不需要模块别名。对于不自动导入子模块的包,你必须使用:
import package as alias
import package.submodule
并且 alias.submodule
仍然可用,因为子模块总是作为属性添加到父包中。
我对你的例子的理解是,既然你已经导入了 numpy,你就不能用别名重新导入它,因为它已经导入了 linalg 部分。
尝试从别名 import
时 - 这在 scala
中很常见,我很惊讶地看到以下结果:
创建别名
import numpy as np
使用别名导入它包含的模块
from np import linalg
ImportError: No module named np.linalg
python 中还有其他 syntax/equivalent 对导入模块有用吗?
使用 import module as name
不会 创建别名。你误解了导入系统。
导入做两件事:
- 将模块加载到内存中并将结果存储在
sys.modules
中。这仅完成 一次;随后的导入重新使用已经加载的模块对象。 - 在您当前的命名空间中绑定一个或多个名称。
as name
语法可让您在最后一步控制名称。
对于 from module import name
语法,您仍然需要命名完整的模块,因为 module
是在 sys.modules
中查找的。如果你真的想要一个别名,你必须在那里添加额外的引用:
import numpy # loads sys.modules['numpy']
import sys
sys.modules['np'] = numpy # creates another reference
但是,当您同时导入子模块时,这样做可能会产生副作用。一般来说,您不想通过在 sys.modules
中四处寻找来为包创建别名,而不想为所有(可能的)子模块创建别名,因为不这样做可以
在这个具体案例中,导入numpy
也会触发numpy.linalg
的加载,所以你真正需要做的是:
import numpy as np
# np.linalg now is available
不需要模块别名。对于不自动导入子模块的包,你必须使用:
import package as alias
import package.submodule
并且 alias.submodule
仍然可用,因为子模块总是作为属性添加到父包中。
我对你的例子的理解是,既然你已经导入了 numpy,你就不能用别名重新导入它,因为它已经导入了 linalg 部分。