7

モジュールのソースを調べていたところ、次のコードrequestsに気付きました。

class Response(object):
    """The :class:`Response <Response>` object, which contains a
    server's response to an HTTP request.
    """

    def __init__(self):
        super(Response, self).__init__()
        ... more init method...

私の理解でsuper()は、この呼び出しはまったく何もしないことを示唆しています。スーパークラスの呼び出しについてかなりの数の質問を見つけましたが、すべてそれ自体ではなく、他のクラスのサブクラスから機能します。python docsも、この構造について言及していません。object

これは単に間違いである可能性があり、git blameそのファイルをコミットしてその行を導入したResponse場合、作成時にが のサブクラスであったことがわかりますBaseResponse。この行は、クラスのリファクタリングからの単なるホールドオーバーですか、それともこの super() 呼び出しは何かを行いますか?

4

3 に答える 3

2

Corley Brigman のコメントで述べたように、不要ですが無害です。

背景として、このBaseResponseクラスは Requests 1.0 での Kenneth のスプリント中に追加されました。1.0 のコード変更により、一部の HTTP エンドポイント (または実際には非 HTTP エンドポイント) の特定の動作を定義できるトランスポート アダプターが導入されました。トランスポート アダプタ インターフェイスの重要な部分は、返された未加工の応答を受け取り、そこからRequestsオブジェクトを構築するメソッドです。HTTPAdapter.build_response()HTTPAdapter.send()Response

Kenneth が s の何らかの形式の抽象基本クラスを持つことに潜在的な有用性を見出したことは明らかですResponse。これにより、トランスポート アダプターResponseは、標準の HTTPResponseオブジェクトとは非常に異なる動作で s を返すことができます。このため、サブクラスのロジックの大部分を含む ABC へのリファクタリングは理にかなっているように見えました。

リファクタリングの後半で、これは不要な複雑さとして再び削除されました。Response現実には、特化したオブジェクトを定義したい人は、Response何もしない ABC を持つのではなく、単純に をサブクラス化できます。これにより、メインラインのユース ケース (バニラ リクエスト) がコード内でより明確になり、ほとんどユーティリティがなくなりません。

クラスが抜かれた際BaseRequestにこの行を見落としていましたが、問題ないので外す必要はありませんでした。

于 2013-10-10T08:16:50.123 に答える