在您想要将嵌套模块导入命名空间的情况下,我总是这样写:
from concurrent import futures
但是,我最近意识到这也可以使用“as”语法来表达。请参阅以下内容:
import concurrent.futures as futures
其主观优势在于看起来更像其他进口产品:
import sys
import os
import concurrent.futures as futures
......缺点是增加了冗长。
两者之间是否存在功能差异,或者是PEP中的官方首选还是其他?
答案 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
语法,对我来说将被视为反模式,因为该语言为你提供了一个正确的方法来做你想做的事。