Модулі - підручник з мови python 3

У мові Python можна помістити необхідні визначення в файл і використовувати їх в сценаріях або в інтерактивному режимі інтерпретатора. Такий файл називається модулем (module). Визначення з модуля можуть бути імпортовані в інших модулях, або в головному модулі (збори змінних, до яких є доступ в сценарії, який безпосередньо запускається, і в режимі інтерактивному режимі).

Тепер можна увійти в інтерпретатор Python і імпортувати цей модуль за допомогою такої команди:

Це дія не переводить імена певних в модулі функцій в поточну таблицю символів, а лише ім'я модуля fibo. Використовуючи ім'я модуля, ви можете отримати доступ до функцій:

Такий прийом часто використовується, щоб надати зручний призначений для користувача інтерфейс до модуля або для тестування (виконання модуля в якості сценарію запускає набір тестів).

Шлях пошуку модулів

Якщо імпортується модуль з ім'ям spam. інтерпретатор шукає файл з ім'ям spam.py в поточному каталозі, а потім в каталогах, зазначених у змінній оточення PYTHONPATH. У неї такий же синтаксис, як і у змінної шелла PATH. яка, в свою чергу, є перерахуванням каталогів. Коли змінна PYTHONPATH не встановлена, або файл не знайдений в описаних в ній місцях, пошук триває по шляху за замовчуванням, залежному від зазначеного при установці; на Unix це зазвичай.: / usr / local / lib / python.

Насправді пошук модулів проводиться в списку каталогів у змінній sys.path. яка зазвичай містить: каталог, в якому знаходиться сценарій на вході (або поточний каталог), PYTHONPATH і умовчанням для каталогу, зазначеного при установці. Таким чином програма на Python (які знають, що роблять) змінювати або підміняти шлях пошуку модулів. Зауважте: оскільки каталог, що містить запускається вами сценарій, також знаходиться в шляху пошуку, важливо, щоб в ньому не було сценаріїв з ім'ям стандартного модуля. Інакше, коли цей модуль буде імпортуватися, Python буде намагатися завантажити в вигляді модуля сам сценарій, що в більшості випадків викличе помилку. Для більш детальної інформації зверніться до розділу Стандартні модулі.

"Скомпільовані" файли Python

Інтерпретатор Python застосовує один важливий прийом для прискорення запуску програми: якщо в каталозі, де розташовується файл з деяким модулем spam.py. знаходиться також файл spam.pyc. передбачається, що це вже скомпільована в байт-код ( "byte-compiled") версія модуля spam. У файлі spam.pyc зафіксовано час редагування файлу spam.py версії, що використовувалася для створення spam.pyc. Якщо версії не збігаються - файл .pyc ігнорується.

У звичайному випадку, вам не потрібно нічого робити для створення файлу spam.pyc. Кожен раз, коли spam.py успішно компілюється, робиться спроба записати скомпільовану версію в spam.pyc. Не вважається помилкою, якщо спроба невдала: якщо з якої-небудь причини файл не записаний повністю, результуючий файл spam.pyc буде вважатися некоректним і з цієї причини в подальшому ігноруватися. Вміст файлу spam.pyc від платформи незалежно, завдяки чому каталог модулів Python може використовуватися паралельно машинами з різною архітектурою.

Кілька порад експертів:

стандартні модулі

Python поставляється з бібліотекою стандартних модулів, описаної в окремому документі, Довіднику по бібліотеці Python (далі - «Довідника по бібліотеці»). Деякі модулі вбудовані в інтерпретатор. Вони забезпечують доступ до операцій, що не входять в ядро ​​мови, і вбудовані для більшої ефективності та надання доступу до основних засобів операційної системи, таким як системні виклики (system calls). Набір таких модулів - вибір настройки, залежний від використовуваної платформи. Наприклад, модуль winreg надається тільки на системах з Windows. Один конкретний модуль заслуговує на більшу увагу: модуль sys. вбудований в кожну версію інтерпретатора Python. Змінні sys.ps1 і sys.ps2 визначають ланцюжки, що використовуються в якості основного і допоміжного запрошень:

Ці дві змінні визначені лише для інтерактивного режиму інтерпретатора.

Мінлива sys.path вдає із себе список рядків, що визначає шлях пошуку модулів інтерпретатора. Вона ініціалізується значенням шляху за замовчуванням, узятим з змінної оточення PYTHONPATH. або вбудованим значенням за замовчуванням, якщо PYTHONPATH не встановлено. Ви можете змінити її значення, використовуючи стандартні операції зі списками:

