En situaciones en las que desea importar un módulo nested a su espacio de nombres, siempre lo he escrito así:
from concurrent import futures
Sin embargo, recientemente me di cuenta de que esto también se puede express utilizando la syntax “como”. Vea lo siguiente:
import concurrent.futures as futures
Lo que tiene la ventaja subjetiva de verse más similar a otras importaciones:
import sys import os import concurrent.futures as futures
… con la desventaja de mayor verbosidad.
¿Existe una diferencia funcional entre los dos o es una oficialmente preferida en un PEP o de otro tipo?
Hay algunas diferencias funcionales. Primero, como ya se mencionó en los comentarios, import package.thing as thing
requiere thing
sea un módulo (o un subpaquete, que en realidad no es un caso separado porque los paquetes cuentan como módulos).
En segundo lugar, en Python 3.5 y versiones posteriores, si from package import thing
encuentra que el objeto de módulo para el package
no tiene un atributo de thing
, intentará buscar sys.modules['package.thing']
como una alternativa. Esto fue agregado para manejar ciertos casos de importaciones relativas circulares. import package.thing as thing
todavía no realiza este manejo, pero lo hará en Python 3.7.
import concurrent.futures as futures
Le permite hacer referencia al módulo bajo el espacio de nombres de futures
en su código (a diferencia de concurrent.futures
sin la syntax as
). Sin embargo, la escritura es en su mayoría redundante: estás importando algo y declarando que su nombre es exactamente lo mismo. La syntax estándar para este tipo de importación es la from
.
El punto sobresaliente de su pregunta es que la syntax as
es principalmente para admitir múltiples importaciones del mismo nombre sin obstruirse entre sí. Por ejemplo.
from concurrent import futures from other.module import futures as my_futures
Cualquier otra cosa y usted está abusando de la syntax y para mí se consideraría antipatrón, porque el lenguaje le proporcionó una forma correcta de hacer lo que quería.