2013-08-02 14 views
0

我有一個實用程序模塊utils.py,它使用requests來執行某些任務。在客戶端代碼(使用utils)我需要處理由requests拋出的異常,但我想避免隱式導入requests(在客戶端,即)。我怎樣才能做到這一點?使用模塊中的異常而不明確導入

utils.py是(簡體)

import requests 

def download(url): 
    # stuff 
    return requests.get(url) 

,我想client.py是像

import utils # <-- no "import requests" 

try: 
     utils.download(whatever) 
except HTTPError: # <-- not "requests.exceptions.HTTPError" 
     do stuff 

except utils.something將工作太。這個名字不需要是全球性的。我只想避免在客戶端的任何地方提及requests

對於那些想知道的,這只是一個關注點分離的問題。 client.py不應該在乎utils.download的實現方式以及它使用的底層底層庫。

+0

無論您執行多少個'import requests'語句,Python只會實際導入一次。你可以通過將'print'請求導入到模塊範圍的請求模塊中來驗證它,它只會被打印一次 –

+0

所以,你的意思是導入所有utils.py而不導入utils.py(requests) ? – Jblasco

+0

@Jblasco:我不希望單詞「requests」發生在client.py的任何地方 – georg

回答

3

簡答:你不能(或至少,不應該)。

當然,沒有理由避免導入任何你想使用的東西。這就是Python的工作原理,打算工作,並且效果最好。

如果您確實想分開疑慮,請讓download()發現異常,並拋出新的utils.DownloadError異常。

def download(...): 
    try: 
     ... 
    except HTTPError as e: 
     raise DownloadError() from e 

編輯:

龍答:實際上,你可以做到這一點,通過鏈導入例外 - 但我會強烈建議反對 - 它只是使代碼不太清楚。

例如:如果您在utils.py中做from requests.exceptions import HTTPError,那麼您可以使用import utils並使用utils.HTTPError

然而,我相信這可能更脆弱 - 更不用說迂迴,更難追蹤代碼中的意圖了。我仍然強烈反對它。

從關注點分離的角度來看 - 它可能會阻止你提到requests,但它仍然依賴於例外,所以它所做的只是隱藏問題,而不是分離它。

+0

看起來我並不清楚自己想要什麼,查看更新 – georg

+0

@ thg435答案保持不變 –

+0

好了,謝謝;) – georg

0

您可以使用utils.requests.exceptions.HTTPError,但是您無法避免「提及」requests。你所能做的就是以迂迴,容易出錯的方式提及它。

1

我知道這是做這件事的破舊方式,但我會做兩件事情之一:

  • 處理內部utils.py異常或...
  • 注例外在utils.py中並重新引發一個HTTPError,以防requests.exceptions.HTTPError

你會對這兩者中的任何一個感到滿意嗎?

+0

「重新加註」是個問題 - 遠遠超過HTTPError – georg

+0

你打算爲每個人都做一個除外?因爲如果你打算逐個去除所有的例外情況,你會遇到同樣的問題,對吧?這是一個你會與他們打交道的問題,你會獨立處理多少人。 – Jblasco

相關問題