我有两个文件。一个是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
时,它可以正常工作。为什么呢?
答案 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