代码之家  ›  专栏  ›  技术社区  ›  bearplane

使用自定义异常而不需要导入它们

  •  0
  • bearplane  · 技术社区  · 6 年前

    import 不管怎样,有没有什么方法可以将我的项目设置为将我的自定义异常暴露给我的一个包中的所有文件?

    1 回复  |  直到 6 年前
        1
  •  2
  •   abarnert    6 年前

    Python将所有内置异常类型放入 builtins 模块。所以,不管你在哪里评估 ZeroDivisionError ,可以找到。 1

    内置 mymodule.MyError ,或者用类似 from mymodule import MyError .

    另外,正如N.Chauhan在 a comment ,您很少需要超过几个公共异常类型,而只需要一个。您可能有30种不同的错误类型 内部 ,但您的用户可能只关心1或2种不同类型的错误,因此您可以使您的30个类型都是1或2个基类的子类,而您的用户只需要 import 那些。


    2

    __main__ )模块,它就像在 ,对吧?Python为此提供了语法糖。事实上,这正是 从mymodule导入MyError 是的:它补充道 MyError 到当前模块的全局变量中。

    如果我看到 我的错误 在某些代码中 我的错误 来自除了通过彻底搜索整个代码库和所有网站包模块导入任何地方。

    对于IDE和其他帮助您编写和导航代码的工具来说,这就更加困难了。如果我停留在 我的错误 从mymodule导入MyError 在顶部,PyCharm立即知道它来自何处,并且可以用任何有用的信息显示一个漂亮的工具提示。我可以右击它,它可以跳转到 我的错误 . 如果启用静态类型检查,它就知道 我的错误 Exception 进口 ,PyCharm不可能知道 手段。


    1当你评估 零分割错误 ,它的工作方式过于简单化的版本是,如果它不是局部变量或自由变量,Python会在globals中查找它,如果它不在globals中,则会在内置变量中查找它。(有关更深入的解释,请参阅 eval and exec Resolution of names .)

    2你是怎么做到的?你呢 可以 替换另一个 内置 模块化为全局,恰好包含您的额外内容,但真正简单的方法是 import builtins builtins.MyError = MyError .