异常类无法导入

时间:2016-09-30 21:57:18

标签: python exception python-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时,它可以正常工作。为什么呢?

1 个答案:

答案 0 :(得分:2)

#include / C中的C++不同,在python中,import语句不等同于将文件复制/粘贴到文件中。

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

from program_utils import *

然而,有一些警告。例如:如果您要导入一个包,__all__中的__init__.py变量会控制导出哪些符号from foo import *

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

可以说,如果在使用其符号时使用模块名称,会发生什么变化。即:

foo.bar()

VS

from foo import *
...
from spam import *

bar()

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

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

from foo import bar