Оператор import

Оновлено: 24.04.2023

import_stmt     ::=  "import" module ["as" identifier] ("," module ["as" identifier])*
                     | "from" relative_module "import" identifier ["as" identifier]
                     ("," identifier ["as" identifier])*
                     | "from" relative_module "import" "(" identifier ["as" identifier]
                     ("," identifier ["as" identifier])* [","] ")"
                     | "from" relative_module "import" "*"
module          ::=  (identifier ".")* identifier
relative_module ::=  "."* module | "."+

Базовий оператор імпорту (без пропозиції from) виконується у два кроки:

знайти модуль, завантаживши та ініціалізувавши його, якщо необхідно визначте ім’я або імена в локальному просторі імен для області, де виникає оператор import.

Якщо оператор містить кілька пунктів (розділених комами), два кроки виконуються окремо для кожного пункту, так само, як якщо б пункти були розділені на окремі оператори імпорту.

The details of the first step, finding and loading modules, are described in greater detail in the section on the import system, which also describes the various types of packages and modules that can be imported, as well as all the hooks that can be used to customize the import system. Note that failures in this step may indicate either that the module could not be located, or that an error occurred while initializing the module, which includes execution of the module’s code.

Якщо запитуваний модуль успішно отримано, він стане доступним у локальному просторі імен одним із трьох способів:

Якщо ім’я модуля супроводжується as, тоді ім’я після as прив’язується безпосередньо до імпортованого модуля. Якщо інше ім’я не вказано, а імпортований модуль є модулем верхнього рівня, ім’я модуля зв’язується в локальному просторі імен як посилання на імпортований модуль Якщо імпортований модуль не є модулем верхнього рівня, тоді ім’я пакета верхнього рівня, який містить модуль, прив’язується до локального простору імен як посилання на пакет верхнього рівня. Доступ до імпортованого модуля потрібно отримати, використовуючи його повне кваліфіковане ім’я, а не безпосередньо

Форма from використовує дещо складніший процес:

знайти модуль, указаний у пункті from, завантажуючи та ініціалізуючи його, якщо необхідно; для кожного з ідентифікаторів, указаних у пунктах import: перевірте, чи імпортований модуль має атрибут із таким іменем якщо ні, спробуйте імпортувати підмодуль із такою назвою, а потім знову перевірте імпортований модуль на наявність цього атрибута якщо атрибут не знайдено, виникає ImportError. інакше посилання на це значення зберігається в локальному просторі імен, використовуючи ім’я в реченні as, якщо воно присутнє, інакше використовується ім’я атрибута

Приклади:

import foo                 # foo imported and bound locally
import foo.bar.baz         # foo, foo.bar, and foo.bar.baz imported, foo bound locally
import foo.bar.baz as fbb  # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb
from foo.bar import baz    # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz
from foo import attr       # foo imported and foo.attr bound as attr

Якщо список ідентифікаторів замінено зірочкою ('*'), усі загальнодоступні імена, визначені в модулі, прив’язуються до локального простору імен для області, де виникає оператор import.

Відкриті імена, визначені модулем, визначаються шляхом перевірки простору імен модуля для змінної з назвою __all__; якщо визначено, це має бути послідовність рядків, які є іменами, визначеними або імпортованими цим модулем. Усі назви, наведені в __all__, вважаються загальнодоступними та мають існувати. Якщо __all__ не визначено, набір загальнодоступних імен включає всі імена, знайдені в просторі імен модуля, які не починаються зі символу підкреслення ('_'). __all__ має містити весь публічний API. Це призначено для уникнення випадкового експорту елементів, які не є частиною API (наприклад, бібліотечних модулів, які були імпортовані та використані в модулі).

Форма імпорту із символом підстановки — з імпорту модуля * — дозволена лише на рівні модуля. Спроба використати його у визначеннях класу чи функції викличе SyntaxError.

Визначаючи, який модуль імпортувати, не потрібно вказувати абсолютну назву модуля. Коли модуль або пакунок міститься в іншому пакунку, можна виконати відносний імпорт у той самий верхній пакунок, не вказуючи назву пакунка. Використовуючи крапки на початку у вказаному модулі чи пакеті після from, ви можете вказати, наскільки високо потрібно перейти вгору по поточній ієрархії пакету, не вказуючи точні назви. Одна крапка на початку означає поточний пакет, у якому існує модуль, що виконує імпорт. Дві крапки означають підвищення на один рівень пакета. Три крапки — це два рівні вище тощо. Отже, якщо ви виконаєте з . імпортуйте mod з модуля в пакеті pkg, тоді ви імпортуєте pkg.mod. Якщо ви виконаєте from ..subpkg2 import mod з pkg.subpkg1, ви імпортуєте pkg.subpkg2.mod. Специфікація відносного імпорту міститься в розділі Відносний імпорт пакетів.

importlib.import_module() надається для підтримки програм, які динамічно визначають модулі для завантаження.

Викликає подію аудиту import з аргументами module, filename, sys.path, sys.meta_path, sys.path_hooks.

import __future__ [as name]