Почему IPython не предоставляет мне полную трассировку модуля, который я написал?

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

Примечание. Меня не смущает причина этой конкретной ошибки, а то, почему IPython не показывает мне причину.

Мой модуль называется module.py и содержит функцию function, под которой написан блок if __name__ == '__main__'. (Имена модулей и функций были изменены, чтобы защитить личность невиновных — или, может быть, не таких уж невиновных.)

Вот трассировка, которую я получаю, когда возникает ошибка. (Обратите внимание на отсутствие информации о том, какая строка в function вызвала ошибку.)

In [1]: import module as m

In [2]: call = m.function('hello')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ec0c1e40ec8c> in <module>()
----> 1 call = m.function('hello')

/home/module.py in function(greeting)

TypeError: join() takes exactly one argument (2 given)

person dbliss    schedule 20.11.2013    source источник
comment
Я не знаю IPython, но почему это проблема? В ошибке есть вся необходимая информация.   -  person aIKid    schedule 20.11.2013
comment
Не могли бы вы немного рассказать о бите if __name__ == "__main__"? Определена ли функция в этом блоке? Если это так, я не уверен, как ваш вызов функции вообще работал. Можете ли вы дать SSCCE модуля?   -  person Blckknght    schedule 20.11.2013
comment
В ошибке нет всей необходимой мне информации. Например, предположим, что в function много вызовов join(). Трассировка не говорит мне, какой из них вызвал ошибку. Это необычно; трассировка обычно указывала бы мне на строку в исходном коде, которая вызвала ошибку. Что-то не так в этой ситуации, и я не уверен, что именно.   -  person dbliss    schedule 20.11.2013
comment
Судя по вашему описанию, я не могу воспроизвести ошибку. Я сделал module.py с функцией, которая просто вызывает TypeError, и блок if __name__ == "__main__":, который просто имеет оператор печати. Это вызывает ошибку для вас? Если нет, можете ли вы придумать минимальный пример для воспроизведения ошибки? Если да, можете ли вы предоставить некоторые сведения о вашей настройке (версия Python, версия Ipython и т. д.)?   -  person hunse    schedule 20.11.2013
comment
Нет, функция не определена в блоке if __name__ == '__main__'. Это было бы возмутительно. Кроме того, в моем вопросе я утверждаю, что этот блок находится под функцией. Чтобы уточнить, блок if __name__ == '__main__' находится ниже завершенного определения функции, ниже оператора return.   -  person dbliss    schedule 20.11.2013
comment
Извините, ребята, у меня большие проблемы с созданием минимального примера, который воспроизводит проблему. И как ни странно, эта проблема не возникает, когда я вызываю файл как скрипт и вызываю function в блоке if __name__ == '__main__'. Я сообщу, как только смогу привести полезный пример.   -  person dbliss    schedule 20.11.2013
comment
может быть разница в __builtin__ при запуске модуля/импорте.   -  person User    schedule 20.11.2013


Ответы (1)


Вы пробовали с %xmode ?

In [2]: %xmode?
Type:       Magic function
Definition: %xmode(self, parameter_s='')
Docstring:
Switch modes for the exception handlers.

Valid modes: Plain, Context and Verbose.

If called without arguments, acts as a toggle.

если вы внимательно посмотрите, 2 следующих примера отличаются, но разница более заметна при длинных трассировках:

In [8]: raise ValueError('Foo')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-05e81bf5c607> in <module>()
----> 1 raise ValueError('Foo')
        global ValueError = undefined

ValueError: Foo

Обычный режим

In [9]: xmode
Exception reporting mode: Plain

In [10]: raise ValueError('Foo')
Traceback (most recent call last):
  File "<ipython-input-10-05e81bf5c607>", line 1, in <module>
    raise ValueError('Foo')
ValueError: Foo
person Matt    schedule 20.11.2013
comment
Это решило проблему для меня. Тем не менее, «обычный» xmode Ipython не обеспечивает всю обратную трассировку, ожидаемую при использовании формата «raise... from» Python3. Он хорошо работает только в режимах «Контекст» и «Подробный». Между прочим, режим «Подробный» — это излишество. - person idichekop; 02.09.2015
comment
я не пробовал это, но поскольку это сработало для @idichekop, я согласился. - person dbliss; 28.09.2015