【问题标题】:Python - Replacing a function in the socket library, called by another library, which is called by another libraryPython - 替换套接字库中的函数,由另一个库调用,由另一个库调用
【发布时间】: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


【解决方案1】:

感谢您的帮助。我把功劳归功于首先回答的人。

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

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

【讨论】:

    【解决方案2】:

    在您的def my_getaddrinfo 中,在使用_socket 之前,您可以使用from socket import _socket,应该这样做。

    【讨论】:

    • 感谢您的回答!
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多