首页 / PYTHON / python循环导入和定义异常类
python循环导入和定义异常类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python循环导入和定义异常类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1718字,纯文字阅读大概需要3分钟。
内容图文
我知道python通过在sys.modules中创建引用来处理循环导入的方式.但请看这两个模块以及定义异常类的问题:
a.py
import b
class Err(Exception):
pass
if __name__ == '__main__':
try:
b.f()
except Err:
pass
b.py
from a import Err
def f():
raise Err()
似乎我们应该抓住Err,但这不正确.运行a.py的输出是:
$python a.py
Traceback (most recent call last):
File "a.py", line 8, in <module>
b.f()
File "b.py", line 4, in f
raise Err()
a.Err
好的,现在让我们在代码中添加一些日志以使其更清晰:
a.py:
print 'A1'
import b
print 'A2'
class Err(Exception):
pass
print 'A3', 'id(Err)=%x' % id(Err)
if __name__ == '__main__':
try:
b.f()
except Err:
pass
b.py
print 'B1'
from a import Err
print 'B2', 'id(Err)=%x' % id(Err)
def f():
raise Err()
输出是:
$py a.py
A1
B1
A1
A2
A3 id(Err)=23fa750
B2 id(Err)=23fa750
A2
A3 id(Err)=23f9740
Traceback (most recent call last):
File "a.py", line 12, in <module>
b.f()
File "b.py", line 7, in f
raise Err()
a.Err
正如您所看到的,python定义了Err两次,并且Err在0x23fa750和0x23f9740处有两个不同的类对象.如果使用isinstance函数和a.Err类测试b.Err的实例,则会得到False.因此,捕获异常的唯一方法是使用b.Err而不是Err.但这不是我们一见钟情,也不是我们想要的.
我知道的解决方案是创建一个新模块c.py并在其中定义Err类.然后a.py和b.py都应该从c.py导入Err.它解决了这个问题.
但有没有一种解决方案可以让我们在a.py中定义Err?请注意,问题不仅仅是异常类,任何python类都可能根据我们在代码中使用其对象的方式落入此坑中.
解决方法:
当你在模块的末尾添加if __name__ ==’__ main__’:然后引用前面代码中定义的内容时,它与导入和使用模块的内容不同(__ main__模块没有在sys.modules中缓存,因为一件事).您可以通过以下修改使第一个示例正常工作:
a.py
import b
class Err(Exception):
pass
if __name__ == '__main__':
from a import Err # add this
try:
b.f()
except Err:
pass
输出:
... nothing, which is correct
内容总结
以上是互联网集市为您收集整理的python循环导入和定义异常类全部内容,希望文章能够帮你解决python循环导入和定义异常类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。