使用自定义异常而不需要导入它们
Using Custom Exceptions Without Needing to Import Them
我已经为我的一个项目定义了一些自定义异常。人们可以使用标准 Python 异常(例如 ZeroDivisionError)而不需要 import
任何东西,有什么方法可以设置我的项目以将我的自定义异常暴露给所有文件在我的一个包裹里?
Python 将所有内置异常类型放入 builtins
模块。所以,不管你在哪里求ZeroDivisionError
,都可以找到1
您的异常不在 builtins
中,它们在您定义它们的任何模块中。因此,它们必须作为 mymodule.MyError
访问,或者使用 [=14] 之类的东西导入=].
此外,正如 N. Chauhan 在 中指出的那样,您很少需要超过少数 public 异常类型——通常只需要一种。您可能有 30 种不同的错误类型内部,但您的用户可能只关心 1 种或 2 种不同的错误,因此您可以将 30 种类型都设为子类 1 或 2 个基础 类,您的用户只需 import
个。
你能做同样的把戏吗?是的,这实际上很容易2——但它几乎总是一个坏主意。
听起来这对于 REPL 的交互式编程来说很方便——但那里并不需要。只需将新内容添加到当前 (__main__
) 模块中,它就像在 builtins
中一样易于访问,对吗? Python 提供了这样做的语法糖。事实上,这正是 from mymodule import MyError
所做的:它将 MyError
添加到当前模块的全局变量中。
对于非交互式编程,将内容放入内置函数会使您的代码混乱且难以阅读。
如果我在某些代码中看到 MyError
,并且在顶部看到 from mymodule import MyError
,那么它的来源就很明显了。如果我不这样做,那么就没有办法找出 MyError
的来源,除非详尽地搜索整个代码库和在任何地方导入的所有站点包模块。
对于 IDE 和其他帮助您编写和导航代码的工具来说,这就更难了。如果我将鼠标悬停在 PyCharm 中的 MyError
上,并且顶部有一个 from mymodule import MyError
,PyCharm 会立即知道它来自哪里,并且可以显示一个漂亮的工具提示,其中包含任何有用的信息.我可以右击它,它可以跳转到MyError
的定义。如果我启用静态类型检查,它就会知道 MyError
是什么,并且可以验证它是 Exception
的子类。等等。但是如果没有那个 import
,PyCharm 就不可能知道 MyError
是什么意思。
1.当您评估 ZeroDivisionError
时,其工作方式的过于简化版本是,如果它不是局部变量或自由变量,Python 会在全局变量中查找它,如果不存在,则在内置变量中查找。 (更深入的解释,参见eval
and exec
docs, and for full details, see Resolution of names。)
2。你怎么做呢?您 可以 将不同的 builtins
模块替换为恰好包含您的额外内容的全局变量,但真正简单的方法是 import builtins
并将新内容添加到它,比如 builtins.MyError = MyError
.
我已经为我的一个项目定义了一些自定义异常。人们可以使用标准 Python 异常(例如 ZeroDivisionError)而不需要 import
任何东西,有什么方法可以设置我的项目以将我的自定义异常暴露给所有文件在我的一个包裹里?
Python 将所有内置异常类型放入 builtins
模块。所以,不管你在哪里求ZeroDivisionError
,都可以找到1
您的异常不在 builtins
中,它们在您定义它们的任何模块中。因此,它们必须作为 mymodule.MyError
访问,或者使用 [=14] 之类的东西导入=].
此外,正如 N. Chauhan 在 import
个。
你能做同样的把戏吗?是的,这实际上很容易2——但它几乎总是一个坏主意。
听起来这对于 REPL 的交互式编程来说很方便——但那里并不需要。只需将新内容添加到当前 (__main__
) 模块中,它就像在 builtins
中一样易于访问,对吗? Python 提供了这样做的语法糖。事实上,这正是 from mymodule import MyError
所做的:它将 MyError
添加到当前模块的全局变量中。
对于非交互式编程,将内容放入内置函数会使您的代码混乱且难以阅读。
如果我在某些代码中看到 MyError
,并且在顶部看到 from mymodule import MyError
,那么它的来源就很明显了。如果我不这样做,那么就没有办法找出 MyError
的来源,除非详尽地搜索整个代码库和在任何地方导入的所有站点包模块。
对于 IDE 和其他帮助您编写和导航代码的工具来说,这就更难了。如果我将鼠标悬停在 PyCharm 中的 MyError
上,并且顶部有一个 from mymodule import MyError
,PyCharm 会立即知道它来自哪里,并且可以显示一个漂亮的工具提示,其中包含任何有用的信息.我可以右击它,它可以跳转到MyError
的定义。如果我启用静态类型检查,它就会知道 MyError
是什么,并且可以验证它是 Exception
的子类。等等。但是如果没有那个 import
,PyCharm 就不可能知道 MyError
是什么意思。
1.当您评估 ZeroDivisionError
时,其工作方式的过于简化版本是,如果它不是局部变量或自由变量,Python 会在全局变量中查找它,如果不存在,则在内置变量中查找。 (更深入的解释,参见eval
and exec
docs, and for full details, see Resolution of names。)
2。你怎么做呢?您 可以 将不同的 builtins
模块替换为恰好包含您的额外内容的全局变量,但真正简单的方法是 import builtins
并将新内容添加到它,比如 builtins.MyError = MyError
.