2013-07-18 43 views
5

Bir sunucuya http istekleri oluşturmaya ve geri aldığım içeriği incelemeye çalışıyorum. Bununla birlikte, HTTPResponse object'u ipdb ile dolanmaya çalıştığımda, *** Oldest frame'u almaya devam ediyorum ve çalışabileceğim nesne üzerindeki işlevlerden herhangi birini çalıştıramıyorum. İşte getirilirken yaptığını kod bloğunu ve ipdb çıkışı:'*** En eski çerçeve' ipdb'de ne anlama geliyor?

kod bloğu:

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 çıkışı: *** Oldest frame ne anlama geliyor

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> 

ve Bu nesneyi, uygun işlevleri çalıştırabileceğim daha faydalı bir şeye nasıl dönüştürebilirim? Yığın çerçevelerini hareket ettirmek için PDB komutu

cevap

10

u. Zaten 'en üstteki' çerçevesindesiniz. help u bu konuda daha fazla söyleyecektir:

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

komut yakından d(own) ve w(here) ilişkilidir:

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. 

değişken u yazdırmak isterseniz, önek Hata ayıklayıcı tarafından bir hata ayıklama komutu olarak yorumlanmaması için ! ile:

!u 
!u.url 

veya kullanım print():

help pdb Çıktıdan
print(u) 

:

Komutları ayıklayıcı Python ifadeler olduğu varsayılır tanımıyor ve bağlamda yürütülmesini Programın hata ayıklaması var. Python ifadeleri de bir öntanlama noktası ('!') Ile öneklenebilir.

Oldest frame programınızın başladığı yığındaki çerçevedir; zamanın en eskiidir; yığının diğer ucu olan Newest frame, Python'un kod çalıştırdığı ve geçerli yürütme çerçevesi olduğu yerdir; burada c(ontinue) komutunu çalıştırırsanız Python devam edecektir.

bir özyinelemeli fonksiyonu ile küçük bir demo:

>>> 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

Teşekkür Sn Pieters, her zaman olduğu gibi bilgilendirici ve kapsamlı bir açıklama :) – Houdini