[英]Best practice for structuring module exceptions in Python3
假設我有一個文件夾結構像這樣的項目。
/project
__init__.py
main.py
/__helpers
__init__.py
helpers.py
...
模塊helpers.py
定義了一些異常並包含一些引發該異常的方法。
# /project/__helpers/helpers.py
class HelperException(Exception):
pass
def some_function_that_raises():
raise HelperException
另一方面,我的main.py
模塊定義了自己的異常並導入了可能從helpers.py
引發異常的helpers.py
。
# /projects/main.py
from project.__helpers.helpers import some_function_that_raises
class MainException(Exception):
pass
現在,如果用戶想要捕獲該異常,我不希望用戶必須執行from project.__helpers.helpers import HelperException
。 能夠從引發異常的公共模塊導入異常會更有意義。
但我不能只是將HelperException
移動到main.py
,這會創建一個循環導入。
允許用戶從main.py
導入所有異常,而那些在/__helpers
引發的異常的最佳方法是什么?
這是我想出的解決方案。
這個想法基本上是將所有異常放在一個可以從中導入它們的文件中,然后將它們全部導入main.py
。 為了讓一切都__all__
,我們最終定義了模塊的__all__
屬性。
這是新的文件結構
/project
__init__.py
main.py
/__helpers
__init__.py
exceptions.py
helpers.py
...
這是exceptions.py
文件。
# /project/__helpers/exceptions.py
class MainException(Exception):
pass
# Note that this also allows us to inherit between exceptions
class HelperException(MainException):
pass
然后我們可以從該文件中導入異常,而不會有循環依賴的風險。
最后,我們在main.py
定義了__all__
以明確要導入異常。
# /projects/main.py
from project.__helpers.helpers import some_function_that_raises
from project.__helpers.exceptions import MainException, HelperException
__all__ = ['MainException', 'HelperException', ...]
提醒一下, __all__
屬性定義了from project import *
。 因此,這既擴展了import star所需的行為,又明確了我們希望從該文件導入異常。
另請注意,某些 IDE 甚至'HelperException'
__all__
中的'HelperException'
視為對HelperException
的引用,並且不會因未使用的導入而打擾您。 這就是讓我認為這是正確方法的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.