Рубрики
Без рубрики

О импорте Python

Python – это мощный язык. Тем не менее, система импорта может быть трудно понять, а не просто для … Tagged с Python, WebDev.

Python – это мощный язык. Тем не менее, система импорта может быть трудно понять, а не только для начинающих.

Это немного сложно. Надеюсь, эта статья даст вам несколько подсказок.

Что такое импорт

Вы хотите что -то импортировать в Python? Используйте Импорт :

import os
try:
    os.mkdir("new")
except:
    print("cannot create new dir ")

Любой модуль может получить доступ к другим модулям. Кажется достаточно справедливым, что такого сложного?

Прежде чем мы ответим на это, что именно является модулем в Python? Идея состоит в том, чтобы повторно использовать блоки кода, что делает программу более надежной и поддержанной (модульность).

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

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

Мы также пишем модули, потому что определения теряются, когда вы покидаете интерпретатор Python.

Источник

Пакет – это группа модулей (папка ~).

Начиная

Есть много разных синтаксисов для импорта. Вы можете импортировать все это:

import os

Вы можете импортировать только одну или несколько функций:

from os import mkdir

Очевидное отличие состоит в том, что второй синтаксис позволяет использовать mkdir напрямую, в то время как первый синтаксис заставляет вас писать OS.MKDIR каждый раз. Еще одно большое отличие состоит в том, что второй синтаксис не импортирует Операционные системы но только mkdir от ОС Анкет

Есть еще один стандартный синтаксис, который включает в себя псевдонимы:

import super_mega_long_module_name as module

Полезно сократить более длительные имена, и когда два пакета определяют разные функции с одинаковым именем.

В любом случае, необходимо отметить, что:

  • Импорт чувствителен к случаям
  • Python запускает импортные модули и пакеты

Я рекомендую использовать PEP8 Стили Для вашего импорта, особенно если вы новичок. Это руководство по стилю, которое дает лучшие практики.

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

Было бы лучше, если бы вы никогда не написали что -то вроде следующего:

from MODULE import *

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

Линтеры, такие как Pylint Всегда помечайте импорт подстановочного знака как ошибки.

Импорт за сцену

При написании какого -либо оператора импорта интерпретатор Python выглядит первым в списке кэширования модуля:

Словарь, который отображает имена модулей в модули, которые уже загружены

Источник

Если он ничего не найдет, он смотрит в встроенных модулях (написанных в C), например, Sys или Математика Анкет Если он все еще ничего не найдет, он использует sys.path , который представляет собой список каталогов, который включает в себя несколько путей, включая Pythonpath Анкет

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

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

Абсолютный импорт выглядит так:

from mypackage import mymodule

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

from . import mymodule

Dot (“.”) Предназначен для текущего каталога файлов кода. Если есть две точки (“..”), то это относится к родительскому каталогу.

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

Согласно Руководство PEP8 , Абсолютный импорт – лучшая практика Поскольку это лучше для читаемости, и вы должны использовать явный относительный импорт только в конкретных случаях:

При работе со сложными макетами пакетов, где использование абсолютного импорта было бы излишне условно

Это означает, что следующий синтаксис имеет очень мало интереса:

from mypackage.mysubpackage.mysubsubpackage.mymodule import myfunction

Здесь явный относительный импорт кажется законным.

Это ловушка!

Импорт может стать противным.

Круглый эффект происходит, когда импорт B и B импорт A. Вы часто получаете ошибку. Вы предпочитаете рефактор своего кода, чем пробовать какой -либо хакерский обходной путь.

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

Одним из лучших вариантов является опция «-v». Это означает «словес», и это может сэкономить вам много времени:

python3 -v mymodule.py

Тем не менее, есть более злобные ошибки, которые трудно отладить. В этих случаях у вас нет большого выбора. Пошаговая отладка – это, наверное, ваш единственный шанс. Для этого используйте PDB отладчик:

import pdb; pdb.set_trace()

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

Источник

Вот и странность

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

Есть этот файл со странным именем, __init__py Вы можете увидеть его несколько раз в сообщениях в блоге и документации. Этот файл может быть пустым или полным кода для инициализации вещей.

Что, черт возьми это?

Перед Python 3.3 это был обязательный файл! Если вы удалите его, Python больше не загрузит подмодули из пакета.

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

Python 3.3 представил Неявные пакеты пространства имен , чтобы вы можете удалить этот файл. Это все еще работает в Python 2, хотя.

Но ждать. Это относится только к пустому __init__py файлы Анкет Если вам нужна конкретная инициализация, вам все равно понадобится этот файл! Следует быть очень осторожным при миграции старого кода.

Таким образом, довольно неправильно говорить, что это больше не нужно. Я бы посоветовал не использовать неявные пакеты пространства имен, если вы не знаете, что вы делаете.

Что, если __name__:?

__name__ это волшебная переменная, которая содержит имя текущего модуля Python. Со следующим кодом:

if __name__ == "__main__":
    # some code here

Вы говорите Python выполнить код только при запуска его из CLI с Python -m Анкет Код не работает, если вы импортируете его как модуль.

Источник

Структура вашего кода

Таким образом, импорт Python хитрый, но в то же время это хорошая практика разделить код на многоразовые модули?

Что мы делаем дальше?

Во -первых, помните, что не всем кодам нужны файлы, модули, пакеты и сложную иерархию папок. Значительная часть работы состоит из небольших сценариев и командных строк.

Когда вы делаете некоторые материалы для данных с Python, вы выполняете много операций с модным программным обеспечением, таким как Юпитер Анкет Python – это просто язык. Единственное, что вас волнует, это результаты данных.

Однако для всего приложения вам, вероятно, нужен какой -то макет. Давайте попробуем немного типологии.

CLI App

В этом случае вы пишете сценарий. Давайте сохраним вещи на одном уровне (в той же папке):

myscript/
│
├── .gitignore
├── myscript.py
├── LICENSE
├── README.md
├── requirements.txt
├── setup.py
└── tests.py

Структура выше проста на специально:

  • setup.py для зависимостей и установки
  • tests.py для тестов
  • Требования.txt для других разработчиков, которые хотят использовать наш сценарий. Он устанавливает правильные версии необходимых библиотек Python, менеджер пакетов Python ( pip ) использует его
  • myscript.py Ваш код

Ваш пакет

Пакет – это коллекция модулей. На этот раз у нас будут подкатарии:

moduloo/
│
├── .gitignore
├── moduloo/
│   ├── __init__.py
│   ├── moduloo.py
│   └── utils.py
│
├── tests/
│   ├── moduloo_tests.py
│   └── utils_tests.py
│
├── LICENSE
├── README.md
├── requirements.txt
└── setup.py

Н.Б.: Наверное, хорошая идея, чтобы добавить Документы Справочник по этой структуре, но мы не увидим этого здесь.

Идти дальше

Действительно, эти макеты довольно простые. Если вам нужна более сложная структура, например, для Интернета, я рекомендую посмотреть на веб -структуры, такие как Django Анкет

Заворачивать

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

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

Держите макет как можно более простой. Это лучше как для читаемости, так и для технического обслуживания.

Оригинал: “https://dev.to/jmau111/about-python-imports-19i1”