列表解析范围错误从Python调试器 [英] List comprehension scope error from Python debugger

查看:132
本文介绍了列表解析范围错误从Python调试器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在调试我的代码时,我想使用列表解析。但是,当我进入一个函数时,似乎无法从调试器中评估列表的理解。



我使用的是Python 3.4。



脚本内容

  $ cat test.py 
#!/ usr / bin / python

def foo():
x = [1,2,3,3,4]

print(x)

foo()

交互调试: / p>

  $ python3 -mpdb test.py 
> /tmp/test.py(3)< module>()
- > def foo():
(Pdb)step
> /tmp/test.py(8)< module>()
- > foo()
(Pdb)
--Call--
> /tmp/test.py(3)foo()
- > def foo():
(Pdb)
> /tmp/test.py(4)foo()
- > x = [1,2,3,3,4]
(Pdb)
> /tmp/test.py(6)foo()
- > print(x)
(Pdb)p [x for _ in range(1)]
*** NameError:name'x'未定义
(Pdb)px
[1,2,3,3,4]

为什么 x 列表理解未知?我如何从调试器评估一个列表的理解,或者达到一个等同的行为?这是一个bug,还是调试器的一些基本限制?

解决方案

在Python 3中,必须使用您可以在pdb中的交互命令之前,由于实现推理的方式发生变化,您可以访问任何非全局变量。

 >>> def foo():[] [0] 
...
>>> foo()
追溯(最近的最后一次调用):
文件< stdin>,第1行,< module>
文件< stdin>,第1行,在foo
中IndexError:列表索引超出范围
>>> import pdb; pdb.pm()
> < stdin>(1)foo()
(Pdb)x = 4
(Pdb)[x在范围(2)中的_ $]
*** NameError:name'x'没有定义
(Pdb)交互
* interactive *
>>> [x for _ in range(2)]
[4,4]
>>>


In debugging my code, I want to use a list comprehension. However, it seems I cannot evaluate a list comprehension from the debugger when I'm inside a function.

I am using Python 3.4.

Script contents:

$ cat test.py 
#!/usr/bin/python

def foo():
    x = [1, 2, 3, 3, 4]

    print(x)

foo()

Interactive debugging:

$ python3 -mpdb test.py                                                                                                                                           
> /tmp/test.py(3)<module>()
-> def foo():
(Pdb) step
> /tmp/test.py(8)<module>()
-> foo()
(Pdb) 
--Call--
> /tmp/test.py(3)foo()
-> def foo():
(Pdb) 
> /tmp/test.py(4)foo()
-> x = [1, 2, 3, 3, 4]
(Pdb) 
> /tmp/test.py(6)foo()
-> print(x)
(Pdb) p [x for _ in range(1)]
*** NameError: name 'x' is not defined
(Pdb) p x
[1, 2, 3, 3, 4]

Why is x unknown to the list comprehension? How could I evaluate a list comprehension from the debugger, or achieve an equivalent behaviour? Is this a bug, or is it some sort of fundamental limitation to the debugger?

解决方案

In Python 3, you have to use the interact command in pdb before you can access any non-global variables due to a change in the way comprehensions are implemented.

>>> def foo(): [][0]
... 
>>> foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in foo
IndexError: list index out of range
>>> import pdb;pdb.pm()
> <stdin>(1)foo()
(Pdb) x = 4
(Pdb) [x for _ in range(2)]
*** NameError: name 'x' is not defined
(Pdb) interact
*interactive*
>>> [x for _ in range(2)]
[4, 4]
>>> 

这篇关于列表解析范围错误从Python调试器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