Переопределить open() в imaplib
Так как я узнал, что imaplib
не поддерживает тайм-аут, я пытался переопределить open()
функция. Но без успеха. Я не очень знаю, что я должен наследовать (imaplib
, или же imaplib.IMAP4
), потому что модуль также имеет код, который не включен в классы. Вот что я хочу иметь:
# Old
def open(self, host = '', port = IMAP4_PORT):
self.sock = socket.create_connection((host, port))
[...]
# New, what I want to have
def open(self, host = '', port = IMAP4_port, timeout = 5):
self.sock = socket.create_connection((host, port), timeout)
[...]
Я просто скопировал оригинальную библиотеку и изменил ее, что сработало, но я не думаю, что именно так все и должно быть.
Может кто-нибудь показать мне элегантный способ, как я могу решить эту проблему?
Заранее спасибо!
2 ответа
Хорошо, так что я думаю, что мне это удалось. Это была скорее попытка и ошибка, чем чистое знание, но это работает.
Вот что я сделал:
import imaplib
import socket
class IMAP4(imaplib.IMAP4):
""" Change imaplib to get a timeout """
def __init__(self, host, port, timeout):
# Override first. Open() gets called in Constructor
self.timeout = timeout
imaplib.IMAP4.__init__(self, host, port)
def open(self, host = '', port = imaplib.IMAP4_PORT):
"""Setup connection to remote server on "host:port"
(default: localhost:standard IMAP4 port).
This connection will be used by the routines:
read, readline, send, shutdown.
"""
self.host = host
self.port = port
# New Socket with timeout.
self.sock = socket.create_connection((host, port), self.timeout)
self.file = self.sock.makefile('rb')
def new_stuff():
host = "some-page.com"
port = 143
timeout = 10
try:
imapcon = IMAP4(host, port, timeout)
header = imapcon.welcome
except Exception as e: # Timeout or something else
header = "Something went wrong here: " + str(e)
return header
print new_stuff()
Может быть, это полезно для других
Хотя imaplib не поддерживает тайм-аут, вы можете установить тайм-аут по умолчанию для сокета, который будет использоваться, когда будет установлено любое соединение с сокетом.
socket.setdefaulttimeout(15)
например:
import socket
def new_stuff():
host = "some-page.com"
port = 143
timeout = 10
socket.setdefaulttimeout(timeout)
try:
imapcon = imaplib.IMAP4(host, port)
header = imapcon.welcome
except Exception as e: # Timeout or something else
header = "Something went wrong here: " + str(e)
return header