какое-либо действие до или после вызова любой функции, а не только тех, которые
написали вы. Определим декоратор dump, который позволяет вывести на экран
362
Глава 12. Быть питонщиком
входные аргументы и выводимые значения любой функции по мере ее вызова
(дизайнеры знают, что выходные данные нужно декорировать):
def dump(func):
"Print input arguments and output value(s)"
def wrapped(*args, **kwargs):
print("Function name: %s" % func.__name__)
print("Input arguments: %s" % ' '.join(map(str, args)))
print("Input keyword arguments: %s" % kwargs.items())
output = func(*args, **kwargs)
print("Output:", output)
return output
return wrapped
Перейдем к декорируемой части. Это функция с именем double(), которая при-
нимает именованные или безымянные числовые аргументы и возвращает их удво-
енные значения в списке:
from dump1 import dump
@dump
def double(*args, **kwargs):
"Double every argument"
output_list = [ 2 * arg for arg in args ]
output_dict = { k:2*v for k,v in kwargs.items() }
return output_list, output_dict
if __name__ == '__main__':
output = double(3, 5, first=100, next=98.6, last=-40)
Запустите пример:
$ python test_dump.py
Function name: double
Input arguments: 3 5
Input keyword arguments: dict_items([('last', -40), ('first', 100),
('next', 98.6)])
Output: ([6, 10], {'last': -80, 'first': 200, 'next': 197.2})
Отлаживаем с помощью pdb
Эти приемы полезны, но иногда ничто не сможет заменить настоящий отладчик.
Большинство IDE содержат отладчики, чьи возможности и пользовательские ин-
терфейсы могут варьироваться. В этом разделе я опишу использование стандарт-
ного отладчика Python pdb (https://docs.python.org/3/library/pdb.html).
Если вы запускаете программу с флагом –i, при ее неудачном завершении Python вернет вас
в интерактивный интерпретатор.
Отлаживаем с помощью pdb
363
Рассмотрим программу с ошибкой, которая зависит от входных данных, —
такую ошибку может быть особенно трудно найти. Это реальная ошибка, воз-
никшая в ранние дни программирования, она довольно долго сбивала с толку
программистов.
Мы собираемся считать файл, содержащий названия стран и их столиц, разде-