0

httplib の HTTPConnection.putheader に1 行 ( 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 に答える