“来自x.y import z”和“import x.y.z as z”之间的区别

时间:2018-05-11 19:37:40

标签: python python-import

在您想要将嵌套模块导入命名空间的情况下,我总是这样写:

from concurrent import futures

但是,我最近意识到这也可以使用“as”语法来表达。请参阅以下内容:

import concurrent.futures as futures

其主观优势在于看起来更像其他进口产品:

import sys
import os
import concurrent.futures as futures

......缺点是增加了冗长。

两者之间是否存在功能差异,或者是PEP中的官方首选还是其他?

2 个答案:

答案 0 :(得分:7)

存在一些功能差异。首先,正如评论中已经提到的那样,import package.thing as thing要求thing是一个模块(或子包,实际上并不是一个单独的案例,因为包计为模块)。

其次,在Python 3.5及更高版本中,如果from package import thing发现package的模块对象没有thing属性,它将尝试查找sys.modules['package.thing']作为后备。 This was added处理某些循环相对进口案件。 import package.thing as thing尚未执行此处理,但在Python 3.7中为will

答案 1 :(得分:-1)

import concurrent.futures as futures

允许您在代码中的futures命名空间下引用模块(而不是concurrent.futures没有as语法)。但是,打字通常是多余的 - 您正在导入某些内容并声明其名称完全相同。此类导入的标准语法是from <package> import <module>

关于你的问题的重点是as语法主要是为了支持多次导入相同名称而不会互相破坏。例如。

from concurrent import futures
from other.module import futures as my_futures

其他任何事情,你滥用as语法,对我来说将被视为反模式,因为该语言为你提供了一个正确的方法来做你想做的事。