"Quels sont les avantages d'utiliser le mot-clé def pour les générateurs et les fonctions?"
Bien qu'ils soient mécaniquement différents, dans la pratique, lorsque je les utilise, ils sont souvent les mêmes pour moi sur le plan conceptuel (je ne pense pas beaucoup à appeler range()
vs xrange()
).
En termes de compréhension rapide de la fonction, je suis d'accord pour dire que quelque chose est perdu avec l'utilisation de def
, mais les choses ne devraient pas être trop obscurcies au sein de la fonction pour commencer.
Même un implicite return None
peut brouiller le comportement prévu d'une fonction après un long peu de conditions (comme dans, était return None
prévu comme un comportement final ou un oubli dans la logique). Mais ce ne sont que mes croyances à ce sujet.
Je ne pense pas que mon argument soit particulièrement convaincant, je vais donc m'en remettre au PEP 255 :
Problème: introduisez un autre nouveau mot clé (par exemple, "gen" ou "générateur") à la place de "def", ou modifiez autrement la syntaxe, pour distinguer les fonctions génératrices des fonctions non génératrices.
Inconvénient: dans la pratique (comment vous en pensez), les générateurs sont des
fonctions, mais avec la torsion qu'ils peuvent être repris. La mécanique de leur configuration est un problème technique relativement mineur, et l'introduction d'un nouveau mot-clé surestimerait inutilement les mécanismes de démarrage des générateurs (une partie vitale mais minuscule de la vie d'un générateur).
Pro: En réalité (comment vous en pensez), les fonctions de générateur sont en fait des fonctions d'usine qui produisent des générateurs-itérateurs comme par magie. À cet égard, ils sont radicalement différents des fonctions non génératrices, agissant plus comme un constructeur que comme une fonction, donc réutiliser "def" est au mieux déroutant. Une déclaration de "rendement" enfouie dans le corps ne suffit pas à avertir que la sémantique est si différente.
BDFL: "def" ça reste. Aucun argument de chaque côté n'est totalement convaincant, j'ai donc consulté l'intuition de mon concepteur de langage. Cela me dit que la syntaxe proposée dans le PEP est exactement la bonne - ni trop chaude, ni trop froide. Mais, comme l'Oracle de Delphi dans la mythologie grecque, il ne me dit pas pourquoi, donc je n'ai pas de réfutation pour les arguments contre la syntaxe PEP. Le mieux que je puisse trouver (à part être d'accord avec les réfutations ... déjà faites) est "FUD". Si cela avait fait partie du langage dès le premier jour, je doute fort que cela aurait fait la page "Python Warts" d'Andrew Kuchling.