假设我有一个文件夹结构如下的项目。
/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
引发异常的方法。
# /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
中引发异常的最佳方法?
1条答案
按热度按时间cuxqih211#
这是我想出的解决方案。
我们的想法是将所有异常放在一个文件中,然后将它们全部导入到
main.py
中。为了使其干净和明确,我们定义了模块的__all__
属性。下面是新的文件结构
字符串
下面是
exceptions.py
文件。型
然后,我们可以从该文件导入异常,而无需循环依赖。
最后,我们在
main.py
中定义__all__
,以明确导入异常。型
需要提醒的是,
__all__
定义了from project import *
语句要导入的内容。因此,这既扩展了import star所需的行为,又明确了我们希望从该文件导入异常。一些IDE甚至会将
'HelperException'
识别为__all__
中的HelperException
引用,而不会指示未使用的导入。这让我认为这是正确的方法。