2013-07-18 38 views
5

Tôi đang cố gắng thực hiện các yêu cầu http đến một máy chủ và kiểm tra nội dung tôi nhận được. Tuy nhiên, khi tôi thử poking xung quanh HTTPResponse object với ipdb, tôi tiếp tục nhận được *** Oldest frame và tôi không thể chạy bất kỳ chức năng nào trên đối tượng mà tôi có thể chạy. Đây là khối mã làm gì để lấy, và ipdb đầu ra:'Khung hình cũ nhất' có nghĩa là gì trong ipdb?

khối mã:

for acc in sp_lost: 
    url = 'http://www.uniprot.org/uniprot/?query=mnemonic%3a'+acc+'+active%3ayes&format=tab&columns=entry%20name' 
    u = urllib.request.urlopen(url) 
    ipdb.set_trace() 

IPdb đầu ra:

ipdb> url 
'http://www.uniprot.org/uniprot/?query=mnemonic%3aSPATL_MOUSE+active%3ayes&format=tab&columns=entry%20name' 
ipdb> u 
*** Oldest frame 
ipdb> str(u) 
'<http.client.HTTPResponse object at 0xe58e2d0>' 
ipdb> type(u) 
<class 'http.client.HTTPResponse'> 
ipdb> u.url      
*** Oldest frame 
ipdb> u.url()   # <-- unable to run url() on object...? 
*** Oldest frame 
ipdb> 

*** Oldest frame trung bình, và làm thế nào tôi có thể nhận được đối tượng này vào một cái gì đó hữu ích hơn mà tôi có thể chạy các chức năng thích hợp trên?

Trả lời

10

u là lệnh PDB để di chuyển các khung ngăn xếp. Bạn đang ở trong khung 'trên cùng'. help u sẽ cho bạn biết thêm về nó:

u(p) 
Move the current frame one level up in the stack trace 
(to an older frame). 

Lệnh liên quan chặt chẽ đến d(own)w(here):

d(own) 
Move the current frame one level down in the stack trace 
(to a newer frame). 
w(here) 
Print a stack trace, with the most recent frame at the bottom. 
An arrow indicates the "current frame", which determines the 
context of most commands. 'bt' is an alias for this command. 

Nếu bạn muốn in biến u, tiền tố nó với một ! để nó không được trình gỡ lỗi giải thích như một lệnh gỡ lỗi:

!u 
!u.url 

hoặc sử dụng print():

print(u) 

Từ help pdb đầu ra:

Commands rằng debugger không nhận được giả định là Python báo cáo và được thực hiện trong bối cảnh của chương trình đang được sửa lỗi . Các câu lệnh Python cũng có thể được đặt trước bằng dấu chấm than ('!').

Oldest frame là khung trong ngăn xếp nơi chương trình của bạn bắt đầu; nó là lâu đời nhất trong thời gian; Newest frame, đầu kia của ngăn xếp, là nơi Python đang thực thi mã và là khung thực thi hiện tại, nơi Python sẽ tiếp tục nếu bạn nhấn lệnh c(ontinue).

Một bản demo nhỏ với một hàm đệ quy:

>>> def foo(): 
...  foo() 
... 
>>> import pdb 
>>> pdb.run('foo()') 
> <string>(1)<module>() 
(Pdb) s 
--Call-- 
> <stdin>(1)foo() 
(Pdb) s 
> <stdin>(2)foo() 
(Pdb) s 
--Call-- 
> <stdin>(1)foo() 
(Pdb) s 
> <stdin>(2)foo() 
(Pdb) s 
--Call-- 
> <stdin>(1)foo() 
(Pdb) w 
    /Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python2.7/bdb.py(400)run() 
-> exec cmd in globals, locals 
    <string>(1)<module>() 
    <stdin>(2)foo() 
    <stdin>(2)foo() 
> <stdin>(1)foo() 
(Pdb) u 
> <stdin>(2)foo() 
(Pdb) u 
> <stdin>(2)foo() 
(Pdb) u 
> <string>(1)<module>() 
(Pdb) u 
> /Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python2.7/bdb.py(400)run() 
-> exec cmd in globals, locals 
(Pdb) u 
*** Oldest frame 
+0

Cảm ơn ông Pieters, giải thích thông tin và kỹ lưỡng như mọi khi :) – Houdini