为什么 Python 用 vscode debug, step into 会跳转到意想之外的地方?

2022-04-17 15:21:03 +08:00
 ActualAvocado

源码 python 协程 Futures 样例

import asyncio
async def set_after(fut, delay, value):
    # Sleep for *delay* seconds.
    await asyncio.sleep(delay)

    # Set *value* as a result of *fut* Future.
    print(fut._state)
    fut.set_result(value)
    print(fut._state)

async def main():
    # Get the current event loop.
    loop = asyncio.get_running_loop()

    # Create a new Future object.
    # 我在这里设置了断点 想看看 future 对象的状态什么时候 哪个代码把他置成 pending 了
    fut = loop.create_future()

    print(fut._state)
    # Run "set_after()" coroutine in a parallel Task.
    # We are using the low-level "loop.create_task()" API here because
    # we already have a reference to the event loop at hand.
    # Otherwise we could have just used "asyncio.create_task()".
    loop.create_task(
        set_after(fut, 1, '... world'))

    print(fut._state)
    print('hello ...')

    # Wait until *fut* has a result (1 second) and print it.
    print(await fut)

asyncio.run(main())

断点如上面源码注释那样。 我已经实现把 vscode launch.json justMyCode 设置成 false 了。 即便如此,我在一步步 step into 的时候。

# 从上面一步步 step into 下去遇到在 base_events.py 成员函数
# 这个成员函数没有用装饰器
def create_future(self):
    """Create a Future object attached to the loop."""
    return futures.Future(loop=self)
# 跳转到同一个文件下的
def get_debug(self):
    return self._debug

# 再次 step into 跳转回来
def create_future(self):
    """Create a Future object attached to the loop."""
    return futures.Future(loop=self)

# 再次 step into 回到最开始的断点处 
fut = loop.create_future()

我是在 windows ,下面用 vscode 调试的,python3.9

之前也遇到类似的情况,step into 会跳转一个我完全不理解的地方,看不出来是谁调用的。。 请教一下 这个原因是什么呢?还有我怎么样才能看到真正的一步步执行的流程。(我现在还是不知道 future 什么时候被设置了 pending 状态)

2436 次点击
所在节点    Python
7 条回复
ActualAvocado
2022-04-17 15:24:29 +08:00
补充一下第一次跳到 getdebug 函数的时候的调用堆栈
ActualAvocado
2022-04-17 15:26:36 +08:00
执行完 getdebug 后的调用堆栈
u823tg
2022-04-17 16:08:44 +08:00
这不是意想不到地方这是 asyncio 库里。 那几个调试按钮 or 快捷键,你 Google 下理解了就能看到一步步执行的流程
ActualAvocado
2022-04-17 16:16:04 +08:00
@u823tg #3 我知道是 asyncio 库,我目的是看里面是怎么把 future 对象设置成 pending 状态。
抱歉我这里没说清楚,我说的意想不到指的是我在
return futures.Future(loop=self)
这一步 step into 后,我预计会跳转 Future 对象的 init 方法过去,但是没有,跳转到了 get_debug 这个函数上了。后续也没有跳转到 Future 对象的 init 方法 而是直接返回到一开始设置断点的地方 fut = loop.create_future()
u823tg
2022-04-17 16:53:15 +08:00
额,你看看下 future 类就知道了啊。 这个你还调试
u823tg
2022-04-17 16:55:14 +08:00
再说真要调试也不是在这打断点。 你跟踪的应该是 决定 future 对象状态 的变量
u823tg
2022-04-17 16:59:39 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX