Импорт модулей стандартной библиотеки
Содержание курса
Форма from … import и типичные конфликты имён
До этого момента мы всегда писали import math и обращались к функциям через точку: math.sqrt, math.pi. Это безопасно и явно. Но Python предлагает ещё один способ — перенести конкретное имя прямо в ваше пространство имён:
from math import sqrt, pi
print(sqrt(25)) # 5.0 — без префикса math
print(pi) # 3.141592653589793
После такого импорта sqrt и pi доступны напрямую, без math. перед ними. Это удобно, когда функция используется часто и префикс только загромождает код.
Можно импортировать и одно конкретное имя:
from random import choice
print(choice(['камень', 'ножницы', 'бумага']))
Остальное содержимое random при этом недоступно — только то, что вы явно указали в from … import.
Где это создаёт проблемы
Первая ловушка — конфликт имён. Когда вы пишете from math import sqrt, имя sqrt появляется в вашем пространстве имён. Если чуть ниже вы создадите переменную с тем же именем, она тихо перезапишет функцию:
from math import sqrt
sqrt = 'просто строка' # перезаписали функцию
print(sqrt(16)) # TypeError: 'str' object is not callable
При import math такого не случилось бы: ваша переменная называлась бы sqrt, а функция оставалась бы доступной как math.sqrt — в разных пространствах имён они не мешали бы друг другу.
Вторая ловушка — имя вашего файла. Если вы назовёте файл math.py или random.py, Python при выполнении import math найдёт ваш файл раньше, чем стандартный модуль, и импортирует его. В вашем файле нет ни sqrt, ни pi — получите AttributeError в самом неожиданном месте.
# Файл называется math.py
import math
print(math.sqrt(9)) # AttributeError: module 'math' has no attribute 'sqrt'
Решение простое: никогда не называйте свои файлы так же, как модули стандартной библиотеки. Если уже случилось — переименуйте файл и удалите кеш __pycache__.
Когда что использовать
import math — надёжный вариант по умолчанию. Пространства имён не пересекаются, и из кода сразу видно, откуда пришла каждая функция.
from math import sqrt оправдан, когда функция используется многократно и вы уверены, что имя не будет переопределено в том же файле. В коротких скриптах это нормально; в больших проектах — лучше придерживаться точечной нотации.
