簡體   English   中英

如何在Python中調試:為什么pdb不會進入函數調用?

[英]How to debug in Python: Why doesn't pdb descend into function call?

我已經找到了一個錯誤,其中io.open()應該通過'utf-8'而不是'utf8' 下面的最小可執行代碼。 為什么IPython回溯不指示行號,為什么pdb既沒有報告錯誤是在io.open函數調用中也沒有報告io.open代碼中的任何內容? 我可以用pdb或IPython調試器或在它上面分層的Canopy調試器做什么來調試這個更容易?

檢查我的IPython版本也令人困惑。 Canopy包管理器報告安裝了ipython 4.0.0-3ipython4 4.0.0-9 ,但import IPython后跟IPython.version_info評估為(2, 4, 1, '') IPython.version_info (2, 4, 1, '')

Canopy代碼編輯器中的my_module.py

import io
def my_function(filename):
    with io.open(my_other_function(filename), u'r', u'utf8')
def my_other_function(text):
    return u'modified' + text

在IPython會話中:

In []: import pdb
In []: import my_module
In []: my_module.my_function(filename)

-------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-5-4c50d9f6cb5c> in <module>()
----> 1 my_module.my_function(filename)

C:\my_module in my_function(filename)

TypeError: an integer is required 

In []: pdb.pm()
> c:\users\bbrown\documents\github\canvasapi-python\capi\my_module.py(3)my_function()
-> with io.open(my_other_function(filename), u'w', u'utf8') as filehandle:

(Pdb) up
> <ipython-input-14-f6d6cc2c1670>(1)<module>()
-> my_module.my_function('testjunk')

(Pdb) down
> c:\users\bbrown\documents\github\canvasapi-python\capi\my_module.py(3)my_function()
-> with io.open(my_other_function(filename), u'w', u'utf8') as filehandle:

(Pdb) args
filename = testjunk

(Pdb) down
*** Newest frame

鑒於'utf-8'作為參數正常工作,該TypeError是令人驚訝的從代碼中,除非發端open ,但到呼叫open未放置在堆棧中,至少不是從通航pdb 感謝您幫助我和其他人學習如何更有效地調試!

io.open是一個內置函數:

In [8]: import io

In [9]: type(io.open)
Out[9]: builtin_function_or_method

它不是用Python編寫的,因此調試器無需調試。 您的錯誤是由傳遞給io.open不正確參數引起的:

open(file, mode='r', buffering=-1, encoding=None,
     errors=None, newline=None, closefd=True, opener=None) -> file object

您傳遞'utf-8'作為第三個參數,但由於buffering應該是一個整數,因此該函數引發了一個描述性TypeError 您可以通過encoding關鍵字參數來修復它:

io.open(filename, mode='r', encoding='utf8')

此外,您不需要顯式導入io模塊。 open builtin功能完全相同:

In [15]: open
Out[15]: <function io.open>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM