Ведение журнала методов в Python - PullRequest
4 голосов
/ 20 июля 2010

Я бы хотел, чтобы что-то эквивалентное

calling method: $METHOD_NAME
args:           $ARGS
output:         $OUTPUT

автоматически регистрировалось в файле (возможно, через модуль logging) для каждого (определяемого пользователем) вызова метода.Лучшее решение, которое я могу придумать, - написать декоратор, который сделает это, а затем добавить его в каждую функцию.Есть ли лучший способ?

Спасибо

Ответы [ 4 ]

6 голосов
/ 20 июля 2010

Вы можете посмотреть на модуль trace в стандартной библиотеке, который

позволяет отслеживать трассировку выполнения программы, генерировать аннотированные списки покрытия операторов, печатать отношения между вызывающим и вызывающим абонентамисписок функций, выполняемых во время выполнения программы.Его можно использовать в другой программе или из командной строки.

Вы также можете войти на диск:

import sys
import trace

# create a Trace object, telling it what to ignore, and whether to
# do tracing or line-counting or both.
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix],
    trace=0,
    count=1)

# run the new command using the given tracer
tracer.run('main()')

# make a report, placing output in /tmp
r = tracer.results()
r.write_results(show_missing=True, coverdir="/tmp")
2 голосов
/ 20 июля 2010

Один из подходов, который может немного упростить ситуацию, - это использование метакласса для автоматического применения вашего декоратора.Это сократило бы набор текста за счет необходимости погружаться в таинственный и таинственный мир программирования метаклассов.

1 голос
/ 20 июля 2010

Декоратор был бы простым подходом для меньшего проекта, однако с декораторами вы должны быть осторожны при передаче аргументов, чтобы убедиться, что они не будут искажены на своем пути. Метакласс, вероятно, был бы более «правильным» способом сделать это, не беспокоясь о добавлении декораторов в каждый новый метод.

1 голос
/ 20 июля 2010

Зависит от того, как именно вы собираетесь его использовать.Наиболее общий подход заключается в том, чтобы следовать пути модуля stdlib 'profile' и, следовательно, иметь контроль над каждым вызовом, но он несколько медленный.

Если вы знаете, какие модули нужно отслеживать, прежде чем дать им контроль, я бы пошелс перебором всех их членов и упаковкой с отслеживающим декоратором.Таким образом, отслеживаемый код остается чистым, и для его реализации не требуется много кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...