2

Twython モジュールは内部で requests モジュールを使用します。

リクエストのメソッドをラップ/装飾して、Twython モジュールに干渉することなく透過的に装飾/ラップされるようにrequests.post(*k, **kw)、すべての Twython が呼び出しを行います。request.post(...)

リクエストのコードベースを編集するのは簡単ですが、既に定義されている関数/メソッドにデコレータを追加するという一般的な問題を解決する方法に興味があります。

import requests
def magic_wrapper_doodad(...)
...
...
requests.post = magic_wrapper_doodad(my_function, requests.post) # plz?

import Twython

# thanks to the above magic, requests.post is wrapped just as if it was defined like:
@decorator
def trace(f, *args, **kw):
    print("calling %s with args %s, %s" % (f.__name__, args, kw))
    return f(*args, **kw)

...
... #inside requests.py now:
@trace
def post(self, *args, **kw):
...

magic_wrapper_doodad()このようにコードを装飾できるように、どのように書くか、または代替コードを作成しますか?

4

3 に答える 3

5

デコレーター@表記は、装飾された関数で呼び出し可能なデコレーターを呼び出し、装飾された関数を結果で置き換えるための単なる構文糖衣です。

つまり、次の 2 つの例はまったく同じものです。

@yourdecorator
def a_function():
    pass

def b_function():
    pass
b_function = yourdecorator(b_function)

同じことがクラス定義のメソッドにも当てはまります。

したがって、クラス メソッドをデコレータ callable の結果に置き換えるだけで、クラス メソッドを簡単にデコレートできます。

requests.post = my_function(requests.post)

これは、次のように記述した場合と同じです。

class requests(object):
    @my_function
    def post(self, *args):
        pass

requestsあなたの場合、実際にはクラスではなくモジュールですが、同じ原則が適用されることに注意してください。

于 2012-08-03T21:51:20.440 に答える
2

Martijn Pieters の答えは、リクエスト機能を装飾する必要がある場合の方法です。requests には実際にはhooks のメカニズムがあることに言及したいと思いました。

代わりにフックを使用して必要なことを行うことができる場合は、そうする必要があります。モンキーパッチよりきれいです。

于 2012-08-03T22:00:31.787 に答える
1

あなたが探しているものは、アスペクト指向プログラミングで実行できるかもしれません。

Stackoverflow からのこの投稿を確認して、役立つかどうかお知らせください。

プロダクション ソフトウェアで AOP (アスペクト指向プログラミング) を使用していますか?

于 2012-08-03T21:53:04.623 に答える