Python 异常类导入失败

Python 异常类导入失败,python,exception,python-import,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

我有两个文件。一个是
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'未定义
。当我将
program_utils.py
的内容直接粘贴到
program.py
中时,效果很好。为什么?

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

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

from program_utils import *
然而,有一些警告。e、 g.:如果您要导入一个包,
\uuu init\uuuuuuupy
中的
\uuuu all\uuuuuuuuuuuuuuuuu>变量控制从foo import*
导入哪些符号

一般来说,来自foo import*的
不是一个很好的实践。您不一定知道要导入什么符号。此外,如果使用多个模块覆盖某些符号的值,并且它们都定义了相同的符号,则可能会覆盖这些符号的值

可以说,如果在使用模块的符号时使用模块名称,则会更清楚地知道发生了什么。i、 e:

foo.bar()
vs

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

有一个(小的)性能考虑。如果你经常做
foo.bar()
,实际上你在做一个不必要的字典查找,因为每次解释器都会在
foo中查找
'bar'
。\uuuu dict\uuuu
。要解决此问题,您可以执行以下操作:

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

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

from program_utils import *
然而,有一些警告。e、 g.:如果您要导入一个包,
\uuu init\uuuuuuupy
中的
\uuuu all\uuuuuuuuuuuuuuuuu>变量控制从foo import*
导入哪些符号

一般来说,来自foo import*
不是一个很好的实践。您不一定知道要导入什么符号。此外,如果使用多个模块覆盖某些符号的值,并且它们都定义了相同的符号,则可能会覆盖这些符号的值

可以说,如果在使用模块的符号时使用模块名称,则会更清楚地知道发生了什么。i、 e:

foo.bar()
vs

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

有一个(小的)性能考虑。如果你经常做
foo.bar()
,实际上你在做一个不必要的字典查找,因为每次解释器都会在
foo中查找
'bar'
。\uuuu dict\uuuu
。要解决此问题,您可以执行以下操作:

from foo import bar

import program_utils
并不意味着“将
program_utils
的内容转储到我的命名空间中”。您仍然必须以
程序\u utils的形式访问内容。无论什么
。您没有将名称导入命名空间,因此需要对其进行范围限定
program\u utils.SomeException
或从program\u utils import SomeException导入命名空间-
这应该是显而易见的。谢谢大家的耐心。
import program_utils
并不意味着“将
program_utils
的内容转储到我的命名空间中”。您仍然必须以
程序\u utils的形式访问内容。无论什么
。您没有将名称导入命名空间,因此需要对其进行范围限定
program\u utils.SomeException
或从program\u utils import SomeException导入命名空间-
这应该是显而易见的。谢谢大家的耐心。请注意:导入
*
是一种不好的做法。请注意:导入
*
是一种不好的做法。