2017-06-12 10 views
1

私は、asyncioがリリースされる前に、ジェネレータベースのコルーチンを使用してきました。await awaitable_objectの値は何ですか?

今、私はPython 3.5で導入された新しいasync/awaitの機能を学ぼうとしています。これは私のテストプログラムの一つです。

class Await3: 
    def __init__(self, value): 
     self.value = value 
    def __await__(self): 
     return iter([self.value, self.value, self.value]) 

async def main_coroutine(): 
    x = await Await3('ABC') 
    print("x =", x) 

def dummy_scheduler(cobj): 
    snd = None 
    try: 
     while True: 
      aw = cobj.send(snd) 
      #snd = 42 
      print("got:", aw) 
    except StopIteration: 
     print("stop") 

dummy_scheduler(main_coroutine()) 

その出力は次のとおり

got: ABC 
got: ABC 
got: ABC 
x = None 
stop 

xの値がawait awaitable_object式の結果です。この値はなぜNoneで、私はそれを私が望む値に設定するのですか?

私が見つけたのは、await couroutine()という値は、コルーチンの戻り値によって決まることですが、それは私の場合ではありません。

コメントを外すsnd = 42は機能しません。エラーは、手動__await__メソッドを持つクラスを実装するつもりなら、あなたのクラスのインスタンスでawait式の戻り値は、最後にStopIteration例外を構築するために使用したものは何でも、引数になりますAttributeError: 'list_iterator' object has no attribute 'send'

答えて

1

です引数がない場合はNoneです。

StopIteration引数は、return iter(some_list)のように制御することはできません。独自のイテレータを記述する必要があります。私は発電機とreturnとしての価値、それを書くことを言うと思います:

class Await3: 
    def __init__(self, value): 
     self.value = value 
    def __await__(self): 
     yield self.value 
     yield self.value 
     yield self.value 
     return whatever 

反復を終了するStopIteration(whatever)がスローされますが、あなたは物事を簡単にやってみたかった場合、あなたはasync関数内に書かれているだろう最初の場所。

関連する問題