Относительный и абсолютный импорт в Python

Хотя вы можете поместить простые проекты в один файл, для большинства проектов разработки Python потребуется несколько файлов, чтобы ими можно было управлять. Это означает, что вам нужен способ импортировать один файл в другой. Однако многие питонисты затрудняются импортировать файлы. К счастью, это легко, если вы знаете разницу между различными операторами импорта Python. Что импортируется? Импорт означает предоставление файлу Python или модулю Python доступа к сценарию из другого файла или модуля Python. Ты можешь о

Хотя вы можете поместить простые проекты в один файл, для большинства проектов разработки Python потребуется несколько файлов, чтобы ими можно было управлять. Это означает, что вам нужен способ импортировать один файл в другой. Однако многие питонисты затрудняются импортировать файлы. К счастью, это легко, если вы знаете разницу между различными операторами импорта Python.

Что импортируется?

Импорт означает предоставление файлу Python или модулю Python доступа к сценарию из другого файла или модуля Python. Вы можете использовать только функции и свойства, к которым имеет доступ ваша программа. Например, если вы хотите использовать математические функции, вы должны сначала импортировать пакет math. Это потому, что вы должны определить все, что хотите использовать в Python, прежде чем использовать их.

Например, Python выдаст NameError для следующего кода:

 myPi = math.pi 

Это связано с тем, что ни math объект, ни его свойства и методы изначально не доступны для самого языка. Чтобы использовать math объект, вы должны сначала импортировать его.

 import math 
 
 myPi = math.pi 
 print myPi 

Оператор import добавляет объект в текущую область вашей программы.

Как работает импорт

Операторы import многое делают для импорта файла или модуля. Во-первых, они ищут ваш модуль или пакет в sys.modules , где Python хранит ваш ранее импортированный код. Если Python не может найти там модуль, он будет искать его в стандартной библиотеке Python . system.path по всему пространству вашего хранилища, начиная с текущего каталога и тех, которые перечислены в вашем system.path. Если модуль находится в этих местах, он добавит модуль в вашу программу, в противном случае выдаст ModuleNotFoundError .

Синтаксис оператора импорта

Чтобы импортировать модуль напрямую, вы просто указываете имя модуля или пакета после ключевого слова import Обратите внимание, что это утверждение чувствительно к регистру.

 import mymodule 

Однако Python предлагает более сложный синтаксис для импорта кода. Этот второй формат также включает ключевое слово from

 from mypackage import mymodule 

В этом формате вы указываете и модуль, или код, который хотите, вместе с тем, где он находится . Вы указываете имя вашего кода, модуля или подпакета для mymodule и его расположение для mypackage . Такой оператор импорта хорош, если вы хотите импортировать только часть кода из упомянутого пакета, а не сам пакет.

Вы даже можете переименовать модуль, включив ключевое слово as

 import mymodule as oMyFunction 

Вы также можете использовать звездочку ( * ) как подстановочный знак. Следующий оператор импортирует все функции и свойства, содержащиеся в math пакете.

 from math import * 

Независимо от синтаксиса вы всегда должны следовать рекомендуемым передовым методам импорта .

Абсолютный импорт

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

Ниже приведены примеры абсолютного импорта:

 from package1.firstmodule import firstmodule 
 import package1.secondmodule.myfunction 
Абсолютные преимущества и недостатки импорта

В отличие от других языков, большинство разработчиков Python предпочитают использовать абсолютный импорт по сравнению с их родственниками. Это потому, что абсолютный импорт действительно ясно показывает, что вы пытаетесь сделать. Фактическое расположение ваших файлов прямо в вашем коде. Фактически, вы можете использовать их в любом месте вашего кода. Они просто будут работать.

Однако абсолютный импорт может длиться довольно долго. Если в вашем проекте есть подпакеты в подпакетах в подпакетах, ваши операторы импорта могут выходить за рамки одной строки кода. Когда это произойдет, вам будет гораздо лучше использовать относительный импорт.

Вы также можете обнаружить проблему при запуске программы с использованием других файлов запуска. Интерпретатор Python только объявляет текущую папку начального файла как корень sys.path Это нормально, если вы загружаете свою программу только с файлами из корневой папки. Это потому, что sys.path будет оставаться статическим на протяжении всего вашего скрипта.

Однако ситуация меняется, когда вы запускаете свою программу из подпапки или в любой другой ситуации, когда ваш sys.path может измениться. Тогда ваша «корневая папка» будет подпапкой. Поскольку вы не можете использовать неявный импорт (как мы увидим ниже), любой файл вне подпапки становится недоступным для вашей программы.

У вас есть два обходных пути. Вы можете запустить сценарий подпапки как импортированный модуль или добавить sys.path прямо в код.

Например:

  • Импорт модулей как время выполнения: python -m packA.a2
  • Добавьте sys.path перед импортом файлов:
1
<!-- -->
 import os, sys 
 sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) 
 from packA.subA import sa2 

Относительный импорт

При относительном импорте вы только указываете, где находятся ваши ресурсы относительно текущего файла кода. Вы можете сделать это неявно или явно, даже если неявный относительный импорт был удален в Python 3 .

Что касается синтаксиса, относительный импорт использует точечную нотацию . Одиночные точки представляют каталог текущего скрипта. Две точки представляют родительскую папку. Точки в виде точек означают дедушку и бабушку и так далее. Возможно, вы знакомы с этой системой, если используете UNIX-подобную операционную систему или консоль Windows.

Ниже приведены примеры относительного импорта:

  • Явный импорт
1
<!-- -->
 import other 
 from . import some_class 
 from .subA import sa1 
  • Неявный импорт
1
<!-- -->
 from .some_module import some_class 
 import some_function 
 import subA.sa1 
Относительный импорт, их преимущества и недостатки

Относительный импорт редко растет до тех пор, пока абсолютный импорт не растет. Они даже могут превратить смехотворно длинное абсолютное утверждение в нечто простое, например:

 from ..my_sub_package.my_module import my_function 

Однако они также скрывают пути к вашим модулям. Это может быть нормально, если вы единственный разработчик, но это становится беспорядочным, если вы являетесь частью команды разработчиков, где фактическая структура каталогов может измениться.

Какой импорт использовать?

Если вы не работаете над большим проектом с несколькими уровнями подпакетов, вы всегда должны использовать абсолютный импорт. Таким образом, ваш код будет легко понят для всех, кто смотрит на него, включая вас самих, если вы вернетесь к нему, чтобы обновить его позже. Даже если у вас есть длинные пути, вы все равно должны попытаться написать свою программу, чтобы использовать только абсолютные операторы, чтобы упростить ваш код и вашу жизнь.

Заключение

Как и любой другой современный язык программирования, Python позволяет импортировать код из других файлов или модулей. Однако это может обернуться запутанным и подверженным ошибкам процессом, если вы не понимаете концепции, лежащие в основе системы импорта.

В этой статье мы рассмотрели различные способы импорта кода в наши программы Python, включая абсолютный и относительный импорт. Мы также сравнили плюсы и минусы каждого из них, которые имеют свои преимущества в разных сценариях использования.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus