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