J'ai un gestionnaire de contexte qui capture la sortie d'une chaîne pour un bloc de code indenté sous une instruction with
. Ce gestionnaire de contexte génère un objet résultat personnalisé qui, une fois l'exécution du bloc terminée, contiendra la sortie capturée.Comment faire une classe qui agit comme une chaîne?
from contextlib import contextmanager
@contextmanager
def capturing():
"Captures output within a 'with' block."
from cStringIO import StringIO
class result(object):
def __init__(self):
self._result = None
def __str__(self):
return self._result
try:
stringio = StringIO()
out, err, sys.stdout, sys.stderr = sys.stdout, sys.stderr, stringio, stringio
output = result()
yield output
finally:
output._result, sys.stdout, sys.stderr = stringio.getvalue(), out, err
stringio.close()
with capturing() as text:
print "foo bar baz",
print str(text) # prints "foo bar baz"
Je ne peux pas retourner une chaîne, bien sûr, parce que les chaînes sont immuables et donc celui que l'utilisateur revient de la déclaration with
ne peut être modifiée après leur bloc de court code. Cependant, il est quelque peu pénible d'avoir à convertir explicitement l'objet résultat en une chaîne après le fait avec str
(j'ai aussi joué avec le fait de rendre l'objet appelable comme un peu de sucre syntaxique).
Alors, est-il possible de faire en sorte que l'instance de résultat agisse comme une chaîne, en ce sens qu'elle renvoie une chaîne lorsqu'elle est nommée? J'ai essayé d'implémenter __get__
, mais cela semble fonctionner uniquement sur les attributs. Ou est ce que je veux faire n'est pas vraiment possible?
Qu'il y ait ou non une réponse à cette question, je sais que je préférerais que vous retourniez une classe qui a implémenté' __str__' Je ne sais pas à quel point c'est un frein que vous devez, à un moment donné, dire explicitement, "ici est là où je verrouille cela en tant que chaîne, pas d'autres changements" en appelant 'str()'. gain? –
Quel est le problème le 'stringIO'? –
@Mike: Principalement qu'un utilisateur veut la chaîne, pas un objet qui doit être converti en chaîne – kindall