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

2024-06-16 13:49:24 发布

您现在位置:Python中文网/ 问答频道 /正文

看起来很奇怪。一个名为的变量被打印出来,但在尝试执行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()时:

^{pr2}$

但是:

(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

但是,点c(continue)中pdb的命令c(continue)不会生成异常。在


Tags: importselfnoneifismydefnot
1条回答
网友
1楼 · 发布于 2024-06-16 13:49:24

pdb是一个eval循环。eval循环实质上是一行一行地将您写的内容输入到提示中,eval(...)就是它。das中定义的lamb闭包函数表示它不绑定变量。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表达式中使用它们。在

相关问题 更多 >