【发布时间】:2018-01-31 02:30:44
【问题描述】:
我正在编写一个需要重新定义 socket.getaddrinfo() 工作方式的程序。我使用了一个第三方库,它导入了其他几个项目,最终导入了 httplib2,然后导入了 socket。
根据我的阅读,猴子补丁是覆盖此方法的方法,但我显然做得不对。
我已经尝试过创建函数 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”。我有点迷失在这里。任何帮助都会很棒。谢谢。
【问题讨论】:
-
如果你想使用原始函数,你需要先保存它的引用,然后再将一些东西修补到它的位置。从您提供的 sn-p 中不清楚为什么您希望
_socket是对原始模块的一些神奇引用。 -
@NPE OP 只是复制了原始源代码,其中
_socket是一个用C 实现的内部模块,socket包装。 -
@AlexHall:你在哪里导入它?
标签: python python-3.x monkeypatching