Ich werde vorstellen, wie das Ausgabeziel (Dateiausgabe, Konsolenausgabe) der Python-Standardausgabe (print und sys.stdout) verwendet wird, während mit Syntax entsprechend umgeschaltet wird.
Sie können das Ausgabeziel der Standardausgabe entsprechend der Verarbeitung ändern, indem Sie folgende Schritte ausführen:
import sys
#Vorübergehend zur Dateiausgabe wechseln
sys.stdout = open('out.log', 'a+')
...
sys.stdout.write('fugahoge')
...
#Kehren Sie zur Konsolenausgabe zurück
sys.stdout = sys.__stdout__
Als der Prozess abgeschlossen war, fragte ich mich, ob es etwas gab, weil es schwierig wäre, es rückgängig zu machen, und erinnerte mich daran, dass die Verwendung der Syntax with close () nach dem Öffnen der Datei () in diesem Artikel nicht erforderlich war Ich bin gekommen, um zu schreiben.
Die with-Syntax wird in verschiedenen Situationen verwendet, z. B. beim Lesen und Schreiben von Dateien wie dem folgenden und gradient_tape von Tensorflow.
with open('', 'r') as f:
f.read()
Referenz: mit Syntax (Python)
Wenn Sie die with-Syntax verwenden, wird der Prozess wie folgt ausgeführt, wenn Sie nach with eine Instanz angeben (oder generieren).
.__ enter__ ()
`wird aufgerufen.__ exit__ ()
`wird aufgerufenWenn Sie den folgenden Code ausführen,
class Logger():
def setIO(self, *args, **kwargs):
#TestIO-Instanse generieren
return TestIO(*args, **kwargs)
class TestIO():
def __enter__(self):
print('enter')
def __exit__(self, *args):
print('exit')
logger = Logger()
with logger.setIO():
print('---- in with syntax ----')
Die Ausgabe ist wie folgt.
console
enter
---- in with syntax ----
exit
Jetzt können Sie sehen, dass die Verarbeitung in der Reihenfolge `` .__ enter__ ()
Methode-> Verarbeitung in der with-Syntax->
.__ exit__ ()
`Methode erfolgt.
Referenz:
Abschließend werde ich ein Codebeispiel für "Flexibles Umschalten des Ausgabeziels der Standardausgabe mit Syntax" vorstellen, das Gegenstand dieses Artikels ist.
import sys
class SetIO():
"""Ich bin mit Syntax/Klasse zum Schalten von O."""
def __init__(self, filename: str):
self.filename = filename
def __enter__(self):
sys.stdout = _STDLogger(out_file=self.filename)
def __exit__(self, *args):
sys.stdout = sys.__stdout__
class _STDLogger():
"""Brauch ich/O"""
def __init__(self, out_file='out.log'):
self.log = open(out_file, "a+")
def write(self, message):
self.log.write(message)
def flush(self):
# this flush method is needed for python 3 compatibility.
pass
print('before with block')
with SetIO('out.log'):
#Wechseln Sie zur Dateiausgabe
print('---- in with syntax ----')
print('after with block')
Wenn ich den obigen Code ausführe, Folgendes wird an die Konsole ausgegeben.
console
before with block
after with block
Anschließend wird Folgendes in die Datei (out.log) ausgegeben.
out.log
---- in with syntax ----
Ich konnte das Standardausgabeziel mit der oben beschriebenen Methode mit Syntax umschalten.
Sie können das Ausgabeziel mithilfe des integrierten Namespace des Logger-Moduls ändern, aber ich finde es unpraktisch, das Ausgabeziel im Detail zu ändern. (Es ist möglich, dass Sie mit Logger einfach nicht vertraut sind.) Daher denke ich, dass es Situationen gibt, in denen die in diesem Artikel vorgestellte Methode verwendet werden kann. Ich hoffe es wird hilfreich für Sie sein!
Refs
Recommended Posts