Considérer ce qui suit:
def some_function():
return 1
def some_generator():
yield 1
Dans le code ci-dessus, some_function
est une fonction, tandis que some_generator
est un générateur. Ils ont l'air assez similaires.
Le problème que j'ai lorsque je lis du code est que je dois parcourir chaque ligne d'une "fonction" à la recherche du yield
mot - clé avant de pouvoir déterminer s'il s'agit en fait d'une fonction ou d'un générateur!
Il me semble simplement que l'utilisation d'un mot clé différent pour les générateurs aurait plus de sens, par exemple:
gen some_generator():
yield 1
Quels sont les avantages d'utiliser le def
mot - clé pour les générateurs et les fonctions? Pourquoi un nouveau mot-clé n'a-t-il pas été introduit pour séparer les fonctions et les générateurs?
design
programming-languages
python
Derek Kwok
la source
la source
gen
au lieu dedef
ne rendrait pas cette transformation beaucoup plus onéreuse.Réponses:
"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()
vsxrange()
).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, étaitreturn 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 :
la source
await
(etasync with
etasync for
) ajoutées dans PEP 492 , qui fonctionnent de manière très similaire àyield from
, nécessitent que la fonction dans laquelle elles sont utilisées soit déclarée en utilisantasync def
au lieu d'un justedef
.L'ajout de nouveaux mots clés risque de casser les programmes existants. Les concepteurs de langage essaient généralement d'éviter d'ajouter de nouveaux mots clés, en particulier pour les fonctionnalités de langue ajoutées après que la langue a déjà gagné en popularité. Chaque mot-clé qu'ils ajoutent est un identifiant que les programmes ne sont pas autorisés à utiliser à d'autres fins, donc l'ajout d'un mot-clé pourrait potentiellement casser les programmes existants. Les concepteurs de langage doivent peser les avantages d'un nouveau mot clé par rapport aux coûts.
Je doute que la définition d' un mot clé distinct pour les générateurs aurait beaucoup d'avantages. Comprendre si un symbole correspond au nom d'une fonction ou au nom d'un générateur est quelque chose qui compte pour les appelants, et les appelants ne devraient pas avoir (et parfois ne peuvent pas) regarder quel mot clé a été utilisé pour l'implémenter. C'est la responsabilité de mieux nommer les conventions et la documentation.
la source
Les générateurs sont des fonctions qui évaluent paresseusement. Étant donné qu'il s'agit de la même chose à la base, il est logique qu'ils utilisent le même mot clé. Une option pourrait être d'utiliser un commentaire pour identifier lequel est lequel pour une instance donnée:
la source
Je suppose que c'est parce qu'il est plus Pythonic mais que sais-je? ;)
Je ne pense pas vraiment que cela compte autant. C'est plus facile à retenir pour moi car pas besoin de les mémoriser tous les deux.
EDIT: Le PEP pourrait dire, vous pouvez enquêter là-bas.
la source