2016-12-24 10 views
3

私はPython 3.6's async comprehensionsをMacOS Sierra(10.12.2)で使用しようとしていますが、SyntaxErrorが届いています。ここで非同期補完の使い方は?

は、私が試したコードです:

print([ i async for i in range(10) ]) 
print([ i async for i in range(10) if i < 4 ]) 
[i async for i in range(10) if i % 2] 

私はasync loopsの構文エラーが発生します:

result = [] 
async for i in aiter(): 
if i % 2: 
    result.append(i) 

すべてのコードPEPからのコピー/ペーストです。

ターミナル出力:予想通り

>>> print([i for i in range(10)]) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> print([i async for i in range(10)])    
    File "<stdin>", line 1 
    print([i async for i in range(10)]) 
       ^
SyntaxError: invalid syntax 
>>> print([i async for i in range(10) if i < 4]) 
    File "<stdin>", line 1 
    print([i async for i in range(10) if i < 4]) 
       ^
SyntaxError: invalid syntax 
>>> 

答えて

6

これは動作します。問題は、これらの形式の理解は、の中にのみasync defの機能が許可されていることです。外部(つまり、REPLに入力された最上位レベル)では、定義されているようにSyntaxErrorが発生します。

これは、具体的には、PEPの特定部に記載されているfor asynchronous comprehensions

非同期内包のみasync def関数内部許可されています。 await in comprehensionsを使用するための同様

、:これはasync def関数本体でのみ有効です

async loopsとして

は、必要なインターフェースに準拠し、両方のオブジェクトを必要とする(__aiter__を定義する)とasync def関数の内部に配置されます。再び、これは、対応するPEPで指定されている:

async forから__aiter__方法せずに定期的に反復可能に渡すTypeErrorあります。 async def機能の外にasync forを使用するのはSyntaxErrorです。

+0

REPLから 'async def'関数を呼び出し、それが完了するのを待ちますか? – tbodt

+0

@tbodt 6ヶ月前に頼んだことは分かりますが、他の誰かが不思議なことに、REPLで 'asyncio.get_event_loop()。run_until_complete(some_async_function())'を使って同期的に関数を実行することができます。 –

関連する問題