python - PDB:变量可以打印但未定义

标签 python python-2.7 pdb

看起来很奇怪。名称为 classes 的变量被打印,但在尝试执行 filter(...) 构造时未定义。

这是一个代码:

def start(self, tag, attrib):
    classes = attrib[self._CLASS_ATTR] if self._CLASS_ATTR in attrib else None

    if tag == self._TAG_P:
        p = self._doc.add_paragraph('')

        self._cur_p = p

        if classes is not None:
            alignments = [self._left_align, self._center_align, self._right_align]
            import pdb; pdb.set_trace()
            alignments = filter(lambda x: partial(x.is_in, classes), alignments)
            if len(alignments) > 0:
                p.alignment = alignments[0].get()

            assert len(alignments) < 2

Pdb 在中断时停止。当我尝试执行 filter() 时:

(Pdb) print filter(lambda x: partial(x.is_in, classes), alignments)
*** NameError: global name 'classes' is not defined

但是:

(Pdb) print classes
center title
(Pdb) classes
u'center title'

为什么filter(...)指令无法正常执行?

让我们用简短的代码重现它:

from functools import partial

def f():
    classes = 'my_classes'

    def my_bool(obj, _):
        return True

    if classes is not None:
        import pdb; pdb.set_trace() # point a
        alignments = filter(lambda x: my_bool(x, classes), ['1', '2', '3'])
        import pdb; pdb.set_trace() # point b
        pass

f()

...

(Pdb) filter(lambda x: my_bool(x, classes), ['1', '2', '3'])
*** NameError: global name 'my_bool' is not defined

但是,pdb 在 a 点的命令 c(继续)不会生成异常。

最佳答案

pdb 是一个 eval 循环。 eval 循环本质上是逐行获取您在提示符中写入的内容并对其进行 eval(...) 处理。这意味着它不会在定义的函数(lambda)中绑定(bind)闭包范围的变量。 eval(这是一个函数)有自己的作用域,并且不参与您正在评估的闭包。

您可以从此示例代码中看到等效问题:

def f():
    x = 1
    return eval('lambda: x')

>>> f()()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <lambda>
NameError: name 'x' is not defined

一个(不幸的)解决方法是预先定义任何 lambda 并在 pdb 表达式中使用它们。

关于python - PDB:变量可以打印但未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45312065/

相关文章:

python-2.7 - 置换矩阵的行和列

python - 了解 pdb.set_trace() 之后的 pdb 输出

Python 四位数计数器

python - 随机用户可以访问 mysql 数据库

python - 用对自身的引用替换类中的方法

python - 我可以在 AssertionError 上强制调试 python 吗?

python - pdb中如何切换进程

python - 如何在 PyGame 中使用 alpha channel 渲染透明文本?

Python:使用 Flask 模拟补丁错误

python - 如何在 PyTorch 中为预训练模型添加层?