принудительное использование типов в параметрах функции _ssl.sslwrap - PullRequest
0 голосов
/ 08 августа 2010

Появляется функция _ssl.sslwrap, чтобы проверить, является ли переданный носитель подклассом _socket.socket.Я передаю класс, который реализует интерфейс _socket.socket.

Это злится, потому что мой сокет не подкласс.Это то, что я должен исправить со своей стороны, или это то, о чем я должен спросить парней из python-dev?

Вот код из ssl.SSLSocket. init мне жаль:

self._sslobj = _ssl.sslwrap(self._sock, server_side,
                                    keyfile, certfile,
                                    cert_reqs, ssl_version, ca_certs,
                                    ciphers)

В моем случае self._sock - это экземпляр моего класса сокетов.

ОБНОВЛЕНИЕ:

Я собираюсь разобратьсявитая делает некоторые из этих вещей.Моя фальшивая розетка становится слишком сложной.Однако мне все еще любопытно, почему модуль _ssl обеспечивает тип сокета таким, какой он есть.

1 Ответ

1 голос
/ 08 августа 2010

Я согласен, что явное применение иерархии типов кажется непифоническим и что вы можете спросить об этом разработчиков.

OTOH, мне интересно, связано ли это с _ssl и _socket, являющимися модулями реализации для ssl и сокета. Я не использовал ssl, и я едва использовал сокет, но действительно ли это обычно необходимо при их прямом использовании _ssl или _socket?

В любом случае, одним из обходных путей может быть прокси-объект, который:

(a) наследует от _socket.socket (и, следовательно, утверждает, что оно isinstance из _socket.socket), но

(b) передает все свои сообщения фактическому объекту, совместимому с «интерфейсом сокета».

Я не тестировал этот код, поэтому надеюсь, что это не заслуживающий внимания вклад:

def socketify( socket_protocol_compliant_object ):
    import _socket
    class proxy( _socket.socket ):
        def __init__( self ): pass
        def __getattribute__( self, attr_name ):
            return getattr( socket_protocol_compliant_object, attr_name )
        def __setattribute__( self, attr_name, new_value ):
            setattr( socket_protocol_compliant_object, attr_name, new_value )
    return proxy()

self._sslobj = _ssl.sslwrap( socketify(self._sock), server_side, keyfile, ... )

Что думают другие питонисты? Это хорошая идея?

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