异常 Class 导入失败

Exception Class Failed to Import

我有两个文件。一个是 program_utils.py,内容为:

class SomeException(Exception):
    def __init__(self, *args, **kwargs):
        Exception.__init__(self, *args, **kwargs)

另一个,比方说,program.py

import program_utils

def SomeFunction(arg):
    if arg in set([ok_val1, ok_val2]):
        # do something
    else:
        raise SomeException('reason')

当我 运行 program.py 它抱怨:NameError: name 'MyException' is not defined。当我将 program_utils.py 的内容直接粘贴到 program.py 时,它工作正常。为什么?

C/C++ 中的 #include 不同,python 中的 import 语句不等同于 copy/pasting 将文件放入您的文件。

如果你想要这种行为,你可以通过以下方式获得它:

from program_utils import *

但是,有一些注意事项。例如:如果您正在导入一个包,__init__.py 中的 __all__ 变量控制在执行 from foo import *.

时导入哪些符号

一般来说,from foo import * 不是一个很好的做法。您不一定知道要导入什么符号。此外,如果您对多个模块执行此操作并且它们都定义相同的符号,则可能会覆盖某些符号的值。

可以说,如果在使用其符号时使用模块名称,那么发生的事情也会更加清楚。即:

foo.bar()

from foo import *
...
from spam import *

bar()

在第二种情况下,bar 来自 foo 模块可能并不明显。

有(小的)性能考虑。如果你最终做了很多 foo.bar(),你实际上是在进行不必要的字典查找,因为每次,解释器都会在 foo.__dict__ 中查找 'bar'。要解决这个问题,您可以这样做:

from foo import bar