Функція dir ()

Вбудована функція dir () використовується для отримання імен, визначених в модулі. Вона повертає відсортований список рядків:

Знову ж, таким чином подгружается подмодуль echo. але тепер його функція echofilter () може бути викликана безпосередньо:

Зауважте, що при використанні виразу from пакет import елемент. елементом може бути подмодуль (або підпакету) пакета або будь-яке інше ім'я, певне в пакеті - наприклад, функція, клас чи змінна. Оператор import спочатку перевіряє, визначений елемент у пакеті; якщо немає - він трактує його як модуль і намагається завантажити. Якщо не вдається його знайти, породжується виняток ImportError.

Навпаки, при використанні синтаксису в стилі import елемент .поделемент .поделемент. всі елементи крім останнього повинні бути пакетами; останній елемент може бути модулем чи пакетом, але не може бути класом, функцією чи змінною, певними в попередньому елементі.

Імпорт * з пакета

Що відбувається, коли користувач пише from sound.effects import *. В ідеалі, ми б сподівалися, що таким чином код виходить в файлову систему і знаходить якісь підмодулі існують в пакеті, імпортуючи їх все. На жаль, такий метод не дуже добре працює на платформах Windows, оскільки у файлової системи не завжди є коректна інформація про регістрі імен файлів. На цих платформах немає гарантованого способу дізнатися, чи потрібно імпортувати файл ECHO.PY як модуль echo. Echo або ECHO. (Наприклад, у Windows 95 є настирлива звичка показувати імена всіх файлів з великої літери.) Обмеження DOS на ім'я файлу в форматі 8 + 3 додає забавну проблему, пов'язану з довгими іменами модулів.

Це буде означати, що вираз from sound.effects import * імпортує три іменованих підмодуля з пакета sound.

Якщо список __all__ не визначений, оператор from Sound.Effects import * не імпортує все підмодулі пакета sound.effects в поточний простір імен: він лише переконується, що імпортований пакет sound.effects (можливо, виконуючи код ініціалізації з __init__.py), а потім імпортує все певні в пакеті імена. У цей список потрапляють будь-які імена, певні (і завантажені явно подмодулей) в __init__.py. У нього також потрапляють все явно завантажені попередніми операторами import підмодулі. Розглянемо наступний код:

У цьому прикладі модулі echo та surround імпортуються в поточний простір імен, оскільки вони визначені в пакеті sound.effects на той момент, коли виповнюється оператор from. import. (І це також працює якщо визначений __all__.)

Зверніть увагу, що в загальному випадку імпортування * з модуля не вітається, оскільки в результаті часто виходить погано-якого читають код. Однак, цілком нормально використовувати його в інтерактивних сесіях, щоб менше друкувати, а певні модулі розроблені для експорту тільки тих імен, які слідують певним шаблоном.

Пам'ятайте: у використанні from пакет import определённий_подмодуль немає нічого поганого. Насправді - це рекомендована запис, до тих пір поки при імпортуванні модуля не потрібно використовувати подмодулей з однаковим ім'ям з різних пакетів.

Посилання всередині пакету

Коли пакети структуровані в підпакети (наприклад, в разі пакета sound), для того, щоб послатися на пакети-нащадки ви можете використовувати абсолютне імпортування (absolute imports). Наприклад, якщо модуль sound.filters.vocoder потребує модулі echo з пакета sound.effects. він повинен використовувати from sound.effects import echo.

Ви можете також використовувати відносне імпортування (relative imports), застосовуючи наступну форму оператора import. from модуль import ім'я. При такому способі імпортування для опису поточного і батьківського пакетів використовується символ точки. Наприклад, для модуля surround ви можете написати:

Зверніть увагу, що відносне імпортування засноване на імені поточного модуля. Оскільки ім'я головного модуля завжди "__main__", модулі, призначені для використання в якості головних модулів програми на Python, повинні завжди використовувати абсолютне імпортування (absolute imports).

Пакети в декількох каталогах

Пакети підтримують ще один спеціальний атрибут: __path__. Перед виконанням файлу __init__.py цього пакета, він ініціалізується списком, що містить ім'я каталогу, в якому цей файл знаходиться. Змінивши змінну, можна вплинути на хід пошуку модулів і підпакетів, що містяться в пакеті.

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

Схожі статті