2016-09-14 7 views
4

Pythonデバッガはコルーチンにステップインしていませんか?以下の例では

import asyncio 
import ipdb 

class EchoServerProtocol: 
    def connection_made(self, transport): 
     self.transport = transport 

    def datagram_received(self, data, addr): 
     message = data.decode() 
     print('Received %r from %s' % (message, addr)) 
     print('Send %r to %s' % (message, addr)) 
     self.transport.sendto(data, addr) 

loop = asyncio.get_event_loop() 
ipdb.set_trace(context=21) 
print("Starting UDP server") 
# One protocol instance will be created to serve all client requests 
listen = loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999)) 
transport, protocol = loop.run_until_complete(listen) 

try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 

transport.close() 
loop.close() 

が、私はそれが内部でどのように動作するかを理解することが

loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999))

にステップしようとしています。 しかし、私がコルーチンを踏み出そうとすると、sの代わりにnが押されたかのようにデバッガがジャンプします。

> ../async_test.py(18)<module>() 
    17 # One protocol instance will be created to serve all client requests 
---> 18 listen = loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999)) 
    19 transport, protocol = loop.run_until_complete(listen) 

ipdb> s 
> ../async_test.py(19)<module>() 
    18 listen = loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999)) 
---> 19 transport, protocol = loop.run_until_complete(listen) 
    20 

ipdb> 

動作はPyCharm(2016 2.3 Community)IDEで発生します。

私はhereを終了し、コードをさらに進めることができます。

答えて

3

それはあなたの例では

listen = await loop.create_datagram_endpoint(EchoServerProtocol, 
              local_addr=('127.0.0.1', 9999)) 

のようなあなたのコルーチンのためawaitまたはyield fromを呼び出す場合listenはコルーチンを実行した結果が、コルーチンインスタンスそのものではありません動作します。 実際の実行は次の行で行われます:loop.run_until_complete()

関連する問題