En PEP 8 -- Guía de estilo para código Python
Las importaciones relativas explícitas son una alternativa aceptable a las importaciones absolutas
Las importaciones relativas implícitas nunca deben usarse y se han eliminado en Python3.
La importación implícita es un algoritmo.
Busque desde el directorio del paquete actual hasta que se encuentre el padre del paquete final.
-- Dehttps://www.python.org/dev/peps/pep-0328/#rationale-for-relative-imports
¿Alguien puede explicarlo en detalle?
python2 -c 'import csv; print(csv)' <module 'csv' from '/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.pyc'> $ touch csv.py $ python2 -c 'import csv; print(csv)' <module 'csv' from 'csv.pyc'> # In python3 still search from current package $ python3 -c 'import csv; print(csv)' <module 'csv' from '/path_to/csv.py'>Cuando tu dices:
import foo Python 2 buscaría primero en el directorio de la persona que llama. Python 3 no hará eso, y solo encontrará foo en los lugares habituales como sys.path ( PYTHONPATH , site-packages , etc.).
Esto significa que si está escribiendo un paquete compatible con Python 3, debe decir esto dentro de su paquete:
import mypkg.fooO use una importación relativa explícita:
from . import fooen python3, su código solo funciona porque python3 agrega el directorio principal del módulo python que llama a sys.path
no funcionará si usa un submódulo y usa la importación relativa implícita desde el submódulo.
mkdir -p smod touch smod/csv.py echo 'import csv; print(csv)' > smod/__init__.py python3 -c 'import smod; print(smod)' <module 'csv' from '</path/to>/lib/python3.9/csv.py'> <module 'smod' from '/<home>/test/smod/__init__.py'>