任何人都能解释一下吗? (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}
答案 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;。
后执行