2017-02-21 117 views
1

我試圖擴展requests.Response,但我不知道如何去做。我想要的是擴展requests.Response。我看到的問題是我必須創建一個全新的庫分支,或者至少創建一個自定義適配器併爲此實現自定義代碼。明智的方式來擴展requests.Response類?

我正在將響應存儲在我的新類的屬性中,但這意味着我的自定義APIResponse實際上並不像擴展的requests.Response對象那樣運行。

這是我目前的虛擬工作。

class APIResponse: 
    def __init__(self, req_response, formatted_json=None): 
     self._content = req_response._content 
     self._response = req_response 

    @property 
    def response(self): 
     return self._response 

如上所述,我想我的自定義類表現得像一個requests.Response對象,有一些額外的功能。由於Response對象是以非常低的級別生成的,即requests庫中的HTTPAdapter模塊,所以我必須編寫一個自定義適配器 - 並且在邏輯上還自定義requests.Sessions類,它將在其中調用。

這些都讓我相信我在這裏失去了一些東西。

是否有明智的方式來擴展request.Response對象,而沒有大量的代碼?

我自己也嘗試「包裝」圍繞一個實例Response對象的類,但它看起來非常哈克:

class APIResponse(Response): 
    __attrs__ = ['_content', 'status_code', 'headers', 'url', 'history', 
       'encoding', 'reason', 'cookies', 'elapsed', 'request', 
       '_formatted'] 

    def __init__(self, req_response): 
     self._content = req_response._content 
     self._content_consumed = req_response._content_consumed 
     self.status_code = req_response.status_code 
     self.headers = req_response.headers 
     self.url = req_response.url 
     self.history = req_response.history 
     self.encoding = req_response.encoding 
     self.reason = req_response.reason 
     self.cookies = req_response.cookies 
     self.elapsed = req_response.elapsed 
     self.request = req_response.request 

回答

1

看到你的「哈克」時,它的優勢在於工作什麼首先浮現在腦海。

但是,您可能會忘記您想要使用的方法所需的某些屬性:爲什麼不簡單地遍歷__dict__屬性來創建包裝?

這它的外觀:

class APIResponse(Response): 
    def __init__(self, req_response): 
     for k, v in req_response.__dict__.items(): 
      self.__dict__[k] = v 

這使得代碼更緊湊,但我不得不承認,它仍然是非常哈克。

+0

更清潔,更優雅。也做我沒有麻煩的需要。乾杯! – nlsdfnbch