Переменная чередуется независимо от того, существует ли она в отладчике 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() 

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 Solutions collect form web for “Переменная чередуется независимо от того, существует ли она в отладчике Python”

У вас есть два потока, которые останавливаются в одной точке останова.

Таким образом, в основном есть два экземпляра pdb, конкурирующих за ваше приглашение, т.е. ваши подсказки чередуются между различными потоками. Сначала вы назначаете имя foo в один, а другой получает шанс бежать, ничего не зная о foo , затем, когда вы нажимаете enter, другой возвращается, с определенным foo .

Лучшим показателем этого является то, что ваше приглашение не соответствует вашим командам и их выходам. Вместо:

 <PROMPT> COMMAND OUTPUT <PROMPT> COMMAND OUTPUT 

Ты видишь:

 COMMAND <PROMPT> OUTPUT COMMAND <PROMPT> OUTPUT 

Каждый раз, когда вы нажимаете enter, «другой» поток прокрадывается в свою подсказку перед тем, как «первый» поток успевает записать свой вывод.


РЕДАКТИРОВАТЬ

Простой способ воспроизвести в автономном режиме без джанго:

 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».

Python - лучший язык программирования в мире.