Python 使用自定义异常而无需导入它们

Python 使用自定义异常而无需导入它们,python,python-3.x,exception-handling,Python,Python 3.x,Exception Handling,我已经为我的一个项目定义了一些自定义异常。在使用标准Python异常(例如ZeroDivisionError)而无需导入任何东西的方式上,有什么方法可以设置我的项目,使我的自定义异常暴露于我的包中的所有文件?Python将所有内置异常类型放入模块中。因此,无论您在何处计算ZeroDivisionError,都可以找到它。1 您的异常不在内置的中,而是在您在其中定义它们的任何模块中。因此,必须以mymodule.MyError的形式访问它们,或者从mymodule import MyError以类

我已经为我的一个项目定义了一些自定义异常。在使用标准Python异常(例如ZeroDivisionError)而无需导入任何东西的方式上,有什么方法可以设置我的项目,使我的自定义异常暴露于我的包中的所有文件?

Python将所有内置异常类型放入模块中。因此,无论您在何处计算
ZeroDivisionError
,都可以找到它。1

您的异常不在内置的
中,而是在您在其中定义它们的任何模块中。因此,必须以
mymodule.MyError
的形式访问它们,或者从mymodule import MyError
以类似
的方式导入它们

此外,正如N.Chauhan在中指出的,您很少需要超过几个公共异常类型,通常只有一个。您可能有30种不同的内部错误类型,但您的用户可能只关心1或2种不同类型的错误,因此您可以将30种类型设置为1或2个基类的所有子类,并且您的用户只需导入这些子类即可


你能做同样的把戏吗?是的,这其实很容易,但几乎总是个坏主意

这听起来似乎对于REPL的交互式编程很方便,但在那里并不需要。只需将新内容添加到当前(
\uuuuuu main\uuuuu
)模块中,就可以像在
内置模块中一样访问它,对吗?Python为此提供了语法糖。事实上,这正是mymodule import MyError的
所做的:它将
MyError
添加到当前模块的全局中

对于非交互式编程,将内容放入内置程序会使代码混乱且难以阅读

如果我在一些代码中看到
MyError
,并且在顶部看到mymodule import MyError
中的
,那么很明显它来自哪里。如果我不知道,那么除了彻底搜索整个代码库和导入到任何地方的所有站点包模块之外,就无法找出MyError的来源

对于IDE和其他帮助您编写和导航代码的工具来说,这更加困难。如果我将鼠标悬停在PyCharm中的
MyError
上,并且顶部有一个来自mymodule import MyError的
,PyCharm会立即知道它来自何处,并且可以显示一个漂亮的工具提示,其中包含任何有用的信息。我可以右键单击它,它可以跳转到
MyError
的定义。如果启用静态类型检查,它知道什么是
MyError
,并且可以验证它是
Exception
的子类。等等但是如果没有
import
,PyCharm就不可能知道
MyError
的意思


一,。当您评估
ZeroDivisionError
时,其工作方式的过于简化版本是,如果它不是本地变量或自由变量,Python将在全局变量中查找它,如果它不存在,则在内置变量中查找。(有关更深入的解释,请参阅文档,有关完整详细信息,请参阅。)


二,。你是怎么做到的?您可以将不同的
内置
模块替换为恰好包含额外内容的全局模块,但真正简单的方法是导入内置
并向其中添加新内容,如
builtins.MyError=MyError

ZeroDivisionError
,都可以找到它。1

您的异常不在内置的
中,而是在您在其中定义它们的任何模块中。因此,必须以
mymodule.MyError
的形式访问它们,或者从mymodule import MyError
以类似
的方式导入它们

此外,正如N.Chauhan在中指出的,您很少需要超过几个公共异常类型,通常只有一个。您可能有30种不同的内部错误类型,但您的用户可能只关心1或2种不同类型的错误,因此您可以将30种类型设置为1或2个基类的所有子类,并且您的用户只需导入这些子类即可


你能做同样的把戏吗?是的,这其实很容易,但几乎总是个坏主意

这听起来似乎对于REPL的交互式编程很方便,但在那里并不需要。只需将新内容添加到当前(
\uuuuuu main\uuuuu
)模块中,就可以像在
内置模块中一样访问它,对吗?Python为此提供了语法糖。事实上,这正是mymodule import MyError的
所做的:它将
MyError
添加到当前模块的全局中

对于非交互式编程,将内容放入内置程序会使代码混乱且难以阅读

如果我在一些代码中看到
MyError
,并且在顶部看到mymodule import MyError
中的
,那么很明显它来自哪里。如果我不知道,那么除了彻底搜索整个代码库和导入到任何地方的所有站点包模块之外,就无法找出MyError的来源

对于IDE和其他帮助您编写和导航代码的工具来说,这更加困难。如果我将鼠标悬停在PyCharm中的
MyError
上,并且顶部有一个来自mymodule import MyError的
,PyCharm会立即知道它来自何处,并且可以显示一个漂亮的工具提示,其中包含任何有用的信息。我可以右键单击它,它可以跳转到
MyError
的定义。如果启用静态类型检查,它知道什么是
MyError
,并且可以验证它是
Exception
的子类。等等但是如果没有
import
,PyCharm就不可能知道
MyError
的意思


一,。当您评估
ZeroDivisionError
时,其工作方式的过于简化版本是