Frage

Ich versuche, die eingebaute in file Klasse in Python zu Unterklasse einige zusätzliche Funktionen hinzufügen, um stdin und stdout. Hier ist der Code Ich habe so weit:

class TeeWithTimestamp(file):
    """
    Class used to tee the output of a stream (such as stdout or stderr) into
    another stream, and to add a timestamp to each message printed.
    """

    def __init__(self, file1, file2):
        """Initializes the TeeWithTimestamp"""
        self.file1 = file1
        self.file2 = file2
        self.at_start_of_line = True

    def write(self, text):
        """Writes text to both files, prefixed with a timestamp"""

        if len(text):
            # Add timestamp if at the start of a line; also add [STDERR]
            # for stderr
            if self.at_start_of_line:
                now = datetime.datetime.now()
                prefix = now.strftime('[%H:%M:%S] ')
                if self.file1 == sys.__stderr__:
                    prefix += '[STDERR] '
                text = prefix + text

            self.file1.write(text)
            self.file2.write(text)

            self.at_start_of_line = (text[-1] == '\n')

Der Zweck ist, einen Zeitstempel an den Anfang jeder Nachricht hinzuzufügen, und alles in eine Protokolldatei zu protokollieren. Allerdings ist das Problem, das ich in laufen, wenn ich dies tun:

# log_file has already been opened
sys.stdout = TeeWithTimestamp(sys.stdout, log_file)

Dann, wenn ich versuche print 'foo' zu tun, erhalte ich eine ValueError: I/O operation on closed file. Ich kann nicht sinnvoll file.__init__() in meinem __init__() nennen, da will ich nicht eine neue Datei öffnen, und ich kann self.closed = False entweder nicht zugewiesen werden, da es sich um eine Nur-Lese-Attribut ist.

Wie kann ich das ändern, so dass ich print 'foo' tun kann, und so, dass es alle Standard-file Attribute und Methoden unterstützt?

War es hilfreich?

Lösung

Der Aufruf file.__init__ ist durchaus möglich (zB auf ‚/ dev / null‘), aber keine wirkliche Verwendung, weil Ihr versucht, außer Kraft gesetzt write nicht „nehmen“ für die Zwecke der print Aussagen - letztere ruft intern die reale file.write wenn es sieht, dass sys.stdout eine tatsächliche Instanz von file ist (und Sie durch erben haben es geschafft, so).

print braucht nicht wirklich eine andere Methode außer write, so dass Ihre Klasse erbt von object statt file machen funktionieren.

Wenn Sie andere Datei Methoden benötigen (das heißt, print nicht alles Sie tun), sind Sie am besten beraten, sie selbst zu implementieren.

Andere Tipps

Sie können auch vermeiden super mit:

class SuperFile(file):

    def __init__(self, *args, **kwargs):
        file.__init__(self, *args, **kwargs)

Sie werden in der Lage, mit ihm zu schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top