【问题标题】:Convert generator object to list for debugging [duplicate]将生成器对象转换为列表以进行调试[重复]
【发布时间】:2014-07-30 14:40:07
【问题描述】:

当我使用 IPython 在 Python 中进行调试时,有时会遇到断点,我想检查当前是生成器的变量。我能想到的最简单的方法是将其转换为列表,但我不清楚在 ipdb 的一行中执行此操作的简单方法是什么,因为我对 Python 还很陌生。

【问题讨论】:

    标签: python generator ipdb


    【解决方案1】:

    只需在生成器上调用list

    lst = list(gen)
    lst
    

    请注意,这会影响生成器,它不会返回任何其他项目。

    您也不能在 IPython 中直接调用 list,因为它与列出代码行的命令冲突。

    在这个文件上测试过:

    def gen():
        yield 1
        yield 2
        yield 3
        yield 4
        yield 5
    import ipdb
    ipdb.set_trace()
    
    g1 = gen()
    
    text = "aha" + "bebe"
    
    mylst = range(10, 20)
    

    运行时:

    $ python code.py 
    > /home/javl/sandbox/so/debug/code.py(10)<module>()
          9 
    ---> 10 g1 = gen()
         11 
    
    ipdb> n
    > /home/javl/sandbox/so/debug/code.py(12)<module>()
         11 
    ---> 12 text = "aha" + "bebe"
         13 
    
    ipdb> lst = list(g1)
    ipdb> lst
    [1, 2, 3, 4, 5]
    ipdb> q
    Exiting Debugger.
    

    转义函数/变量/调试器名称冲突的通用方法

    调试器命令ppp 将在printprettyprint 后面出现任何表达式。

    所以你可以按如下方式使用它:

    $ python code.py 
    > /home/javl/sandbox/so/debug/code.py(10)<module>()
          9 
    ---> 10 g1 = gen()
         11 
    
    ipdb> n
    > /home/javl/sandbox/so/debug/code.py(12)<module>()
         11 
    ---> 12 text = "aha" + "bebe"
         13 
    
    ipdb> p list(g1)
    [1, 2, 3, 4, 5]
    ipdb> c
    

    还有一个 exec 命令,通过在您的表达式前面加上 ! 来调用,它强制调试器将您的表达式作为 Python 表达式。

    ipdb> !list(g1)
    []
    

    有关更多详细信息,请在调试器中查看 help phelp pphelp exec

    ipdb> help exec
    (!) statement
    Execute the (one-line) statement in the context of
    the current stack frame.
    The exclamation point can be omitted unless the first word
    of the statement resembles a debugger command.
    To assign to a global variable you must always prefix the
    command with a 'global' command, e.g.:
    (Pdb) global list_options; list_options = ['-l']
    

    【讨论】:

    • 嗨@Jan Vlcinsky,首先感谢您的回答,这种方法非常适用于小型简单我正在使用生成器中的100000000000000000之类的数据是否有其他方法可以将其转换为快速,因为这种方法可以花几天时间给我我需要的东西,再次感谢。
    • @WalidBousseta 如果你的生成器有这么多潜在项目,任何将其完全转换为列表的尝试都会消耗所有 RAM。
    • 同意 Jan 的观点。据我所知,生成器的实用性是提供一种非常方便的方式来访问数据,其方式是 a) 本质上是顺序的,b) 长度未定。如果可能的话,我会看看供应商是否可以提供批量传输选项/数据转储。但是,如果计算一个取决于以前的项目并且它是原始马力,请考虑使用编译语言。你可以通过这种方式获得 1000+x 的加速(例如,Swift 中的内部循环比 Python 中的矩阵乘法快 9000 倍)
    • 请记住,list(gen) 会耗尽生成器,之后将无法使用
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2017-12-01
    • 2018-10-24
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多