Variável alterna se existe ou não no Depurador do Python

Alguém pode explicar isso? (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' 

Aqui está a function de visualização que o acionou:

 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': , 'primary_biz': , 'selected_items': u'1,2', 'backup_tech': None, 'backup_biz': None} 

Você tem dois segmentos que pararam no mesmo ponto de interrupção.

Então, basicamente, existem duas instâncias do pdb, competindo pelo seu prompt, ou seja, seus prompts estão alternando entre os diferentes threads. Primeiro você atribui o nome foo em um, do que o outro tem a chance de correr, não sabendo nada sobre foo , então quando você pressiona enter, o outro está de volta, com foo definido.

O melhor indicador de que esse é o caso é que seu prompt não está alinhado com seus comandos e suas saídas. Ao invés de:

  COMMAND OUTPUT  COMMAND OUTPUT 

Entende:

 COMMAND  OUTPUT COMMAND  OUTPUT 

Toda vez que você pressiona enter, o thread “outro” se abre em seu prompt antes que o “primeiro” thread consiga escrever sua saída.


EDITAR

Uma maneira simples de se reproduzir de forma independente, sem 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 

Quando a declaração aparece no PDB, ela ainda não foi executada. Será executado quando você usar ‘next’.