Ключевые и зарезервированные слова языка Python

Раздел: Основы Python -> Переменные и идентификаторы

Зарезервированные имена в Python

В языке Python существует набор зарезервированных имён (ключевых слов), которые нельзя использовать в качестве идентификаторов переменных, функций, классов и других объектов. Попытка присвоить значение ключевому слову вызывает SyntaxError. Понимание этих имён помогает избежать синтаксических ошибок и сделать код предсказуемым.

Как получить полный список зарезервированных имён и проверить конкретное имя?

Стандартный модуль keyword предоставляет два инструмента:

  • keyword.kwlist – список всех ключевых слов текущей версии Python.
  • keyword.iskeyword(s) – возвращает True, если строка s является ключевым словом.
import keyword

# Вывод списка всех ключевых слов
print(keyword.kwlist)

# Проверка конкретного имени
print(keyword.iskeyword('for'))    # True
print(keyword.iskeyword('value'))  # False

имена переменных в python (имена переменных в python)

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
True
False

Python зарезервированные имена (зарезервированные имена в python)

Возможная проблема:

Если код написан в интерактивной среде, keyword.kwlist может содержать устаревший список (например, после обновления Python без перезапуска интерпретатора). Решение – перезапустить сессию.

Типичная ошибка: попытка использовать ключевое слово как имя переменной:

class = 10  # SyntaxError: invalid syntax

русские имена python (русские имена в python)

Исправление – выбрать другое имя, например class_ или cls.

Как избежать случайного использования зарезервированного имени?

При именовании переменных полезно применять одно из правил:

  • Добавлять символ подчеркивания в конце имени (например, type_ вместо type).
  • Использовать синонимы (вместо listitems).
  • Проверять имя через keyword.iskeyword() перед созданием переменной.
import keyword

name = 'type'
if not keyword.iskeyword(name):
    exec(f'{name} = 42')
else:
    print(f'{name} нельзя использовать как имя')
type нельзя использовать как имя

Возможная проблема:

Использование exec в реальном коде не рекомендуется из-за рисков безопасности. Лучше заранее выбрать безопасное имя.

Что делать, если нужно использовать имя, совпадающее с устаревшим или мягким ключевым словом?

Начиная с Python 3.10 появились мягкие ключевые слова (match, case и _). Они зарезервированы только внутри конструкций match/case. В остальном контексте их можно использовать как обычные имена.

match = 5  # допустимо вне блока match
print(match)  # 5
5

Однако внутри блока match эти имена ведут себя как ключевые слова, поэтому их переопределение внутри такого блока приведёт к ошибке.

Типичная ошибка:

match = [1, 2, 3]
match match:  # SyntaxError: invalid syntax
    case _: pass

Решение: не используйте match как имя переменной, если планируете применять оператор match в той же области видимости.

Как обрабатывать имена встроенных функций, не являющихся ключевыми словами?

Встроенные имена (например, print, len, int) технически не зарезервированы, но их переопределение может нарушить работу кода. Если необходимо временно использовать такое имя, следует сохранить оригинал:

original_print = print
print = lambda x: original_print(f'Лог: {x}')

print('Сообщение')  # переопределённый print
original_print('Сообщение')  # оригинал
Лог: Сообщение
Сообщение

Проблема:

Если переопределить встроенную функцию, код внутри той же области видимости, который полагается на оригинал, сломается. Решение: избегать переопределения, либо использовать замыкания или декораторы.

Расширенные примеры работы с зарезервированными именами

1. Динамическая проверка всех ключевых слов

Пример
import keyword

# Выведем ключевые слова в алфавитном порядке
kw_sorted = sorted(keyword.kwlist)
for i, kw in enumerate(kw_sorted, 1):
    print(f'{i:2}. {kw}')
 1. False
 2. None
 3. True
 4. and
 5. as
 6. assert
 7. async
 8. await
 9. break
10. class
11. continue
12. def
13. del
14. elif
15. else
16. except
17. finally
18. for
19. from
20. global
21. if
22. import
23. in
24. is
25. lambda
26. nonlocal
27. not
28. or
29. pass
30. raise
31. return
32. try
33. while
34. with
35. yield

2. Создание безопасного имени из строки

Пример
import keyword

def safe_name(base):
    """Добавляет подчёркивание, если имя зарезервировано."""
    if keyword.iskeyword(base):
        return base + '_'
    return base

names = ['class', 'def', 'value', 'for']
safe_names = [safe_name(n) for n in names]
print(safe_names)  # ['class_', 'def_', 'value', 'for_']
['class_', 'def_', 'value', 'for_']

3. Проверка возможности использования имени как идентификатора

Пример
import keyword

def is_valid_identifier(name):
    """Возвращает True, если имя может быть переменной."""
    return name.isidentifier() and not keyword.iskeyword(name)

test_names = ['_private', 'my_var', 'class', '42abc', 'for']
for n in test_names:
    print(f'{n:10} -> {is_valid_identifier(n)}')
_private   -> True
my_var     -> True
class      -> False
42abc      -> False
for        -> False

Пояснение: метод str.isidentifier() проверяет, что строка является допустимым идентификатором Python (начинается с буквы или подчёркивания, содержит буквы, цифры, подчёркивания). Комбинация с keyword.iskeyword() даёт полную проверку.

4. Обработка случая с мягкими ключевыми словами (Python 3.10+)

Пример
import sys
if sys.version_info >= (3, 10):
    # Мягкие ключевые слова: match, case, _
    match_var = 100
    case_val = 200
    
    # Используем оператор match
    match (match_var, case_val):
        case (100, 200):
            print('Первый вариант')
        case _:
            print('Другой')
    
    # Проверим, что имена переменных остались
    print(f'match_var = {match_var}, case_val = {case_val}')
Первый вариант
match_var = 100, case_val = 200

Важно: внутри блока match имена match и case ведут себя как ключевые слова, поэтому их нельзя использовать как имена переменных внутри этого блока. Однако вне блока они остаются обычными идентификаторами.

5. Пример синтаксической ошибки при использовании зарезервированного имени

Пример
# Попытка создать переменную с именем 'global'
global = 5  # SyntaxError: invalid syntax

Исправленный вариант:

Пример
global_val = 5  # допустимо

Такая ошибка возникает при попытке присвоить значение любому ключевому слову из keyword.kwlist.

Зарезервированные имена в Python - comments

En
Python зарезервированные имена (python)