如果使用断点进行调试,Pycharm会产生不同的结果

时间:2018-03-16 11:37:48

标签: django debugging django-forms pycharm breakpoints

我使用pycharm来调试django开发服务器,以分析我使用表单类继承的表单实例。

如果我在没有进入任何断点的情况下运行我的应用程序(暂时禁用所有断点),那么一切正常。

如果我在某个断点处停止,则实例化的表单会产生不同的结果。

特别是我有两个多选字段,有时只有一个或两个都没有绑定到初始值。

我可以从调试器中看到设置field['field_name'].initial = value的代码部分已执行,但我随机得到field['field_name'].initial == None

我的watches面板为空,因此我没有意外修改任何值的风险。

这对我来说很奇怪!为什么代码执行会因为步进或不进入某些断点而发生变化?

什么可能导致这种奇怪的行为?

修改

经过多次检查后,我将错误限制在此块中:

class MyForm(BaseForm):
    period = forms.ChoiceField() 

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['period'].choices = self.get_choices()  

方法get_choices返回一个动态计算的选项列表,但即使用静态列表更改它也不会改变结果。

事实上,每当我执行更新,因此我使用MyFormdata参数实例化instance时会发生以下情况:

  • 如果调试时我步入self.fields['period'].choices = self.get_choices(),那么一切正常
  • 如果我在该行中执行,则表单不会验证,"选择有效选项。 XX 不是可用选项之一。"

编辑2:
一般来说,这似乎发生在我踩到修改字段属性的行的任何时候,例如:

self.fields['period'].choices = self.get_choices()  
self.fields['thingy'].initial = 'hello'

我是如此无能为力。要么pycharm被窃听,要么Django有一些奇怪的观察者模式,如果访问了值A,它会改变值B,即使看起来很难,但这似乎不太可能......

0 个答案:

没有答案