繁体   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