2017-10-03 15 views
2

Est-ce idiomatique?Utilisation idiomatique de stdout comme alternative

with open(output_file, 'w') if output_file else sys.stdout as outf: 
    outf.write("hello") 

Est-ce que le problème des causes bloc with-stdout (en la fermant)?

+0

Pourquoi ne l'essayez-vous pas et découvrez si 'sys.stdout.closed'? Cela vous éviterait de taper quelque chose ici. –

+0

@MaximEgorushkin en effet, mais je suis occupé et pensé que peut-être quelqu'un était intéressé à obtenir les points pour résoudre ce problème. En outre, je pense que c'est une bonne question d'avoir une réponse en ligne. Temps de trading pour les points - qui ne me coûte rien :) – dangonfast

+1

Aaaand, j'aime aussi voir comment les gens résolvent les problèmes que je rencontre. – dangonfast

Répondre

4

Si vous essayez d'écrire à stdout après cela, il:

>>> import sys 
>>> output_file = None 
>>> with open(output_file, 'w') if output_file else sys.stdout as outf: 
...  outf.write("hello") 
... 
hello5 
>>> print("test") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: I/O operation on closed file. 

La seule façon de la dernière déclaration pourrait en quelque sorte être utilisé en toute sécurité serait comme dans un script où vous savez que stdout ne sera pas utilisé plus tard, par exemple:

if __name__ == '__main__': 
    output_file = ... # parse arguments 
    with open(output_file, 'w') if output_file else sys.stdout as outf: 
     outf.write("hello") 

Mais même cela se sent mal. Mieux: séparer l'ouverture et travailler avec le fichier, et être explicite à ce sujet:

if __name__ == '__main__': 
    output_file = ... # parse arguments 
    if output_file: 
     with open(output_file, 'w') as outf: 
      do_stuff(outf) 
    else: 
      do_stuff(sys.stdout) 
+0

Bien, mais appeler 'do_stuff' dans deux endroits différents juste parce que je passe un paramètre différent semble un peu étrange. Je récupérerais peut-être 'outf = open (output_file, 'w')' et à la fin ferment manuellement le descripteur de fichier: 'outf.close()' (sinon stdout). Un peu plus d'écriture, mais un seul appel à 'do_stuff' – dangonfast