ola*_*ndo 4 python exception package
编辑:好的,我设法隔离了错误和完整的代码来重现它.但它似乎是设计的东西,或python中的错误.
创建两个邻近的包:admin&General,每个都有它自己的__init__.py,当然.在包admin中将文件'test.py'与以下代码放在一起:
from General.test02 import run
import RunStoppedException
try:
run()
except RunStoppedException.RunStoppedException,e:
print 'right'
except Exception,e:
print 'this is what i got: %s'%type(e)
Run Code Online (Sandbox Code Playgroud)
并admin使用以下代码放入文件'RunStoppedException.py':
class RunStoppedException(Exception):
def __init__(self):
Exception.__init__(self)
Run Code Online (Sandbox Code Playgroud)
在包General中将文件test02.py与代码放在一起:
import admin.RunStoppedException
def run():
raise admin.RunStoppedException.RunStoppedException()
Run Code Online (Sandbox Code Playgroud)
打印输出:
this is what i got: <class 'admin.RunStoppedException.RunStoppedException'>
Run Code Online (Sandbox Code Playgroud)
什么时候应该right.仅当一个文件与异常位于同一目录中时才会发生这种情况,因此它们以不同方式导入它.
这是设计,还是python的bug?
我正在使用python2.6,在eclipse + pydev下运行它
import admin.RunStoppedException
Run Code Online (Sandbox Code Playgroud)
这是一个含糊不清的相对导入.你的意思是RunStoppedException从admin顶级模块?或者从mypackage.admin你在包裹的时候?如果您当前的工作目录(添加到模块搜索路径中)恰好位于包内,它可能也是,这取决于Python是否知道它在包内,这取决于您运行脚本的方式.
如果你有两个import admin.RunStoppedException,并import RunStoppedException在不同的模块,那很可能会导入同一模块的两个副本:顶级RunStoppedException和子模块admin.RunStoppedException的封装admin,导致异常的两个实例,并在随后的不匹配except.
所以不要使用隐式相对导入.它们无论如何都会消失(见PEP328).始终拼出完整的模块名称,例如.import mypackage.admin.RunStoppedException.但是,请避免为模块名称和类名使用相同的标识符,因为这非常令人困惑.请注意,Python将允许您说:
except RunStoppedException:
Run Code Online (Sandbox Code Playgroud)
其中该标识符指的是模块而不是Exception的子类.这是出于历史原因,也可能会消失,但与此同时它可以隐藏错误.一种常见的模式是mypackage.exceptions用来举行许多例外.每个文件一个类是Java习惯,在Python中不受欢迎.
一般来说,尝试尽可能地保持模块内容(如类)的导入也是一个好主意.如果某些内容更改了RunStoppedException模块内部的副本,您现在将在不同的脚本中拥有不同的副本.虽然类大多数都没有改变,但模块级变量可能会在你的所有者模块之外取出东西时变得更加困难.
| 归档时间: |
|
| 查看次数: |
981 次 |
| 最近记录: |