Что такое абсолютный импорт в python?

Я новичок в Python. Я разрабатываю небольшой проект. Мне нужно следовать стандартам кодирования от начала работы в палатах. Как правильно использовать инструкции import. Теперь я работаю над Python 2.7. Если я перейду к 3.x, есть ли какие-либо конфликты с абсолютным импортом? И в чем разница между абсолютным и относительным импортом?

Ответ 1

Различие между absolute и relative, которое здесь рисуется, очень похоже на то, как мы говорим об абсолютных и относительных путях файлов или даже URL-адресах.

Абсолютный {import, путь, URL} сообщает вам точно, как получить то, что вам нужно, обычно указывая каждую часть:

import os, sys
from datetime import datetime
from my_package.module import some_function

Относительные (импорт, пути, URL-адреса) - это именно то, что они говорят: они относительные к их текущему местоположению. То есть, если структура каталогов изменяется или файл перемещается, это может сломаться (потому что они больше не означают одно и то же).

from .module_in_same_dir import some_function
from ..module_in_parent_dir import other_function

Следовательно, абсолютный импорт предпочтительнее для кода, который будет использоваться совместно.


В комментариях мне было предложено привести пример того, как from __future__ import absolute_import связывается с этим и как он предназначен для использования. Пытаясь сформулировать этот пример, я понял, что тоже не могу объяснить его поведение, поэтому я задал новый вопрос. Этот ответ дает пример кода, показывающий правильную рабочую реализацию from __future__ import absolute_import, где он фактически устраняет двусмысленность.

Принятый ответ более подробно описывает, почему это работает так, как это происходит, включая обсуждение запутанной формулировки журнала изменений Python 2.5. По сути, объем этой директивы (а также расширение различия между абсолютным и относительным импортом в Python) очень, очень узкий. Если вам нужно найти эти различия, чтобы заставить ваш код работать, вы, вероятно, лучше не переименовываете свой локальный модуль, если это вообще возможно.