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导入命名空间-这应该是显而易见的。谢谢大家的耐心。请注意:导入*
是一种不好的做法。请注意:导入*
是一种不好的做法。