0

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

4

2 回答 2

1

回答我自己的问题:

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

__state是对象内部的私有名称,它被破坏为_HTTPConnection__state,所以当我想在 PDB 中访问它时,我必须将其命名为self._HTTPConnection__state. 只有对象可以将其称为__state.

于 2010-03-14T12:14:03.197 回答
0

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

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

一些代码验证器(如 pylint)会警告这些情况。self.__state = None在你的情况下,你可以有类似的东西HTTPConnection.__init__()

但这不是很重要。

于 2010-03-14T10:54:58.503 回答