Тест самоперевірки

Модулі й пакети

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

У теці з твоїм проєктом лежить файл random.py, який ти написала минулого тижня. Тепер у main.py стоїть import random і виклик random.randint(1, 6). Що станеться?

Чому так. Маршрут пошуку йде згори вниз, і тека, з якої запустили скрипт, стоїть у sys.path першою — раніше за стандартну бібліотеку. Тому імпортується твій файл. Імпорт при цьому проходить успішно, а падає вже виклик: AttributeError на функції, якої в твоєму файлі немає. Саме ця розбіжність («імпорт ок, виклик ні») і є ознакою затінення. Перевірити за секунду: надрукуй random.__file__.
Питання 2 / 8

У файлі є змінна e = 12 (енергія). Нижче додали рядок from math import *. Що станеться зі змінною e?

Чому так. Зірочка виконує звичайне присвоєння для кожного публічного імені модуля, а в math є константа e. Присвоєння тихо замінює старе значення — жодного попередження Python не дає. Це найгірший тип помилки: програма далі рахує правдоподібну дурницю без traceback. Саме тому import * у файлі не пишуть.
Питання 3 / 8

Модуль nalashtuvannya.py друкує рядок при завантаженні. У main.py чотири рядки: import nalashtuvannya, ще раз import nalashtuvannya, from nalashtuvannya import MOVA та import nalashtuvannya as n. Скільки разів надрукується рядок?

Чому так. Тіло модуля виконується рівно один раз за запуск програми. Після цього готовий обʼєкт лежить у словнику sys.modules, і будь-який наступний імпорт — хоч через as, хоч через from — це просто пошук у цьому словнику. Спокуслива відповідь про «два різні механізми» хибна: from … import теж спершу завантажує модуль цілком і лише потім витягує з нього одне імʼя.
Питання 4 / 8

Файл zvit.py містить функцію z_pdv і внизу блок if __name__ == "__main__": з print. Що надрукується, якщо з іншого файлу зробити import zvit?

Чому так. При імпорті Python кладе в __name__ справжнє імʼя модуля — "zvit", тож умова хибна й блок не виконується. Але тіло модуля виконується повністю: рядок def z_pdv(...) стоїть поза умовою, тому функція створюється й доступна як zvit.z_pdv. У цьому й весь сенс захисної умови: означення лишаються, побічні дії — ні.
Питання 5 / 8

Що саме з'являється у твоєму файлі після рядка import math as m?

Чому так. Псевдонім замінює імʼя, а не додає друге: у просторі імен зʼявляється рівно одне імʼя m, і звертання math.sqrt дасть NameError. Модуль при цьому дійсно лежить у sys.modules під ключем "math" — але це словник, а не простір імен твого файлу, тож звичайною змінною math він не стає.
Питання 6 / 8

Модуль a.py починається з import b, а b.py — з import a і одразу використовує a.KURS. Запускаємо main.py, у якому import a. Чому програма падає з AttributeError?

Чому так. Порожній запис у sys.modules створюється до виконання тіла модуля — саме щоб повторний імпорт не зациклився назавжди. Тому b справді отримує обʼєкт a, тільки він ще недобудований: виконання a.py зупинилося на першому рядку, і KURS ще не створено. Модуль a при цьому існує (варіант про «не існує взагалі» хибний) і виконується рівно один раз.
Питання 7 / 8

У теці krama лежать __init__.py, tovary.py і підтека zvity зі своїм __init__.py. Що виконається після рядка import krama?

Чому так. Імпорт пакета виконує тільки його __init__.py. Щоб дістатись до tovary чи підпакета zvity, їх треба назвати явно: from krama import tovary або import krama.zvity.pdf. Варіант «нічого не виконується» хибний: __init__.py — звичайний модуль, і його тіло працює як будь-яке інше (саме тому в ньому зручно робити фасад пакета).
Питання 8 / 8

Чому файл із відносними імпортами (from .znyzhky import cina) не можна запустити командою python3 krama/tovary.py?

Чому так. Крапка означає «мій пакет», а пакет визначається повним іменем модуля. При прямому запуску файл реєструється як __main__, повного імені в нього немає — звідси ImportError: attempted relative import with no known parent package. Запускати треба через python3 -m krama.tovary з кореня проєкту. Це одна з причин, чому в курсі ми беремо абсолютні імпорти.