О пространстве имён и интерактивной отладке кода
newbie
Опубликован: | 2018-12-10T06:56:13.825521Z |
Отредактирован: | 2018-12-10T06:56:13.825521Z |
Прежде чем начать писать о разработке web-приложений на Python3, мне хотелось бы своими словами и в доступных образах разобрать некоторые основополагающие моменты и термины, касающиеся непосредственно разработки программ на Питоне в целом. В этом выпуске поговорим о пространстве имён, его видах и вкратце коснёмся интерактивной отладки кода.
Каждая программа написанная на Питоне вообще, и на Python3 в частности, является ни чем иным, как исполняемым пространством имён. Пространство имён можно определить как выделенную обособленную область оперативной памяти компьютера, в которой создаются, хранятся и обрабатываются данные необходимые программе, и к которой обращается интерпретатор в процессе исполнения программы. Питон различает три вида пространств имён:
- модуль;
- класс;
- функция.
Модуль - основной вид пространства имён. Каждая программа на Питоне является модулем. Модуль может быть частью пакета, может содержать определения переменных, функций, классов, а также процедурные действия над ними (изменение значений переменных, вызовы функций, создание экземпляров классов и так далее). Создать модуль можно двумя способами. Первый способ - запуск интерпретатора Питона в интерактивном режиме. Второй способ - создание текстового файла с расширением .py
для последующего исполнение этого файла интерпретатором Питона. Первый вариант стоит разобрать в деталях.
Запустить Питон в интерактивном режиме очень просто, для этого понадобится любая терминальная программа. Запускаю терминал из системного меню и в окне терминала вбиваю команду python3
.
В момент запуска интерпретатора в интерактивном режиме на экран выводится версия интерпретатора, версия компилятора, которым этот интерпретатор был скомпилирован, минимальная справочная информация и приглашение >>>
, после которого стоит курсор в ожидании пользовательского ввода, а также в этот момент в оперативной памяти компьютера создаётся пространство имён для текущей интерактивной сессии. Питон достаточно продвинут и предлагает целый набор инструментов для управления созданным пространством имён, что позволяет в свою очередь осуществлять предварительную отладку и конструирование кода непосредственно в интерактивной сессии.
Список уже существующих объектов в текущем пространстве имён можно посмотреть вызовом функции dir.
>>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__'] >>>
Как видно из предыдущего листинга, вновь созданное пространство имён уже содержит несколько предопределённых объектов. Стоит отметить, что, поскольку Питон - объектно-ориентированный диалект, всё в Питоне есть object
, object
- это самый базовый тип, от которого наследуют все остальные встроенные типы этого диалекта. Среди предопределённых объектов в созданном пространстве имён чуть подробней стоит остановиться на __builtins__
, __name__
и __package__
. Посмотрим, какую информацию можно получить об этих объектах. Сначала проверю, являются ли они экземплярами object
.
>>> isinstance(__builtins__, object) True >>> isinstance(__name__, object) True >>> isinstance(__package__, object) True >>>
Теперь посмотрим на тип каждого из этих объектов.
>>> type(__builtins__) <class 'module'> >>> type(__name__) <class 'str'> >>> type(__package__) <class 'NoneType'> >>>
Ну и наконец посмотрим, что возвращает каждый из этих объектов.
>>> print(__builtins__) <module 'builtins' (built-in)> >>> print(__name__) __main__ >>> print(__package__) None >>>
Таким образом, я совершенно резонно делаю вывод, что каждый объект в пространстве имён имеет три составляющие:
- имя;
- тип;
- возвращаемое значение.
Попробуем создать новый объект в пространстве имён своей интерактивной сессии, назначаю этому объекту имя x
и присваиваю ему в качестве значения целое число.
>>> x = 1 >>>
В результате в текущем пространстве имён появился новый объект, у которого есть имя, тип и возвращаемое значение, и к этому объекту можно обратиться по его имени.
>>> type(x) <class 'int'> >>> print(x) 1 >>>
Что будет, если изменить значение переменной x
?
>>> x = 'hello world!' >>>
Теперь имени x
соответствует новый объект.
>>> type(x) <class 'str'> >>> print(x) hello world! >>>
Следует обратить внимание, что тип объекта в Питоне определяется динамически в зависимости от типа хранящихся в этом объекте данных. Это свойство Питона принято называть динамической типизацией.
По имени к объекту можно обращаться и выполнять с этим объектом процедурные действия, а все объекты без имени становятся добычей сборщика мусора и автоматически удаляются из пространства имён. Например, когда я присвоил уже существующей переменной x
новое значение, я создал новый объект, а предыдущий объект (целое число 1), на который ссылалась переменная x
, утратил имя и был автоматически удалён из пространства имён сборщиком мусора.
Получить объект в пространстве имён можно и другими способами, а именно:
- можно импортировать объект из другого модуля;
- можно определить класс;
- можно определить функцию.
В настоящий момент пространство имён моей интерактивной сессии содержит кроме предопределённых объектов ещё и пользовательскую переменную x
.
>>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x'] >>>
Каждая пользовательская переменная имеет соответствующие её типу методы, список этих методов для конкретного объекта тоже можно увидеть с помощью вызова функции dir с соответствующим аргументом.
>>> dir(x) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>>
По каждому методу можно получить справку не покидая интерактивной сессии.
>>> help(x.endswith) Help on built-in function endswith: endswith(...) method of builtins.str instance S.endswith(suffix[, start[, end]]) -> bool Return True if S ends with the specified suffix, False otherwise. With optional start, test S beginning at that position. With optional end, stop comparing S at that position. suffix can also be a tuple of strings to try. (END)
Примечание: чтобы убрать с экрана справку и вернуться в интерактивную сессию, достаточно нажать клавишу q
.
Поскольку объект в пространстве имён можно создать, объект из пространства имён можно и удалить. Делается это с помощью оператора del.
>>> del x >>>
Теперь в пространстве имён текущей интерактивной сессии нет объекта с именем x
.
>>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__'] >>>
Возникает резонный вопрос, а как в текущем пространстве имён появились имена dir, type, isinstance, help, print? Все перечисленные имена являются встроенными функциями Питона. Все они подгружаются в пространство имён интерактивной сессии из модуля builtins автоматически при запуске интерпретатора. Список имён в модуле builtins тоже можно увидеть с помощью вызова dir.
>>> dir(__builtins__)
И если явным образом импортировать этот модуль, то можно увидеть следующую картину:
>>> import builtins >>> __builtins__ is builtins True >>>
Повторюсь, модуль builtins подгружается автоматически в каждый модуль Питона и не требует явного импорта.
По каждому объекту из модуля builtins можно получить справку при помощи встроенной функции help не покидая интерактивную сессию, например:
>>> help(isinstance)
Подробнее на модуле builtins и его составляющих я, вероятно, остановлюсь отдельно в ближайшей перспективе. Примеры использования некоторых встроенных функций и интерактивную отладку кода можно посмотреть в одном из предыдущих выпусков этого блога. Кроме того, в блоге есть описание процесса создания элементарной программы на Питоне с использованием интерактивной отладки. Замечу, что иногда интерактивная отладка бывает увлекательнее самого захватывающего экшена и позволяет быстро и просто найти решение для достаточно сложных и запутанных задач, поэтому можно смело считать интерактивный режим интерпретатора Python настоящей жемчужиной этого диалекта.
Метки: | python3x, builtins, dir, type, isinstance |