2017-04-21 7 views
2

Donc, voici une expression python:Que signifie l'expression "a = yield from f()"?

a = yield from f() 

Qu'est-ce que cela signifie? Où peut-il être utilisé? Quel genre d'objet devrait être f? Quelle sera la valeur de a après l'évaluation de l'expression?

Il y a plusieurs questions ici sur stackoverflow à propos de yield et yield from de python mais je n'ai pas trouvé de réponse à cela. Je comprends la signification de yield x, y = yield et y = yield x. Même yield from f() est plus ou moins compréhensible. Mais a = yield from f() est quelque chose d'inattendu pour moi.

MISE À JOUR:

B. Barbieri fourni la bonne réponse. Encore je dois le formuler un peu différemment.

Sémantique de l'expression a = yield from f() est très similaire à un appel de fonction: la valeur de a serait ce que f() renvoie. Mais si f() cède quoi que ce soit, la valeur obtenue sera transmise au "niveau supérieur" (vous ne pouvez écrire que a = yield from f() dans une fonction, et cela vous fera fonctionner un générateur). Si après cela le "niveau supérieur" renvoie une valeur à votre générateur, la valeur sera transmise à f() et le f() continuera.

Le yield from permet à f() et «niveau supérieur» de communiquer lorsque votre fonction est en cours d'exécution.

Je suppose maintenant que je comprends ce que c'est yield from et j'espère que cette explication serait utile pour les autres.

Répondre

2

Selon the documentation:

  • f devrait être un générateur (ce qui est sans surprise)
  • f doit retourner (et le rendement non seulement)
  • f doit accepter la valeur de send en utilisant some_var = yield
  • a recevra la valeur a renvoyé par f

Voici un exemple f:

def f(): 
    while 1: 
     x = yield 
     if next is None: 
      return "something" 
     do_something_with_recieved_value(x) 

Considérant un générateur g:

l = [] 
def g(): 
    while True: 
     a = yield from f() 
     l.append(a) 
  • chaque fois que f retours, la valeur retournée est mis en l
  • chaque valeur envoyer à g via send sera transmis à f

Note: vous devez démarrer votre générateur avant de pouvoir send quelque chose.

o = g() 
next(o) # Ensure the accumulator is ready to accept values 

Je n'ai pas tout testé, n'hésitez pas à commenter si quelque chose n'est pas clair.

2

est ici un exemple très simple (yield from ne peut être utilisé dans une fonction)

def f(): 
    for i in range(2): 
     yield i 
    return 3 

def g(): 
    a = yield from f() 
    print('a = {}'.format(a)) 

for item in g(): 
    print(item) 

# output: 
# 0 
# 1 
# a = 3 

a est attribuée la valeur de la fonction f()return s. le générateur g donne tous les résultats intermédiaires.

  • f doit être un générateur (quelque chose que yield s).
  • a sera simplement assinged la valeur de retour de f()