为什么不check.getsource返回整个类源?

时间:2009-05-30 10:01:20

标签: python inspect code-inspection

我在forms.py

中有这段代码
from django import forms
from formfieldset.forms import FieldsetMixin


class ContactForm(forms.Form, FieldsetMixin):
    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)

    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',)}))

当我尝试使用inspect以编程方式提取代码时,它会遗漏fieldsets

In [1]: import inspect

In [2]: import forms

In [3]: print inspect.getsource(forms)
from django import forms
from formfieldset.forms import FieldsetMixin


class ContactForm(forms.Form, FieldsetMixin):
    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)

    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',)}))

In [4]: print inspect.getsource(forms.ContactForm)
class ContactForm(forms.Form, FieldsetMixin):
    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)


In [5]:      

这似乎不是空行的问题。我测试过没有空行,我在其他属性之间添加了空行。结果不会改变。

为什么检查的任何想法只返回fieldsets之前的部分而不是整个类的来源?

2 个答案:

答案 0 :(得分:1)

编辑:根据评论修改:

inspect.getsource(forms.ContactForm)内,方法BlockFinder.tokeneater()用于确定ContactForm块停止的位置。除了其他之外,它会检查tokenize.DEDENT,它在你的版本中存储在github上的字段集之前找到它。该行仅包含换行符,因此inspect认为当前块已结束。

如果你插入4个空格,它再次适合我。我不能争论这背后的理由,也许是表现。

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',)}))

inspect.getsource(forms)工作方式不同的原因是因为inspect在这种情况下不必确定类定义的开始和结束。它只输出整个文件。

答案 1 :(得分:0)

适合我。我的代码中没有“from formfieldset.forms import FieldsetMixin”。也许这会导致问题..