簡體   English   中英

在 Python3 中構建模塊異常的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM