2017-08-22 12 views
1

socket.getaddrinfo()の動作を再定義する必要があるプログラムを作成しています。他のいくつかの項目をインポートする第三者のライブラリを使用し、最終的にhttplib2をインポートして、ソケットをインポートします。Python - 別のライブラリによって呼び出された、別のライブラリによって呼び出されたソケットライブラリの関数の置き換え

私が読んだところでは、この方法を無効にする方法はサルのパッチを当てる方法ですが、明らかに正しい方法ではありません。

私は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() 

「名前_ソケットが定義されていません」というエラーが表示されることがあります。私はここで一種迷っている。どんな助けも素晴らしいだろう。ありがとう。

+0

元の関数を使用したい場合は、参照先を保存してから、その場所に猿をパッチする必要があります。スニペットから、なぜ '_socket'が元のモジュールへの魔法の参照となるのかはっきりしません。 – NPE

+0

@NPE OPは元のソースコードをコピーしたばかりで、 '_socket'は' socket'がラップするCで実装された内部モジュールです。 –

+0

@AlexHall:どこにインポートしていますか? – NPE

答えて

1

def my_getaddrinfoの中には、_socketを使用する前にfrom socket import _socketとする必要があります。

+0

答えをありがとう! – Nross2781

1

socketのソースコードをより詳しく見ると、_socketはどこから来ますか - あなたはimport _socketが必要です。

+0

答えをありがとう! – Nross2781

0

ありがとうございました。私は最初に答える人に信用を与えました。

私は働くコードを掲示したいと思った。ここから上の編集された関数です。

関連する問題