2016-01-01 35 views
0

我追查了一個錯誤,其中io.open()應該已經通過'utf-8'而不是'utf8'。下面的最小可執行代碼。爲什麼IPython回溯沒有顯示行號,爲什麼pdb既沒有報告錯誤是io.open函數調用,也沒有報告io.open代碼中的任何內容?我可以用pdb或IPython調試器或Canopy debugger分層做什麼,以便更輕鬆地調試該調試器?如何在Python中進行調試:爲什麼沒有pdb進入函數調用?

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

在樹冠代碼編輯器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導航。感謝您幫助我和其他人學習如何更高效地進行調試!

+0

編輯顯示'my_other_function'。我在初次寫作時將它從問題中刪除了,因爲我知道io.open的錯誤,但是我的問題最終是關於如何調試,而嵌入的調用是讓我對它片刻不透明的原因。 –

+2

關於您的IPython版本... Canopy GUI的IPython shell使用IPython 2.4.1,它與Package Manager中安裝到User venv中的IPython分開。 Package Manager安裝的IPython可以在Canopy Terminal/Command Prompt中進行訪問。 「ipython4」包是在Canopy GUI之外使用'import IPython'導入的,並且是「ipython」包的依賴。這個方案是爲了維護需要ipython

回答

3

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內建函數完全相同:

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

謝謝,那是錯誤,你的解釋是爲什麼在回溯中沒有顯示打開的代碼是有道理的。我運行的是Python 2.7,而'open'是'',而'io.open'是''。 'encoding'關鍵字會產生一個'open'錯誤,但'io.open'不會產生錯誤。 –

+0

我仍然想知道爲什麼對'io.open'的調用沒有放在堆棧上(我想因爲調用從來沒有生成過,因爲參數與C函數中聲明的類型不匹配?並且想知道IPython版本號,並想知道是否有調試技術可以讓我更容易發現問題出在'io.open'而不是'my_other_function'上(也就是一種知道該函數返回的內容的方法,代碼行? –

相關問題