2016-10-04 3 views
3

私はPythonでAPIの 'Session class'リクエストを使っています。私はGETを&のrequest.Session()を使ったPOSTメソッド呼び出しにしています。Python:オブジェクトのメソッドのMonkeypatching

すべてのコール(GET/POST)エラーで、別のプロセスに通知する必要があります。

s = request.Session() 
def post(): 
    try: 
     s.post(URL,data,headers) 
    except: 
     notify_another_process() 

を直接代わりrequests.Session().postのこのメソッドを呼び出します。私は、次のようにユーティリティメソッドを作成することによってこれを行うことができます。

しかし、私はこのコードをrequests.Session().postにmonkeypatchし、requests.Session().postメソッド呼び出し自体に他のプロセスに通知する機能を追加したいと考えています。どうすればこれを達成できますか?

EDIT 1:

requests.Session()のpostメソッドのシグネチャは次のとおりです。

def post(self, url, data=None, json=None, **kwargs): 
    return self.request('POST', url, data=data, json=json, **kwargs) 

私は何とか、次のように私のカスタムポストを作成しようとした場合:

def post_new(self, url, data=None, json=None, **kwargs): 
    try: 
     s.post(url,data, json,kwargs) 
    except: 
     notify_another_process() 

次のパッチを実行してください。

requests.post = post_new 

selfではなくsession's objectの中にsession.postを使用しているため、これは実際には良い音読ではありません。

+0

可能な重複[1匹のサルは、Pythonでの関数にパッチを当てるんどのように?](http://stackoverflow.com/questions/2375403/how-does-one-monkey-patch-a-function-in- Python) –

+0

[投稿のメソッド署名があなたが投稿したものとは異なる](https://github.com/kennethreitz/requests/blob/master/requests/api.py#L99) –

+0

@ŁukaszRogalski私は[セッション後のセッション](https://github.com/kennethreitz/requests/blob/master/requests/sessions.py#L513)を使用しようとしています。 –

答えて

1

post_newするポスト機能を設定します。それは、Siddharth & laffercの両方で言及された答えに触発されています。これは両方の言及の上にあります。

>>> import requests 
>>> def post(self, url, data=None, json=None, **kwargs): 
...  try: 
...   raise Exception() 
...  except: 
...   print "notifying another process" 
... 
>>> setattr(requests.Session, 'post_old', requests.Session.post) 
>>> setattr(requests.Session, 'post', post) 
>>> s = requests.Session() 
>>> s.post("url") 
notifying another process 
2

これで解決します。あなたは基本的に古い関数を別の名前で保存し、あなたの関数をデフォルトのポストとして与えます。あなたはほとんどそこにいる、しかし、あなたは自己引数

def post_new(self, url, data=None, json=None, **kwargs): 
    try: 
     return self.request('POST', url, data=data, json=json, **kwargs) 
    except: 
     notify_another_process() 

を使用する必要があります

setattr(requests, 'old_post', requests.post) 

def post(url, data=None, json=None, **kwargs): 
    try: 
     requests.old_post(url, data, json, kwargs) 
    except: 
     notify_another_process() 

setattr(requests, 'post', post) 
+0

私は質問を更新しました。私はセッションについて言及しなかった。また、あなたの答えは要求の場合には正しいでしょうが、私は質問の明快さのために私のために働いた答えを掲示するつもりです、そして、それは将来の聴衆のための答えです。回答ありがとうございます。 :) –

2

は、これは私のために働いていた答えである

requests.post = post_new 
+0

私は質問を更新しました。私はセッションについて言及しなかった。また、あなたの答えは要求の場合には正しいでしょうが、私は質問の明快さのために私のために働いた答えを掲示するつもりです、そして、それは将来の聴衆のための答えです。 –

+0

お返事ありがとうございます。 :) –

関連する問題