Ключевые и зарезервированные слова языка 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).
- Использовать синонимы (вместо list – items).
- Проверять имя через 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) # 55
Однако внутри блока 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.