Dans le domaine des générateurs Python, le mot-clé rendement constitue la pierre angulaire, permettant la création de séquences itérables. Cependant, à côté de rendement, une autre fonction énigmatique se cache dans l'ombre : send.
La documentation fournit une description énigmatique, indiquant que send "reprend l'exécution et "envoie" une valeur dans la fonction génératrice". Cela soulève des questions à la fois sur son objectif et sur sa relation avec le rendement.
La valeur est une entrée et une sortie ?
La première perplexité naît de l'idée que la valeur sert d'entrée à la fonction générateur. Cependant, la documentation suggère également que send renvoie la valeur suivante générée par le générateur. N'est-ce pas la même fonction remplie par rendement ?
Dévoiler le véritable objectif
La clé pour résoudre cette énigme réside dans la compréhension que l'envoi permet l'injection de valeurs tout en le générateur cède. Prenons l'exemple suivant :
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
Imaginez ce générateur comme une boîte noire avec deux trous : un pour recevoir des valeurs (yield) et un pour les renvoyer (yield). Si vous deviez appeler next(generator) pour démarrer le générateur, il s'arrêterait à la première instruction rendement, en attendant une entrée.
Maintenant, vous pouvez utiliser send pour introduire une valeur dans le générateur. La valeur est temporairement stockée dans la variable x. Lors de la reprise du générateur, le code au-delà de la première instruction Yield s'exécute, doublant efficacement la valeur d'entrée et la renvoyant via Yield.
Un exemple non rentable
Pour démontrer les capacités uniques d'envoi qui ne peuvent pas être obtenues avec rendement, considérez ce qui suit :
<code class="python">gen = double_inputs() next(gen) # run up to the first yield gen.send(10) # goes into 'x' variable</code>
Ce code injecte effectivement une valeur de 10 dans le générateur. Il reprend ensuite l'exécution et renvoie 20, la valeur doublée. Cette séquence d'actions est impossible à réaliser uniquement avec le rendement.
La magie de Twisted avec send
Une application pratique de l'envoi est illustrée par le décorateur @defer.inlineCallbacks de Twisted. Il vous permet d'écrire des fonctions qui génèrent des objets différés, qui représentent des valeurs futures. Le framework sous-jacent intercepte ces objets différés, exécutant les calculs nécessaires en arrière-plan.
Une fois le calcul terminé, le framework renvoie le résultat au générateur, simulant la reprise de l'exécution et permettant au générateur de procéder aux opérations suivantes. opérations.
Conclusion
La fonction d'envoi sur les générateurs Python vous permet d'injecter des valeurs dans les générateurs qui sont en pause lors des instructions de rendement. Cette capacité permet un flux de contrôle sophistiqué et peut simplifier la programmation asynchrone, comme le démontre le décorateur @defer.inlineCallbacks de Twisted. En comprenant l'objectif unique de send aux côtés de rendement, vous pouvez libérer tout le potentiel des générateurs dans votre code Python.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!