Comprendre l'utilité de « envoyer » dans les générateurs Python
Bien que le concept de « rendement » dans les générateurs Python soit largement compris, le but de la fonction "envoyer" reste ambigu. Pour clarifier, la fonction « envoyer » permet la transmission de valeurs dans un générateur qui a récemment généré une valeur.
Considérons l'exemple simpliste suivant :
<code class="python">def double_inputs(): while True: x = yield yield x * 2</code>
Lors de la création d'une instance de générateur (gen), l'exécution de l'instruction next(gen) initialise le générateur et suspend l'exécution à la première occurrence de « rendement ». Par la suite, l’invocation de gen.send(10) injecte la valeur 10 dans la variable « rendement ». Le générateur renvoie ensuite la valeur 20, représentant le résultat de l'opération de multiplication.
Cette capacité à transmettre des valeurs aux générateurs à l'aide de "send" le distingue de "yield" qui fournit principalement des valeurs à partir d'un générateur.
Une application importante de "send" réside dans le décorateur "@defer.inlineCallbacks" de Twisted. Il permet l'exécution transparente de fonctions telles que :
<code class="python">@defer.inlineCallbacks def doStuff(): result = yield takesTwoSeconds() nextResult = yield takesTenSeconds(result * 10) defer.returnValue(nextResult / 10)</code>
Dans cet exemple, "takesTwoSeconds" renvoie initialement un objet "Deferred". Twisted attribue ce calcul à un thread d'arrière-plan et, une fois terminé, le résultat est injecté dans le générateur doStuff en attente via « envoyer ». Ce mécanisme simplifie la structure du code, permettant un flux plus linéaire et plus compréhensible lorsqu'il s'agit d'opérations asynchrones.
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!