Python:httplib中的令人费解的行为

时间:2010-03-14 10:12:56

标签: python debugging httplib

我在httplib的HTTPConnection.putheader中添加了一行(import pdb; pdb.set_trace()),因此我可以看到内部发生了什么。

Python26\Lib\httplib.py,第489行:

def putheader(self, header, value):
    """Send a request header line to the server.

    For example: h.putheader('Accept', 'text/html')
    """
    import pdb; pdb.set_trace()
    if self.__state != _CS_REQ_STARTED:
        raise CannotSendHeader()

    str = '%s: %s' % (header, value)
    self._output(str)

然后从解释器

运行它
import urllib2
urllib2.urlopen('http://www.ioerror.us/ip/headers')

......正如预期的那样,PDB开始了:

> c:\python26\lib\httplib.py(858)putheader()
-> if self.__state != _CS_REQ_STARTED:
(Pdb)
在PDB中我可以随意评估表达式,所以我试图输入self.__state

(Pdb) self.__state
*** AttributeError: HTTPConnection instance has no attribute '__state'

唉,这个实例没有__state。但是,当我输入step时,调试器将超过

if self.__state != _CS_REQ_STARTED:

行没有问题。为什么会这样?如果self.__state不存在,python将不得不像我输入表达式时那样引发异常。

Python版本:win32上的2.6.4

2 个答案:

答案 0 :(得分:1)

回答我自己的问题:

http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_Python

__state是对象中的私有名称,它会被_HTTPConnection__state修改,因此当我想在PDB中访问它时,我必须将其命名为self._HTTPConnection__state。只有对象可以将其称为__state

答案 1 :(得分:0)

  

如果self .__状态不存在,python将不得不像我输入表达式时那样引发异常。

在Python中,您不必显式声明变量。 当你分配它们时,它们就会“诞生”。

像pylint这样的代码验证器会警告这些情况。 在您的情况下,您可以在self.__state = None

中使用HTTPConnection.__init__()

但这不是很重要。