看起来很奇怪。一个名为类的变量被打印出来,但在尝试执行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 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)不会生成异常。在
pdb
是一个eval
循环。eval循环实质上是一行一行地将您写的内容输入到提示中,eval(...)
就是它。das中定义的lamb闭包函数表示它不绑定变量。eval
(这是一个函数)有它自己的作用域,不参与正在计算的闭包。在您可以从下面的示例代码中看到等效问题:
一个(不幸的)解决方法是预先定义任何lambda并在pdb表达式中使用它们。在
相关问题 更多 >
编程相关推荐