Python - Replacing a function in the socket library, called by another library, 被另一个库调用
Python - Replacing a function in the socket library, called by another library, which is called by another library
我正在编写一个需要重新定义 socket.getaddrinfo() 工作方式的程序。我使用第三方库,它导入了其他几个项目,最终导入了 httplib2,然后导入了 socket。
根据我的阅读,monkey patching 是覆盖此方法的方法,但我显然没有做对。
我已经试过这个我制作的函数 my_getaddrinfo 。现在它只使用默认代码
def my_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
addrlist = []
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
af, socktype, proto, canonname, sa = res
addrlist.append((_intenum_converter(af, AddressFamily),_intenum_converter(socktype, SocketKind),proto, canonname, sa))
return addrlist
import socket
socket.getaddrinfo = my_getaddrinfo
#Third party library I'm trying to use
from Otherlibrary.test import testconnector
connector = testconnector(initvalue)
connector.do()
最终发生的是我收到错误 "name _socket not defined"。我有点迷路了。任何帮助都会很棒。谢谢
仔细查看 socket
的源代码,了解 _socket
的来源 - 您需要 import _socket
.
在您的 def my_getaddrinfo
中,在使用 _socket
之前,您可以执行 from socket import _socket
并且应该这样做。
感谢您的帮助。我相信第一个回答的人。
我想我会 post 工作代码。这是上面编辑的功能。
def my_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
addrlist = []
from socket import _socket
from socket import _intenum_converter
from socket import AddressFamily
from socket import SocketKind
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
af, socktype, proto, canonname, sa = res
addrlist.append((_intenum_converter(af, AddressFamily),_intenum_converter(socktype, SocketKind),proto, canonname, sa))
return addrlist
我正在编写一个需要重新定义 socket.getaddrinfo() 工作方式的程序。我使用第三方库,它导入了其他几个项目,最终导入了 httplib2,然后导入了 socket。
根据我的阅读,monkey patching 是覆盖此方法的方法,但我显然没有做对。
我已经试过这个我制作的函数 my_getaddrinfo 。现在它只使用默认代码
def my_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
addrlist = []
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
af, socktype, proto, canonname, sa = res
addrlist.append((_intenum_converter(af, AddressFamily),_intenum_converter(socktype, SocketKind),proto, canonname, sa))
return addrlist
import socket
socket.getaddrinfo = my_getaddrinfo
#Third party library I'm trying to use
from Otherlibrary.test import testconnector
connector = testconnector(initvalue)
connector.do()
最终发生的是我收到错误 "name _socket not defined"。我有点迷路了。任何帮助都会很棒。谢谢
仔细查看 socket
的源代码,了解 _socket
的来源 - 您需要 import _socket
.
在您的 def my_getaddrinfo
中,在使用 _socket
之前,您可以执行 from socket import _socket
并且应该这样做。
感谢您的帮助。我相信第一个回答的人。
我想我会 post 工作代码。这是上面编辑的功能。
def my_getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
addrlist = []
from socket import _socket
from socket import _intenum_converter
from socket import AddressFamily
from socket import SocketKind
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
af, socktype, proto, canonname, sa = res
addrlist.append((_intenum_converter(af, AddressFamily),_intenum_converter(socktype, SocketKind),proto, canonname, sa))
return addrlist