LEGB, global и nonlocal

Тема дорожной карты · Python Programming

В Python имена переменных идентифицируются по правилу LEGB: Local, Enclosing, Global, Built-in. Это правило определяет порядок поиска переменных в коде, что влияет на поведение программ и их тестирование. Правило LEGB также играет ключевую роль в понимании замыканий и области видимости переменных, что важно для написания эффективного и понятного кода.

Как это работает

LEGB, global и nonlocal используются при объявлении функций с помощью def name(params): body. Параметры могут быть позиционными, keyword, default-значимыми, variadic (*args, **kwargs) или positional-/keyword-only (PEP 570/3102). Команда return возвращает значение функции, или None, если return не имеет аргументов. Функции в Python являются first-class объектами: их можно присваивать переменным, передавать как аргументы, возвращать из других функций. lambda представляет собой анонимную форму-выражение, которая полезна в контексте sorted(key=...), map, filter. Скоупинг переменных происходит по правилу LEGB (Local, Enclosing, Global, Built-in).

Когда применять

Функции следует выносить, когда код повторяется, ему можно дать осмысленное имя, и вы хотите тестировать его изолированно. Предпочтительно использовать чистые функции, которые не имеют побочных эффектов и являются детерминированными, что упрощает их тестирование и композицию. *args и **kwargs следует использовать с осторожностью, так как явные параметры лучше документируют намерение. lambda полезна как маленький inline-коллбэк, но для более сложных функций лучше использовать def с именем.

Типичные ошибки

Типичные ошибки при использовании LEGB, global и nonlocal включают изменяемые значения по умолчанию (def f(x=[]): — список общий между вызовами; используйте x=None и инициализируйте внутри функции), затенение встроенных имён локальными (list = [1,2] потом list(...) ломается), изменение глобального состояния вместо возврата значения (что делает код нетестируемым и неожиданно влияющим на другие части программы), глубоко вложенные замыкания, захватывающие переменные цикла по ссылке, а не по значению. Сигнатуры функций должны быть короткими и явными, чтобы упростить понимание кода.

Связанные понятия

Полезные ресурсы