变量交替显示它是否存在于Python调试器中

时间:2014-08-05 19:09:00

标签: python django pdb

任何人都能解释一下吗? (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()

request.POST:

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

2 个答案:

答案 0 :(得分:1)

你有两个线程停在相同的断点处。

基本上,有两个pdb实例,竞争你的提示,即你的提示在不同的线程之间交替。您首先在一个中分配名称foo,而另一个有机会运行,对foo一无所知,然后当您按Enter键时,另一个返回,foo定义

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

<PROMPT> COMMAND
OUTPUT
<PROMPT> COMMAND
OUTPUT

你看:

COMMAND
<PROMPT> OUTPUT
COMMAND
<PROMPT> OUTPUT

每次按回车键,&#34;其他&#34;线程在&#34;第一个&#34;之前在它的提示中偷偷摸摸线程设法写出它的输出。


修改

一种在没有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

答案 1 :(得分:0)

当声明出现在PDB中时,它还没有实际执行过。它将在您使用&#39; next&#39;。

后执行