变量改变它是否存在于Python调试中

2024-04-25 08:43:17 发布

您现在位置: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()

你知道吗请求.POST地址:

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

Tags: nameformdataiffooisrequestnot
2条回答

当语句出现在PDB中时,它实际上还没有被执行。一旦您使用“下一步”,它将被执行。你知道吗

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

因此,基本上,有两个pdb实例在竞争您的提示,即您的提示在不同的线程之间交替出现。首先在一个中指定名称foo,而另一个则有机会运行,对foo一无所知,然后按enter键时,另一个返回,并定义了foo。你知道吗

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

<PROMPT> COMMAND
OUTPUT
<PROMPT> COMMAND
OUTPUT

你看:

COMMAND
<PROMPT> OUTPUT
COMMAND
<PROMPT> OUTPUT

每次按enter键时,“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

相关问题 更多 >