11

メソッドを追加するには、リクエストの Response クラス (この質問の時点でバージョン 1.0.4) にモンキーパッチを適用する必要があります。

私はこのコードを持っています:

import requests

class Response(requests.models.Response):
    def hmm(self):
        return 'ok'

requests.models.Response = Response

r = requests.get('http://bbc.co.uk')

print r

元のレスポンスが super() を呼び出すと失敗します - https://github.com/kennethreitz/requests/blob/master/requests/models.py#L391

これは混乱するからだと思うのですが、クラスを入れ替えたので、何かばかげたことをしているような気がします。何かアイデアはありますか?前もって感謝します。

4

3 に答える 3

12

関数をクラスに直接追加する方がよいでしょう。

def hmm(self):
    return 'ok'
requests.models.Response.hmm = hmm

これは問題なく機能します。

>>> import requests
>>> def hmm(self):
...     return 'ok'
... 
>>> requests.models.Response.hmm = hmm
>>> r = requests.get('http://bbc.co.uk')
>>> print r
<Response [200]>
>>> r.hmm()
'ok'
>>> requests.__version__
'1.0.4'
于 2013-01-04T14:34:28.323 に答える
5

そのようなタイプにモンキーパッチを当てることはできないと思います。をインポートすると、これらrequestsすべてのモジュールが初期化されます。また、ライブラリ全体が何度も使用されるため、実際の型への正確な参照があります。その後、モデル モジュール内の応答タイプを置き換えるので、後続のインポートのみが影響を受けます。from xy import Request

すべてのモジュールを調べて、Response 参照を手動で新しいタイプに置き換えない限り、元のモジュールが引き続き使用され、パッチが役に立たなくなります。

代わりに、Martijn が提案したように、元の型を保持して直接展開する必要があります。

于 2013-01-04T14:37:21.283 に答える
1

を使用した簡単な修正setattrですが、少し醜いです(ただし、意味的には@Martijn answerと同等です):

def hmm(self):
    return 'OK - %s' % self.status_code

setattr(requests.models.Response, 'hmm', hmm)

r = requests.get('http://bbc.co.uk')
print r.hmm()
# prints 
# OK - 200
于 2013-01-04T14:40:25.023 に答える