Site original : Sam & Max: Python, Django, Git et du cul
Devoir utiliser print()
au lieu de print
m’arrache la gueule, je dois l’avouer. J’ai l’impression que ces deux parenthèses ma prennent 5 heures à taper, là où avant mon petit espace était à portée de pouce.
Mais évidement, la décision de faire de print
une fonction est parfaitement rationnelle, et en voici tous les avantages…
print
n’est plus une déclaration, mais une expressionIl y a deux types d’instructions en Python : les déclarations (‘statement’ dans la langue de Chuck Norris) et les expressions.
Les déclarations sont des instructions indépendantes : while
, var = 'valeur'
, try
, def
, etc. On ne peut pas les mettre dans une expression, seulement les imbriquer dans une autre déclaration.
Les expressions, elles, sont imbricables dans n’importe quoi, et elles retournent toujours quelques chose quelque chose, fusse None
. Parmis les expressions on retrouve : les lambdas, les listes en intentions, les appels de fonctions, etc.
Avant, print
était une déclaration, ce qui était très peu souple. Maintenant, c’est un appel de fonction, et donc une expression.
On peut donc utiliser print
dans une autre expression et ainsi :
Dans une lambda :
crier = lambda x, *a, **k: print(x.upper(), *a, **k)
Dans une liste en intention :
[print(x) for x in range(10)]
Comment supprimer le saut de ligne quand on print avec l’ancienne syntaxe ?
print "Hello", # <- notez la virgule print "You" Hello You
Avec la nouvelle syntaxe :
print("Hello ", end='') print('You')
Comment rediriger le print vers stderr avec l’ancienne syntaxe ?
>>> print >> sys.stderr, 'arg !'
Avec la nouvelle ?
>>> print('arg !', file=sys.stderr)
Comment faire une liste séparée par des virgules avec l’ancienne syntaxe ?
>>> l = ['Des petits trous', 'des petits trous', 'toujours des petits trous'] >>> print ', '.join(l) Des petits trous, des petits trous, toujours des petits trous
Avec la nouvelle ?
>>> print(*l, sep=', ')
En gros, la syntaxe est unifiée, plus besoin de penser à tous ces cas particuliers. Et en plus on peut demander de l’aide avec help(print)
alors qu’avant ça faisait une syntaxe error.
Et donc la passer en paramètre pour faire de l’injection de dépendance :
def truc(a, print=print): # faire un truc avec a print(a); # on peut utiliser print normalement import logging log = loging.getLogger() truc(machin, print=log) # on print pas, on log ! truc(autre_machin, print=lambda *a, **k: None) # ignore les prints !
Et également appliquer tous les outils de programmation fonctionnelle de Python :
import sys from functools import partial error = partial(print, file=sys.stderr) error('Wrong !') # va directement sur stderr
print()
en Python 2.7Si vous voulez prendre toute de suite de bonnes habitudes, vous pouvez faire, en Python 2.7 :
from __future__ import print_function