web-dev-qa-db-fra.com

Quel est l'avantage de la nouvelle fonction d'impression dans Python 3.x par rapport à Python 2 instruction d'impression?

J'ai entendu à plusieurs reprises qu'imprimer étant une fonction (3.x) est meilleur qu'être une instruction (2.x). Mais pourquoi?

J'étais fan que ce soit une déclaration principalement parce qu'elle me permettait de taper deux caractères de moins (c'est-à-dire les parenthèses).

Je serais intéressé de voir certaines situations où l'instruction print ne la coupe tout simplement pas et où une fonction est supérieure.

67
rectangletangle

Tout de réponse de Jochen et réponse de Sven , plus:

Vous pouvez utiliser print() dans des endroits où vous ne pouvez pas utiliser print, tels que:

[print(x) for x in range(10)]
42
Lennart Regebro

Raisonnement

L'instruction print est depuis longtemps apparue sur des listes de fonctionnalités de langage douteuses qui doivent être supprimées dans Python 3000, comme la présentation "Python Regrets" de Guido [1] . As tel, l'objectif de ce PEP n'est pas nouveau, bien qu'il puisse devenir très contesté parmi les développeurs Python.

Les arguments suivants pour une fonction print () sont distillés à partir d'un message python-3000 par Guido lui-même [2] :

  • print est la seule fonctionnalité de niveau application à laquelle une instruction lui est dédiée. Dans le monde de Python, la syntaxe est généralement utilisée en dernier recours, lorsque quelque chose ne peut pas être fait sans l'aide du compilateur. L'impression n'est pas admissible à une telle exception.
  • À un moment donné du développement d'applications, on ressent assez souvent le besoin de remplacer la sortie d'impression par quelque chose de plus sophistiqué, comme la journalisation des appels ou des appels dans une autre bibliothèque d'E/S. Avec une fonction print (), il s'agit d'un remplacement de chaîne simple, aujourd'hui c'est un gâchis d'ajouter toutes ces parenthèses et éventuellement de convertir la syntaxe du style de flux.
  • Avoir une syntaxe spéciale pour l'impression met une barrière beaucoup plus grande pour l'évolution, par exemple une nouvelle fonction printf () hypothétique n'est pas trop extraite lorsqu'elle coexiste avec une fonction print ().
  • Il n'y a pas de moyen facile de convertir des instructions d'impression en un autre appel si l'on a besoin d'un séparateur différent, pas d'espaces, ou pas du tout. De plus, il n'y a aucun moyen facile d'imprimer facilement des objets avec un autre séparateur qu'un espace.
  • Si print () est une fonction, il serait beaucoup plus facile de la remplacer dans un module (juste def print(*args):...) ou même dans un programme (par exemple en mettant une fonction différente dans __builtin__.print). En l'état, on peut le faire en écrivant une classe avec une méthode write () et en l'attribuant à sys.stdout - ce n'est pas mauvais, mais certainement un bond conceptuel beaucoup plus grand, et cela fonctionne à un niveau différent de celui de print.

- PEP 3105 - Faire de l'impression une fonction

53
Jochen Ritzel

Un avantage de print étant une fonction est la cohérence. Il n'y a aucune raison que ce soit une déclaration. Comparez ces deux lignes

2.x: print >> my_file, x
3.x: print(x, file=my_file)

La nouvelle version ressemble beaucoup plus à Python, n'est-ce pas?

Un autre avantage de la version de fonction est la flexibilité. Par exemple, si vous souhaitez intercepter tous les appels print à des fins de débogage, vous pouvez maintenant simplement redéfinir print:

def print(*args, **kwargs):
    # whatever
    __builtins__.print(*args, **kwargs)
33
Sven Marnach

J'ai réfléchi à cette question et je n'avais aucune idée des avantages de la version python 3. Mais quand j'ai eu besoin d'imprimer les colonnes de pandas.DataFrame (Sans Index([...])) , J'ai découvert que

print * df.columns

lève une exception, tandis que

print (* df.columns)

fonctionne bien! Et si vous souhaitez avoir les mêmes options d'impression (configurables) dans plusieurs impressions d'appel, vous pouvez les enregistrer dans le dictionnaire et les passer sous **print_options

Donc au moins *args, Les astuces **kw_args Sont une bonne raison pour que print soit une fonction!

18
Alleo

Vous pouvez remplacer le print intégré par un personnalisé:

import os
import sys

def print(s):
   sys.stderr.write('Will now print ' + str(s) + '.' + os.linesep)
   sys.stdout.write(str(s) + os.linesep)

print(['A', 'list'])
# Output: 
# stderr: Will now print ['A', 'list'].
# stdout: ['A', 'list']

Vous pouvez utiliser print dans un lambda ou un appel de fonction, etc.:

example_timeout_function(call=lambda: print('Hello world'), timeout=5)
do_things(print_function=print)
11
Artur Gaspar