Найти - Пользователи
Полная версия: Декоратор для запуска pdb в нужном месте стека вызовов
Начало » Python для экспертов » Декоратор для запуска pdb в нужном месте стека вызовов
1
lorien
Реально ли написать такой декоратор, чтобы можно было завернуть в него функцию и потом в случае возникнования исключения получить pdb сесси внутри функции до/после строчки которая породила exception

Например, декоратор:

def debug(func):
    def inner(*args, **kwargs):
        try:
            for res in func(*args, **kwargs):
                yield res 
        except Exception, ex: 
            import pdb 
            pdb.post_mortem()
    return inner

Откроет сессию непосредственно в месте, где возникло исключение, например, если обёрнутая в декоратор функция вызвала другую, а та другую и где-то там возникло исключение, то pdb сессия откроется где-то там, в глубине, а мне нужна сесссия непосредственно в той функции, которую я обернул декоратором. Простой pdb.set_trace() тоже не канает, т.к. сессия откроется внутри декоратора.
sergeek
up? Или тебе нужно именно заавтоматизировать выход до фрейма декорированной функции? Тогда:
import pdb
def up_to_decorated(self, pos):
    while self.curindex > 1:
        self.do_up(pos)
pdb.Pdb.do_uu = up_to_decorated
def debug(func):
    def inner(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except Exception,e: 
            pdb.post_mortem()
    return inner
@debug
def decorated(a, b):
    return deeper(a, b)
def deeper(a, b):
    return more_deeper(a,b)
def more_deeper(a,b):
    return a/b
    
decorated(1,0)

sergeek@sergeek-desktop ~ $ python ~/test/pddb.py 
> /home/sergeek/test/pddb.py(25)more_deeper()
-> return a/b
(Pdb) uu
> /home/sergeek/test/pddb.py(22)deeper()
-> return more_deeper(a,b)
> /home/sergeek/test/pddb.py(19)decorated()
-> return deeper(a, b)
(Pdb)

ты же сам недавно ратовал за чтение исходников. Почему не посмотрел ?
Или я все-таки неправильно понял?


lorien
Я глянул в исходники werkzeug, там ведь тоже есть фича такая, middleware, которая позволяет в браузере на любом уровне стека смотреть переменные, но ничего там не понял и решил тут спросить. В исходники pdb не пришло в голову посмотреть.

Если честно, мне не нравится, твоё решение (патчинг стандартной либы). Если не найду ничего лучше, буду его юзать, спасибо. А нужно мне всё это вот для чего, я пишу очень много скраперов и часто возникает нужда без лишних телодвижений поймать внутри функции (обработчика сетевого ответа) исключение на уровне функции. Вот хочу в такой декоратор заворачивать функции.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB