我打开上初始化一个套接字连接类,并且可以发送和接收某些消息来回对手。我使用with
语句创建对象的一个实例。在我的课堂上,如果我在套接字上收到某些消息,我想明确关闭连接,并退出with
声明。呼叫`with`的__exit__明确和退出
我试图这样做,通过显式调用self.\__exit__(None, None, None)
def __exit__(self, type, value, traceback):
print 'Closing Connection'
self.logout()
self.conn.close()
sys.exit(1)
不过,我发现,我收到Closing Connection
消息发回的两倍,并运行到,因为在第二次调用问题,不再有一个关闭的连接。检查代码时,我排除了我明确致电self.__exit__(None, None, None)
的所有其他实例。这是怎么回事?是sys.exit(1)
不足以防止垃圾再次收集with
(虽然从我读过,这似乎是最“批准”的方式来做到这一点)?如何防止with
声明致电self.__exit__(None, None, None)
。任何帮助,或在正确的方向点,将不胜感激!
的'__exit__'方法当控制流离开'with'语句时总是被调用,不管这种情况如何。你不应该明确地调用它。如果你重构你的代码,这样会更好,所以你不需要这样做。 –
另外,在'__exit__'函数中有'sys.exit(1)'是不好的形式。 '__exit__'函数只能抑制异常或允许它们传递;他们不应该退出程序,因为它们只是用于清理或资源管理。它隐藏了程序逻辑并使你的代码难以阅读。使用'语句从'顶级'''''sys.exit(1)'运行'''''''''''''''''因此很明显你正在退出并显示一个错误值。 – eestrada
不要显式调用__exit()__',那么没有问题。你可以从上下文管理器内部返回,或者你可以结束:这应该如何调用__exit()__'。 – msw