我打開上初始化一個套接字連接類,並且可以發送和接收某些消息來回對手。我使用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