У теці з твоїм проєктом лежить файл random.py, який ти написала минулого тижня. Тепер у main.py стоїть import random і виклик random.randint(1, 6). Що станеться?
sys.path першою — раніше за стандартну бібліотеку. Тому імпортується твій файл. Імпорт при цьому проходить успішно, а падає вже виклик: AttributeError на функції, якої в твоєму файлі немає. Саме ця розбіжність («імпорт ок, виклик ні») і є ознакою затінення. Перевірити за секунду: надрукуй random.__file__.У файлі є змінна e = 12 (енергія). Нижче додали рядок from math import *. Що станеться зі змінною e?
math є константа e. Присвоєння тихо замінює старе значення — жодного попередження Python не дає. Це найгірший тип помилки: програма далі рахує правдоподібну дурницю без traceback. Саме тому import * у файлі не пишуть.Модуль nalashtuvannya.py друкує рядок при завантаженні. У main.py чотири рядки: import nalashtuvannya, ще раз import nalashtuvannya, from nalashtuvannya import MOVA та import nalashtuvannya as n. Скільки разів надрукується рядок?
sys.modules, і будь-який наступний імпорт — хоч через as, хоч через from — це просто пошук у цьому словнику. Спокуслива відповідь про «два різні механізми» хибна: from … import теж спершу завантажує модуль цілком і лише потім витягує з нього одне імʼя.Файл zvit.py містить функцію z_pdv і внизу блок if __name__ == "__main__": з print. Що надрукується, якщо з іншого файлу зробити import zvit?
__name__ справжнє імʼя модуля — "zvit", тож умова хибна й блок не виконується. Але тіло модуля виконується повністю: рядок def z_pdv(...) стоїть поза умовою, тому функція створюється й доступна як zvit.z_pdv. У цьому й весь сенс захисної умови: означення лишаються, побічні дії — ні.Що саме з'являється у твоєму файлі після рядка import math as m?
m, і звертання math.sqrt дасть NameError. Модуль при цьому дійсно лежить у sys.modules під ключем "math" — але це словник, а не простір імен твого файлу, тож звичайною змінною math він не стає.Модуль a.py починається з import b, а b.py — з import a і одразу використовує a.KURS. Запускаємо main.py, у якому import a. Чому програма падає з AttributeError?
sys.modules створюється до виконання тіла модуля — саме щоб повторний імпорт не зациклився назавжди. Тому b справді отримує обʼєкт a, тільки він ще недобудований: виконання a.py зупинилося на першому рядку, і KURS ще не створено. Модуль a при цьому існує (варіант про «не існує взагалі» хибний) і виконується рівно один раз.У теці krama лежать __init__.py, tovary.py і підтека zvity зі своїм __init__.py. Що виконається після рядка import krama?
__init__.py. Щоб дістатись до tovary чи підпакета zvity, їх треба назвати явно: from krama import tovary або import krama.zvity.pdf. Варіант «нічого не виконується» хибний: __init__.py — звичайний модуль, і його тіло працює як будь-яке інше (саме тому в ньому зручно робити фасад пакета).Чому файл із відносними імпортами (from .znyzhky import cina) не можна запустити командою python3 krama/tovary.py?
__main__, повного імені в нього немає — звідси ImportError: attempted relative import with no known parent package. Запускати треба через python3 -m krama.tovary з кореня проєкту. Це одна з причин, чому в курсі ми беремо абсолютні імпорти.