6

我正在尝试向服务器发出 http 请求并检查我返回的内容。但是,当我尝试使用HTTPResponse objectwith 时ipdb,我不断得到*** Oldest frame并且我无法在我应该能够运行的对象上运行任何函数。这是用于获取的代码块和ipdb输出:

代码块:

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> 

这是什么*** Oldest frame意思,我怎样才能让这个对象变成更有用的东西,我可以在上面运行适当的功能?

4

1 回答 1

12

u是遍历栈帧的PDB命令。你已经在“最上面”的框架中了。help u会告诉你更多关于它的信息:

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

d(own)该命令与and密切相关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.

如果要打印变量u,请在其前面加上 a!以使其不被调试器解释为调试命令:

!u
!u.url

或使用print()

print(u)

help pdb输出:

调试器无法识别的命令被假定为 Python 语句,并在被调试程序的上下文中执行。Python 语句也可以以感叹号 ('!') 为前缀。

Oldest frame是您的程序开始的堆栈中的帧;它是最古老的;堆栈的Newest frame另一端是 Python 执行代码的地方,也是当前的执行帧,如果你点击c(ontinue)命令,Python 将继续执行。

一个带有递归函数的小演示:

>>> 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
于 2013-07-18T15:41:40.493 回答