<p><strong>编辑:根据评论进行修订:</strong></p>
<p>在<code>inspect.getsource(forms.ContactForm)</code>中,<code>BlockFinder.tokeneater()</code>方法用于确定<code>ContactForm</code>块的停止位置。除此之外,它还检查<code>tokenize.DEDENT</code>,它在存储在github的版本中的字段集之前找到它。该行只包含一个换行符,因此<code>inspect</code>认为当前块已结束。在</p>
<p>如果你插入4个空格,它对我再次有效。我无法解释这背后的理由,也许是表现。在</p>
<pre><code>class ContactForm(forms.Form):
full_name = forms.CharField(max_length=120)
email = forms.EmailField()
website = forms.URLField()
message = forms.CharField(max_length=500, widget=forms.Textarea)
send_notification = forms.BooleanField(required=False)
# < insert 4 spaces here
fieldsets = ((u'Personal Information',
{'fields': ('full_name', 'email', 'website'),
'description': u'Your personal information will not ' \
u'be shared with 3rd parties.'}),
(None,
{'fields': ('message',),
'description': u'All HTML will be stripped out.'}),
(u'Preferences',
{'fields': ('send_notification',)}))
</code></pre>
<p><code>inspect.getsource(forms)</code>工作方式不同的原因是,在这种情况下,<code>inspect</code>不必确定类定义的开始和结束。它只是输出整个文件。在</p>