2012-05-02 4 views
6

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

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

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

Я попытался проиллюстрировать его с кодом, но я не знаю, если это помогает:

def i_dont_care_about_this(fn): 
    @functiontools.wraps(fn) 
    def wrapper(*args, **kwargs): 
     return fn(*args, **kwargs) 
    return wrapper 

@i_dont_care_about_this 
def i_only_care_about_this(): 
    # no use to set pdb here 

def i_am_here(): 
    import pdb; pdb.set_trace() 
    i_only_care_about_this() 

Итак, есть ли способ для меня, чтобы войти в i_only_care_about_this из i_am_here, не проходя через i_dont_care_about_this?

По сути, я хочу, чтобы пропустить весь код декоратора при использовании s к (сек) теп в данной украшенной функции.

+2

Как PDB должен знать, что функция оформлена и в что указывает на то, что исходная функция д? Вам нужно будет адаптировать как ваши декораторы, так и PDB, чтобы сделать что-то подобное. –

+0

Я думал, что может быть так, как мои знания о том, как Python обрабатывает декораторов внутри, несколько ограничены. –

ответ

4

Я не думаю, что вы можете это сделать. Это изменило бы значение шага как нечто совсем другое.

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

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

+0

Хм, я думаю, что ОП уже знает это, по крайней мере, он описывает это в вопросе как возможность, которую он уже рассмотрел. –

+0

У меня на самом деле нет, и в некоторых случаях это может помочь –

6

Если декоратор чисто для регистрации или других нефункциональных поведения, а затем сделать его не-оп для отладки - вставить этот код сразу после определения i_dont_care_about_this:

DEBUG = False 
# uncomment this line when pdb'ing 
# DEBUG = True 
if DEBUG: 
    i_dont_care_about_this = lambda fn : fn 

Но если он содержит фактические активный код, то вам придется сделать работу с помощью PDB методов, таких как призыв помощью условной pdb.set_trace внутри коды внутри декоратора:

BREAK_FLAG = False 
... 
# (inside your function you want to debug) 
if BREAK_FLAG: 
    import pdb; pdb.set_trace() 
... 
# at your critical calling point 
BREAK_FLAG = True