2013-07-18 6 views
5

Sto cercando di fare richieste http su un server ed esaminare il contenuto che torno. Tuttavia, quando provo a sondare lo HTTPResponse object con ipdb, continuo a ricevere *** Oldest frame e non riesco a eseguire nessuna delle funzioni sull'oggetto che dovrei essere in grado di eseguire. Ecco il blocco di codice facendo per il recupero e la ipdb uscita:Cosa significa "*** Frame più vecchio" in ipdb?

blocco di codice: uscita

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:

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> 

Che cosa significa la *** Oldest frame media, e come posso ottenere questo oggetto in qualcosa di più utile su cui posso eseguire le funzioni appropriate?

risposta

10

u è il comando PDB per attraversare i frame dello stack. Sei già nella cornice 'più in alto'. help u vi dirà di più su di esso:

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

Il comando è strettamente legato al d(own) e 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. 

Se si desidera stampare la variabile u, prefix con un ! per non averlo interpretato dal debugger come un comando di debug:

!u 
!u.url 

oppure utilizzare print():

print(u) 

Dal help pdb uscita:

comandi che il debugger non riconosce si presume siano Python dichiarazioni e vengono eseguite nel contesto del programma è debug. Le istruzioni Python possono anche essere precedute da un punto esclamativo ('!').

Oldest frame è il frame nello stack in cui è stato avviato il programma; è il più vecchio nel tempo; lo Newest frame, l'altra estremità dello stack, è dove Python sta eseguendo il codice ed è il frame corrente di esecuzione, dove Python continuerà se si preme il comando c(ontinue).

Un po 'di demo con una funzione ricorsiva:

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

Grazie signor Pieters, spiegazione informativo e approfondita come sempre :) – Houdini