Наше знакомство со строками было в лучшем случае поверхностным, но сейчас нужно ненадолго прерваться для обсуждения двух важных функций и одной библиотеки, включенных в поставку Python. Первая функция — dir — показывает, каким мощным и полезным инструментом является REPL. Функция dir возвращает атрибуты объекта. Если у вас открыт интерпретатор Python и вы хотите узнать атрибуты строки, эта функция выдает следующий результат:
>>> dir('Matt')
['__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']
dir выводит все атрибуты переданного объекта. Так как функции dir была передана строка 'Matt', функция выводит атрибуты строки. Эта удобная возможность языка Python демонстрирует его философию по принципу «батарейки прилагаются»: Python предоставляет простой механизм для получения атрибутов любого объекта. В других языках для получения доступа к такой функциональности могут потребоваться специальные сайты, документация или IDE, но в Python благодаря наличию REPL эту информацию можно получить быстро и легко.
Список атрибутов упорядочен по алфавиту; на первую пару атрибутов, начинающихся с __, обычно можно не обращать внимания. Позднее вам встретятся такие атрибуты, как capitalize (запись строки с прописной буквы), format (форматирование строк, продемонстрированное выше) или lower (преобразование строки к нижнему регистру). Эти атрибуты являются методами — функциями, связанными с объектами. Чтобы вызвать функцию, поставьте точку после объекта, укажите имя метода и поставьте круглые скобки.
Три примера вызова методов:
>>> print('matt'.capitalize())
Matt
>>> print('Hi {}'.format('there'))
Hi there
>>> print('YIKES'.lower())
yikes
Возможно, вас интересуют атрибуты, начинающиеся с __. Как было сказано выше, эти атрибуты соответствуют методам; люди называют их специальными, волшебными или дандер-методами (dunder methods). Специальные методы определяют, что происходит во внутренней реализации при выполнении операций с объектами. Например, при применении оператора + или % к строке будет вызван метод .__add__ или .__mod__ соответственно. Неопытные программисты Python обычно забывают о специальных методах. Но когда вы начнете реализовывать собственные классы и захотите, чтобы они реагировали на такие операции, как + или %, вы можете определить их.
СОВЕТ
В документации help() имеется тема SPECIALMETHODS с описаниями этих методов.
Также описания доступны на сайте Python. Откройте раздел Documentation, Language Reference, Data Model — они находятся здесь.
Help — другая встроенная функция, используемая в сочетании с REPL. В книге ранее уже упоминался вызов help() без аргументов для вызова справочной документации.
Функция help также выводит документацию для метода, модуля, класса или функции, переданной в аргументе. Например, если вас интересует, что делает атрибут upper у строк, информация может быть получена следующим вызовом:
>>> help('some string'.upper)
Help on built-in function upper:
upper(...) method of builtins.str instance
S.upper() -> str
Return a copy of S converted to uppercase.
Функция help в сочетании с REPL позволяет читать документацию, не открывая браузера, и даже без доступа к интернету. Даже если вы попали на необитаемый остров, все равно сможете изучать Python — для этого понадобится лишь компьютер с установленной версией Python и источник питания.
В Python также включен отладчик для пошагового выполнения кода. Он находится в модуле с именем pdb. Эта библиотека построена по образцу библиотеки gdb языка C. Чтобы выйти в отладчик в любой точке программы Python, вставьте в нее следующий код:
import pdb; pdb.set_trace()
На самом деле здесь две команды, но я обычно размещаю их в одной строке, разделив точкой с запятой (;) — так после завершения отладки обе команды можно будет удалить одним нажатием клавиши в редакторе. Пожалуй, это единственная ситуация, в которой я использую точку с запятой в коде Python (две команды в одной строке).
При выполнении в этой строке открывается приглашение (pdb), напоминающее приглашение REPL. В нем также можно выполнять код, просматривать объекты и переменные. Кроме того, вы сможете установить точки прерывания для последующего анализа.
Ниже приведена таблица со списком полезных команд pdb:
Команда | Описание |
h, help | Вывести список доступных команд |
n, next | Выполнить следующую строку |
c, cont, continue | Продолжать выполнение до следующей точки прерывания |
w, where, bt | Вывести трассировку стека с информацией о текущей позиции выполнения |
u, up | Подняться на уровень вверх в стеке |
d, down | Опуститься на уровень вниз в стеке |
l, list | Вывести исходный код текущей строки |
ПРИМЕЧАНИЕ
В книге «Programming Pearls» Джон Бентли (Jon Bentley) пишет:
«Когда мне приходится отлаживать маленький алгоритм где-то в недрах большой программы, я иногда использую средства отладки… хотя команды отладочного вывода обычно быстрее реализуются и работают эффективнее хитроумных отладчиков».
Я слышал, как Гвидо ван Россум, создатель Python, высказывает то же мнение: он предпочитает отладочный вывод. Принцип отладочного вывода прост: вы вставляете функции print, которые поясняют, что происходит в программе. Часто этого оказывается достаточно для выявления проблемы. Не забудьте удалить команды отладки или преобразовать их в команды записи в журнал перед выпуском кода.
Если потребуется более серьезный анализ, вы всегда можете воспользоваться модулем pdb.
Python предоставляет много вспомогательных инструментов, упрощающих жизнь разработчика. Если вы научились работать с REPL, то сможете пользоваться ими. Функция dir выводит информацию о том, какими атрибутами обладает объект. Функция help поможет проанализировать эти атрибуты для документации.
В этой главе также был представлен модуль pdb. Этот модуль позволяет выполнять код в пошаговом режиме, что может быть полезно при отладке.
1. Откройте REPL и создайте переменную name со своим именем. Выведите атрибуты строки. Выведите справочную документацию для методов .find и .title.
2. Откройте REPL и создайте переменную age со своим возрастом. Выведите атрибуты целого числа. Выведите справочную документацию для метода .numerator.