Python 3中构造模块异常的最佳实践

62lalag4  于 2023-11-20  发布在  Python
关注(0)|答案(1)|浏览(124)

假设我有一个文件夹结构如下的项目。

  1. /project
  2. __init__.py
  3. main.py
  4. /__helpers
  5. __init__.py
  6. helpers.py
  7. ...

字符串
模块helpers.py定义了一些异常,并包含了一些引发该异常的方法。

  1. # /project/__helpers/helpers.py
  2. class HelperException(Exception):
  3. pass
  4. def some_function_that_raises():
  5. raise HelperException


另一方面,我的main.py模块定义了自己的异常,并导入了可能从helpers.py引发异常的方法。

  1. # /projects/main.py
  2. from project.__helpers.helpers import some_function_that_raises
  3. class MainException(Exception):
  4. pass


现在,我不希望用户在捕获异常时必须执行from project.__helpers.helpers import HelperException操作,如果能够从引发异常的公共模块导入异常会更有意义。
但是我不能只将HelperException移动到main.py,这将创建一个循环导入。
什么是允许用户从main.py导入所有异常而在/__helpers中引发异常的最佳方法?

cuxqih21

cuxqih211#

这是我想出的解决方案。
我们的想法是将所有异常放在一个文件中,然后将它们全部导入到main.py中。为了使其干净和明确,我们定义了模块的__all__属性。
下面是新的文件结构

  1. /project
  2. __init__.py
  3. main.py
  4. /__helpers
  5. __init__.py
  6. exceptions.py
  7. helpers.py
  8. ...

字符串
下面是exceptions.py文件。

  1. # /project/__helpers/exceptions.py
  2. class MainException(Exception):
  3. pass
  4. # Note that this also allows us to inherit between exceptions
  5. class HelperException(MainException):
  6. pass


然后,我们可以从该文件导入异常,而无需循环依赖。
最后,我们在main.py中定义__all__,以明确导入异常。

  1. # /projects/main.py
  2. from project.__helpers.helpers import some_function_that_raises
  3. from project.__helpers.exceptions import MainException, HelperException
  4. __all__ = ['MainException', 'HelperException', ...]


需要提醒的是,__all__定义了from project import *语句要导入的内容。因此,这既扩展了import star所需的行为,又明确了我们希望从该文件导入异常。
一些IDE甚至会将'HelperException'识别为__all__中的HelperException引用,而不会指示未使用的导入。这让我认为这是正确的方法。

展开查看全部

相关问题