Je vais vous présenter comment utiliser la destination de sortie (sortie de fichier, sortie de console) de la sortie standard Python (print et sys.stdout) tout en basculant de manière appropriée avec la syntaxe.
Vous pouvez modifier la destination de sortie de la sortie standard en fonction du traitement en procédant comme suit,
import sys
#Changer temporairement de sortie de fichier
sys.stdout = open('out.log', 'a+')
...
sys.stdout.write('fugahoge')
...
#Revenir à la sortie de la console
sys.stdout = sys.__stdout__
Lorsque le processus est terminé, je me demandais s'il y avait quelque chose car il serait gênant de le restaurer, et en me souvenant que l'utilisation de la syntaxe with rendait close () après le fichier open () inutile, cet article Je suis venu pour écrire.
--Comment changer la sortie standard --Description de avec la syntaxe --Comment changer la destination de sortie de la sortie standard avec avec la syntaxe
La syntaxe with est utilisée dans diverses situations telles que la lecture et l'écriture de fichiers tels que le suivant et gradient_tape de tensorflow.
with open('', 'r') as f:
f.read()
Référence: avec syntaxe (Python)
Ce qui se passe lorsque vous utilisez la syntaxe with, c'est que si vous spécifiez (ou générez) une instance après with, le processus s'exécutera comme suit.
Si vous exécutez le code suivant,
class Logger():
def setIO(self, *args, **kwargs):
#Générer TestIO instanse
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 ----')
La sortie est la suivante.
console
enter
---- in with syntax ----
exit
Vous pouvez maintenant voir que le traitement est effectué dans l'ordre de la méthode .__ enter__ () '' -> traitement dans la méthode with syntax->
.__ exit __ () ''.
référence:
Enfin, je présenterai un exemple de code de "commutation flexible de la destination de sortie de la sortie standard avec avec syntaxe" qui fait l'objet de cet article.
import sys
class SetIO():
"""Je suis avec la syntaxe/Classe de commutation 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():
"""Personnalisé I/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'):
#Passer à la sortie de fichier
print('---- in with syntax ----')
print('after with block')
Lorsque j'exécute le code ci-dessus, Ce qui suit est sorti sur la console.
console
before with block
after with block
Ensuite, ce qui suit est généré dans le fichier (out.log).
out.log
---- in with syntax ----
J'ai pu changer la destination de sortie standard avec la syntaxe par la méthode ci-dessus.
Vous pouvez modifier la destination de sortie en utilisant l'espace de noms du module d'enregistrement intégré, mais je trouve qu'il est peu pratique de modifier la destination de sortie en détail. (Il est possible que vous ne soyez tout simplement pas familier avec l'enregistreur) Par conséquent, je pense qu'il existe des situations où la méthode présentée dans cet article peut être utilisée. J'espère que cela vous sera utile!
Refs
Recommended Posts