变量在Python调试器中是否存在



谁能解释一下?(Python 2.7, Django 1.7)

foo = data['selected_items']
(Pdb) foo
(Pdb) *** NameError: name 'foo' is not defined
foo
(Pdb) u'1,2'
foo
(Pdb) *** NameError: name 'foo' is not defined
foo
(Pdb) u'1,2'
foo
(Pdb) *** NameError: name 'foo' is not defined
foo
(Pdb) u'1,2'

下面是触发它的视图函数:

def process_form(request, model_name):
    form = BulkEditForm(request.POST)
    if form.is_valid():
        data = form.clean()
        if data['select_all']:
            pass
        else:
            import pdb; pdb.set_trace()

请求。职位:

{'select_all': False, 'primary_tech': <Person: Bob>, 'primary_biz': <Person: Mary>, 'selected_items': u'1,2', 'backup_tech': None, 'backup_biz': None}

你有两个线程在同一个断点处停止。

所以基本上,有两个pdb实例,竞争您的提示符,也就是说,您的提示符在不同的线程之间交替。您首先在其中一个中分配名称foo,然后另一个有机会运行,对foo一无所知,然后当您按enter时,另一个回来了,定义了foo

这种情况的最佳指示符是提示符与命令及其输出不一致。而不是:

<PROMPT> COMMAND
OUTPUT
<PROMPT> COMMAND
OUTPUT

你看:

COMMAND
<PROMPT> OUTPUT
COMMAND
<PROMPT> OUTPUT

每次你按回车键,"other"线程就会在"first"线程写它的输出之前潜入提示符。


编辑

一个不需要django的简单方法:

from threading import Thread
def f(x):
    import pdb; pdb.set_trace()
    while True: pass
t1 = Thread(target=lambda: f(1))
t2 = Thread(target=lambda: f(2))
t1.start(); t2.start()
(Pdb) x
2
(Pdb) x
1

当语句出现在PDB中时,它实际上还没有被执行。当你使用'next'时,它将被执行。

最新更新