Python - 替换由另一个库调用的套接字库中的函数,该函数由另一个库调用

时间:2017-08-22 17:36:52

标签: python python-3.x monkeypatching

我正在编写一个程序,需要重新定义socket.getaddrinfo()的工作方式。我使用第三方库,导入其他几个项目,最终导入httplib2,然后导入套接字。

从我所读过的内容来看,猴子补丁是覆盖这种方法的方法,但我显然没有做到这一点。

我试过这个我的函数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()

最终发生的是我收到错误"名称_socket未定义"。我有点迷失在这里。任何帮助都会很棒。感谢。

3 个答案:

答案 0 :(得分:1)

仔细查看socket的源代码,了解_socket的来源 - 您需要import _socket

答案 1 :(得分:1)

def my_getaddrinfo内,在使用_socket之前,您可以执行from socket import _socket,而且应该这样做。

答案 2 :(得分:0)

感谢您的帮助。我首先回答了这个问题。

我想我会发布工作代码。这是上面编辑的功能。

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