Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 282

функции. Это значит, что вы можете использовать декоратор, чтобы выполнить

какое-либо действие до или после вызова любой функции, а не только тех, которые

написали вы. Определим декоратор 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

Рассмотрим программу с ошибкой, которая зависит от входных данных, —

такую ошибку может быть особенно трудно найти. Это реальная ошибка, воз-

никшая в ранние дни программирования, она довольно долго сбивала с толку

программистов.

Мы собираемся считать файл, содержащий названия стран и их столиц, разде-