异常 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
我有两个文件。一个是 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