Cambios en la statement de importación python3

No entiendo lo siguiente de pep-0404

En Python 3, las importaciones relativas implícitas dentro de los paquetes ya no están disponibles, solo se admiten las importaciones absolutas y las importaciones relativas explícitas. Además, las importaciones de estrellas (por ejemplo, desde x import *) solo se permiten en el código de nivel de módulo.

¿Qué es una importación relativa? ¿En qué otros lugares se permitió la importación de estrellas en python2? Por favor explique con ejemplos.

La importación relativa ocurre cada vez que importa un paquete en relación con el script / paquete actual.

Considere el siguiente árbol, por ejemplo:

mypkg ├── base.py └── derived.py 

Ahora, tu derived.py requiere algo de base.py En Python 2, puedes hacerlo de esta manera (en derived.py ):

 from base import BaseThing 

Python 3 ya no lo admite, ya que no es explícito si desea la base “relativa” o “absoluta”. En otras palabras, si hubiera un paquete Python llamado base instalado en el sistema, obtendría el incorrecto.

En su lugar, requiere que se utilicen importaciones explícitas que especifican explícitamente la ubicación de un módulo en una ruta similar. Tu derived.py se vería como:

 from .base import BaseThing 

El líder . dice ‘importar base desde el directorio del módulo’; en otras palabras, .base asigna a ./base.py .

De manera similar, hay .. prefijo que sube la jerarquía de directorios como ../ (con ..mod mapeando a ../mod.py ), y luego ... que sube dos niveles ( ../../mod.py ) y así sucesivamente.

Sin embargo, tenga en cuenta que las rutas relativas enumeradas anteriormente eran relativas al directorio donde reside el módulo actual ( derived.py ), no al directorio de trabajo actual.


@BrenBarn ya ha explicado el caso de importación de estrellas. Para ser completo, tendré que decir lo mismo;).

Por ejemplo, necesita usar algunas funciones math pero las usa solo en una sola función. En Python 2 se te permitió ser semi-perezoso:

 def sin_degrees(x): from math import * return sin(degrees(x)) 

Tenga en cuenta que ya activa una advertencia en Python 2:

 a.py:1: SyntaxWarning: import * only allowed at module level def sin_degrees(x): 

En el código moderno de Python 2 debes hacerlo y en Python 3 debes hacer lo siguiente:

 def sin_degrees(x): from math import sin, degrees return sin(degrees(x)) 

o:

 from math import * def sin_degrees(x): return sin(degrees(x)) 

Para las importaciones relativas vea la documentación . Una importación relativa es cuando se importa desde un módulo relativo a la ubicación de ese módulo, en lugar de absolutamente desde sys.path .

En cuanto a la import * , Python 2 permitió la importación de estrellas dentro de las funciones, por ejemplo:

 >>> def f(): ... from math import * ... print sqrt 

Se emite una advertencia para esto en Python 2 (al menos versiones recientes). En Python 3 ya no está permitido y solo puedes realizar importaciones de estrellas en el nivel superior de un módulo (no dentro de las funciones o clases).

Para admitir Python 2 y Python 3, use importaciones relativas explícitas como se muestra a continuación. Son relativos al módulo actual. Han sido apoyados a partir de 2.5 .

 from .sister import foo from . import brother from ..aunt import bar from .. import uncle 

Se agregó otro caso a la respuesta de Michał Górny:

Tenga en cuenta que las importaciones relativas se basan en el nombre del módulo actual. Dado que el nombre del módulo principal es siempre ” __main__ “, los módulos destinados a ser utilizados como el módulo principal de una aplicación de Python siempre deben usar importaciones absolutas.