История вопроса
Namespaces (пространства имен) — одна из базовых концепций Python, присутствующая еще с первых реализаций языка. Она предназначена для систематизации имён, чтобы избежать конфликтов между переменными, функциями и классами разных частей программы.
Проблема
В больших проектах появляется множество функций, классов, переменных и модулей. Без корректного использования namespaces возможно затереть важные имена, получить неожиданные тени переменных и трудности при тестировании и расширении.
Решение
В Python namespace — это отображение (mapping), связывающее имена с объектами. Существуют разные уровни пространств имён: локальный, глобальный, пространства модулей, классов. Понимание такого деления гарантирует верное обращение к нужным объектам и минимизацию конфликтов.
Пример кода:
def foo(): x = 10 # x в локальном пространстве имен функции print(x) y = 20 # y в глобальном пространстве имен модуля foo() print(y)
Ключевые особенности:
Что произойдет, если в той же функции объявить локальную переменную с таким же именем, как глобальная?
Локальная "затмит" глобальную на время выполнения функции; вне функции глобальная останется неизменной.
a = 1 def test(): a = 2 print(a) # 2 test() print(a) # 1
Как получить список всех имен в текущем пространстве имен?
Функции locals(), globals(), dir() возвращают соответствующие отображения или списки имен в текущей области видимости/namespace.
Чем отличаются пространства имен классов и экземпляров?
Class namespace определяет атрибуты, общие для всех экземпляров класса. Instance namespace — атрибуты конкретного объекта. Изменения в instance не влияют на класс, и наоборот.
Использовали from mymodule import * во всех частях большого проекта. В итоге имена функций затерлись, возникли трудноуловимые баги из-за конфликта имен между пакетами.
Плюсы:
Минусы:
Перешли на алиасы импортов (import mymodule as mm), четкое структурирование модулей.
Плюсы:
Минусы: