V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
ActualAvocado
V2EX  ›  Python

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

  •  1
     
  •   ActualAvocado · 162 天前 · 1954 次点击
    这是一个创建于 162 天前的主题,其中的信息可能已经有所发展或是发生改变。

    源码 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 状态)

    第 1 条附言  ·  162 天前

    编辑下: 我说的意想不到指的是我在 return futures.Future(loop=self) 这一步 step into 后,我预计会跳转 Future 对象的 init 方法过去,但是没有,跳转到了 get_debug 这个函数上了。后续也没有跳转到 Future 对象的 init 方法 而是直接返回到一开始设置断点的地方 fut = loop.create_future()

    7 条回复    2022-04-17 16:59:39 +08:00
    ActualAvocado
        1
    ActualAvocado  
    OP
       162 天前
    补充一下第一次跳到 getdebug 函数的时候的调用堆栈
    ActualAvocado
        2
    ActualAvocado  
    OP
       162 天前
    执行完 getdebug 后的调用堆栈
    u823tg
        3
    u823tg  
       162 天前
    这不是意想不到地方这是 asyncio 库里。 那几个调试按钮 or 快捷键,你 Google 下理解了就能看到一步步执行的流程
    ActualAvocado
        4
    ActualAvocado  
    OP
       162 天前
    @u823tg #3 我知道是 asyncio 库,我目的是看里面是怎么把 future 对象设置成 pending 状态。
    抱歉我这里没说清楚,我说的意想不到指的是我在
    return futures.Future(loop=self)
    这一步 step into 后,我预计会跳转 Future 对象的 init 方法过去,但是没有,跳转到了 get_debug 这个函数上了。后续也没有跳转到 Future 对象的 init 方法 而是直接返回到一开始设置断点的地方 fut = loop.create_future()
    u823tg
        5
    u823tg  
       162 天前
    额,你看看下 future 类就知道了啊。 这个你还调试
    u823tg
        6
    u823tg  
       162 天前
    再说真要调试也不是在这打断点。 你跟踪的应该是 决定 future 对象状态 的变量
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1162 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 20:12 · PVG 04:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.