_ssl.sslwrap函数似乎检查传入的sock是否是_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模块按照它的方式强制执行套接字类型。
答案 0 :(得分:1)
我同意明确强制执行类型层次结构似乎不是Pythonic,并且您可能想要询问开发人员。
OTOH,我想知道它是否与_ssl和_socket是ssl和socket的实现模块有关。我没有使用过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, ... )
其他Python主义者的想法是什么?这是个好主意吗?