gpt4 book ai didi

python - 使用 `with` 语句关闭连接

转载 作者:行者123 更新时间:2023-11-28 22:33:45 25 4
gpt4 key购买 nike

我想要一个表示 IMAP 连接的类,并将其与 with 语句一起使用,如下所示:

class IMAPConnection:
def __enter__(self):
connection = imaplib.IMAP4_SSL(IMAP_HOST)

try:
connection.login(MAIL_USERNAME, MAIL_PASS)
except imaplib.IMAP4.error:
log.error('Failed to log in')

return connection

def __exit__(self, type, value, traceback):
self.close()

with IMAPConnection() as c:
rv, data = c.list()
print(rv, data)

自然这会失败,因为 IMAPConnections 没有属性 close。当 with 语句完成时,如何存储连接并将其传递给 __exit__ 函数?

最佳答案

您需要在对象属性中存储连接。像这样:

class IMAPConnection:
def __enter__(self):
self.connection = imaplib.IMAP4_SSL(IMAP_HOST)

try:
self.connection.login(MAIL_USERNAME, MAIL_PASS)
except imaplib.IMAP4.error:
log.error('Failed to log in')

return self.connection

def __exit__(self, type, value, traceback):
self.connection.close()

您还想为您的类实现 list 方法。

编辑:我现在才意识到你的实际问题是什么。当您使用 with SomeClass(*args, **kwargs) as cc 不是 __enter__ 方法返回的值。 cSomeClass 的实例。这是您从 __enter__ 返回连接并假设 c 表示连接的问题的根源。

关于python - 使用 `with` 语句关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39639594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com