Переопределить 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
Другие вопросы по тегам