Введение
В этой лабораторной работе вы изучите основные концепции зарезервированных слов (reserved words) и предопределенных имен (pre-defined names) в Python. Сначала вы узнаете, как идентифицировать ключевые слова Python — специальные слова с определенным значением, которые нельзя использовать в качестве имен переменных или функций. Мы будем использовать встроенный модуль keyword для их перечисления.
Далее вы откроете для себя встроенные идентификаторы Python, такие как функции и константы, которые всегда доступны в вашем коде. Наконец, вы увидите, почему крайне важно избегать использования ключевых слов и встроенных идентификаторов для собственных имен, чтобы предотвратить ошибки и сохранить ваш код чистым и функциональным.
Идентификация ключевых слов Python
На этом шаге вы узнаете о ключевых словах Python. Ключевые слова, также известные как зарезервированные слова (reserved words), являются фундаментальными строительными блоками синтаксиса языка. Они имеют особое значение и не могут использоваться в качестве имен для ваших переменных, функций или любых других идентификаторов.
Python предоставляет встроенный модуль под названием keyword, который позволяет легко просмотреть все текущие ключевые слова. Давайте напишем скрипт для их отображения.
Необходимый файл, list_keywords.py, уже создан для вас. Найдите его в проводнике файлов (file explorer) в левой части WebIDE и нажмите, чтобы открыть.
Теперь добавьте следующий код в файл list_keywords.py:
import keyword
## Атрибут kwlist содержит список всех ключевых слов.
print(keyword.kwlist)
После сохранения файла откройте интегрированный терминал (integrated terminal) в вашей WebIDE. Вы можете сделать это, нажав Terminal -> New Terminal в верхнем меню.
Запустите ваш скрипт, выполнив следующую команду в терминале:
python ~/project/list_keywords.py
В результате вывода будет представлен список всех ключевых слов 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']
Важно помнить, что эти слова зарезервированы. Python чувствителен к регистру, поэтому, хотя if является ключевым словом, IF таковым не является. Тем не менее, лучшей практикой является избегание использования любых вариаций ключевых слов в качестве имен для поддержания ясности кода.
Изучение встроенных идентификаторов Python
Теперь давайте рассмотрим встроенные идентификаторы (built-in identifiers) Python. Это имена, которые Python предопределяет для вас, включая общие функции, такие как print(), типы данных, такие как int и str, а также исключения (exceptions). Они всегда доступны в любом скрипте Python без необходимости оператора import.
Вы можете просмотреть список всех встроенных идентификаторов, используя функцию dir() для специального объекта, называемого __builtins__.
Откройте файл list_builtins.py в проводнике файлов. Добавьте в него следующий код:
## dir() возвращает список имен в области видимости __builtins__.
print(dir(__builtins__))
Сохраните файл и запустите скрипт из терминала:
python ~/project/list_builtins.py
В консоли будет напечатан длинный список имен. Ниже приведена усеченная версия вывода:
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
Вы узнаете в этом списке много полезных имен, таких как len, input, list и dict. На следующих шагах мы увидим, почему вам следует избегать использования этих имен для ваших собственных переменных.
Избегайте использования ключевых слов в качестве идентификаторов
На этом шаге вы увидите, что произойдет, если вы попытаетесь использовать ключевое слово Python в качестве имени переменной. Поскольку ключевые слова зарезервированы для структуры языка, попытка присвоить им значение приведет к сбою программы еще до ее запуска.
Продемонстрируем это, попытавшись использовать ключевое слово with в качестве имени переменной.
Откройте файл keyword_error.py в редакторе WebIDE. Добавьте следующий код, который намеренно неверен:
## Это вызовет ошибку, потому что 'with' является ключевым словом.
with = 5
print(with)
Сохраните файл и попытайтесь запустить его из терминала:
python ~/project/keyword_error.py
Python немедленно остановится и сообщит об ошибке SyntaxError.
File "/home/labex/project/keyword_error.py", line 2
with = 5
^^^^
SyntaxError: invalid syntax
Сообщение об ошибке SyntaxError: invalid syntax ясно указывает на то, что код структурирован неправильно. Это происходит потому, что интерпретатор Python распознает with как ключевое слово, которое должно начинать оператор with, а не как имя, которое может хранить значение. Это правило применяется ко всем ключевым словам, которые вы перечислили на первом шаге.
Избегайте перезаписи встроенных идентификаторов
В отличие от ключевых слов, Python не запрещает вам переназначать встроенные идентификаторы. Однако такое действие является частой причиной ошибок и должно быть исключено. Когда вы присваиваете новое значение встроенному имени, вы "скрываете" его исходную функциональность, что может привести к неожиданным ошибкам.
Посмотрим, что произойдет, если мы перезапишем встроенную функцию print.
Откройте файл builtin_override.py в редакторе WebIDE. Добавьте следующий код:
## Перезаписываем встроенную функцию print целым числом.
print = 5
## Теперь попытаемся использовать print() как функцию.
print("hello")
Сохраните файл и запустите его из терминала:
python ~/project/builtin_override.py
На этот раз скрипт начинает выполняться, но завершается с ошибкой TypeError.
Traceback (most recent call last):
File "/home/labex/project/builtin_override.py", line 5, in <module>
print("hello")
TypeError: 'int' object is not callable
Ошибка TypeError: 'int' object is not callable возникает потому, что имя print больше не ссылается на встроенную функцию печати. Вместо этого оно ссылается на целое число 5. Поскольку вы не можете "вызвать" целое число как функцию (используя круглые скобки), программа аварийно завершает работу.
Это демонстрирует опасность перезаписи встроенных элементов. Это может нарушить работу вашего кода неочевидными способами и затруднить отладку. Всегда выбирайте уникальные, описательные имена для ваших переменных и функций, чтобы избежать подобных конфликтов.
Резюме
В этой лабораторной работе вы узнали о двух важных категориях имен в Python: ключевых словах (keywords) и встроенных идентификаторах (built-in identifiers). Вы использовали модуль keyword, чтобы получить список всех зарезервированных ключевых слов Python, и увидели, как попытка использовать их в качестве имен переменных приводит к ошибке SyntaxError.
Вы также изучили список встроенных идентификаторов и продемонстрировали проблемы, возникающие при их перезаписи, что может привести к ошибкам TypeError и другим проблемам во время выполнения. Главный вывод заключается в том, что всегда следует выбирать уникальные имена для ваших переменных и функций, избегая как ключевых слов, так и встроенных имен, чтобы ваш код был надежным, читаемым и свободным от конфликтов.



