⚡ Краткий справочник
nonlocal name — связать имя с ближайшей внешней функцией.
func.__closure__ — кортеж ячеек захваченных переменных.
cell.cell_contents — значение внутри ячейки замыкания.
functools.partial(func, arg=value) — зафиксировать аргумент функции.
lambda args: expr — короткая анонимная функция.
Ключевые слова
| Ключевое слово | Описание | Пример |
nonlocal |
Указывает, что переменная принадлежит ближайшей Enclosing-области |
nonlocal count |
global |
Указывает, что переменная принадлежит глобальной области |
global total |
lambda |
Создаёт анонимную функцию |
lambda x: x * 2 |
Атрибуты функций
| Атрибут | Описание | Пример |
func.__name__ |
Имя функции |
'multiplier' |
func.__doc__ |
Строка документации |
'Factory function.' |
func.__closure__ |
Кортеж ячеек замыкания или None |
(<cell at ...>,) |
cell.cell_contents |
Значение, хранимое в ячейке замыкания |
cell.cell_contents |
Стандартная библиотека
| Функция/класс | Описание | Пример |
functools.partial(func, *args, **kwargs) |
Создаёт новую функцию с частично зафиксированными аргументами |
double = partial(mul, 2) |
operator.mul(a, b) |
Умножение двух объектов |
operator.mul(2, 3) # 6 |
Правила использования
nonlocal поднимается только до ближайшей внешней функции, не до глобальной области.
- Если переменная только читается,
nonlocal не нужен — правило LEGB найдёт её само.
- Замыкание «живёт», пока живёт возвращённая внутренняя функция. Сборщик мусора не удалит захваченные переменные.
- Для простых фабрик вместо ручного замыкания можно использовать
functools.partial.