Предотвращение исключений CannotSendRequest при повторном использовании объектов httplib.HTTPSConnection - PullRequest
1 голос
/ 26 июля 2010

Мой код выполняет несколько вызовов https с использованием httplib. Я хочу повторно использовать объект соединения httplib.py, но если я это сделаю, я иногда получаю CannotSendRequest исключения, потому что соединение заканчивается в странном состоянии, потому что какой-то другой бит кода разрывается в середине запроса. Поэтому мне нужен способ кэширования объекта подключения, чтобы, если он находится в допустимом состоянии, мы использовали его повторно, но повторно подключали, если он не был в допустимом состоянии. Я не вижу общедоступного метода на httplib.HTTPSConnection, чтобы сказать мне, находится ли соединение в действительном состоянии или нет. И мне нелегко поймать исключение CannotSendRequest, потому что это может произойти во многих местах кода. Так что я хотел бы сделать что-то вроде этого:

CONNECTION_CACHE = None

def get_connection():
    global CONNECTION_CACHE 

    if (not CONNECTION_CACHE) or (CONNECTION_CACHE.__state != httlib._CS_IDLE):
        CONNECTION_CACHE = httplib.HTTPSConnection(SERVER)

    return CONNECTION_CACHE

, но это не удается, потому что __state является частным. Есть какой-либо способ сделать это? Я мог бы пропатчить httplib для предоставления метода is_in_valid_state(), но я бы предпочел не исправлять базовые библиотеки python, если смогу.

Ответы [ 2 ]

0 голосов
/ 20 января 2014

(Прикосновение к личному атрибуту - плохая идея, рекомендуется на усмотрение зрителя.)

> Private name mangling: When an identifier that textually occurs in a
> class definition begins with two or more underscore characters and
> does not end in two or more underscores, it is considered a private
> name of that class. Private names are transformed to a longer form
> before code is generated for them. The transformation inserts the
> class name in front of the name, with leading underscores removed, and
> a single underscore inserted in front of the class name. For example,
> the identifier __spam occurring in a class named Ham will be
> transformed to _Ham__spam. This transformation is independent of the
> syntactical context in which the identifier is used. If the
> transformed name is extremely long (longer than 255 characters),
> implementation defined truncation may happen. If the class name
> consists only of underscores, no transformation is done.

Таким образом, conn._HTTPSConnection__state - это ответ

0 голосов
/ 18 декабря 2010

В Python нет такой вещи, как "частный" или "публичный".Ваш код не работает где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...