В Django / Python, как я могу узнать, какой метод вызвал мой метод? - PullRequest
3 голосов
/ 19 января 2012

Я бы первой строкой моего метода была:

print "this method was called from "+filename_and_linenumber_of_code_that_called_it.

Можно ли вызвать исключение, немедленно его перехватить и напечатать трассировку стека при вызове метода?

Ответы [ 4 ]

4 голосов
/ 19 января 2012

Когда я просто хочу, чтобы в какой-то момент произошел сбой кода, чтобы увидеть трассировку, я просто вставил в код «crash».Поскольку он не определен, он потерпит крах, и я увижу след на странице исключений django.Кроме того, если я использую команду runserver_plus, предоставленную django-extensions (требуется пакет werkzeug), тогда я получаю оболочку AJAX в каждом кадре трассировки стека .

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

Быстрый запуск :

  1. run pip install ipython ipdb

  2. заменить оператор печати в вашем коде на import ipdb; ipdb.set_trace()

  3. выполнить ваш код в runserver, он приостановит и вызовет оболочку python, куда вы можете отправить команду "up", чтобы перейти к предыдущему кадру стека (код, который вызвал ваш код) .Наберите l, если вы хотите увидеть больше строк кода.

Длительное начало : на самом деле я написал обзор инструментов, которые помогают отладкуpython и django .

Я не согласен с другими ответами, в которых предлагается добавить более сложное печатное утверждение. Вы хотите быть хорошим разработчиком: вы хотите использовать отладчик .Будь то werkzeug, pdb / ipdb или GUI, это не имеет значения, если вы можете его использовать.

4 голосов
/ 19 января 2012

Нет необходимости генерировать исключение для просмотра стека. У меня есть эта хорошая функция (она не идеальна, но я думаю, что она работает), которая может вам помочь:

import inspect
def log(error):
  frame, filename, ln, fn, lolc, idx = inspect.getouterframes(inspect.currentframe())[1]
  print "Error: " + error + " " + filename, ln, fn

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

1 голос
/ 19 января 2012

Это зависит от CPython:

import sys

def func():
    frm = sys._getframe(1)
    print 'called from %s, line %s' % (frm.f_code.co_filename, frm.f_lineno)

def test():
    func()  # line 8

test()

Печать:

called from /path/to/script.py, line 8
0 голосов
/ 02 мая 2018

Отладчик типа pdb может быть полезен.Смотрите ниже фрагмент.

def f4():
    print "in f4"

def f3():
    import pdb
    pdb.set_trace()
    f4()
    print "in f3"

def f2():
    f3()
    print "in f2"

def f1():
    f2()
    print "in f1"

f1()

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

См. Снимок экрана ниже. enter image description here

...