2009-05-30 2 views
0

У меня есть этот код в моем forms.py:Почему не проверяет.getsource возвращать весь источник класса?

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, а не весь источник этого класса?

ответ

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 в этом случае не нужно определить начало и конец определение класса. Он просто выводит весь файл.

+0

Нет. Я не перезаряжался() 'ing. Я также удалил FieldsetMixin сейчас и снова попытался, все еще не «fielsets» в исходном выпуске. – muhuk

+0

Какая версия Python? Mine был 2.6.2 (release26-maint, 19.04.2009, 01:56:41) –

+0

Python 2.5.2 (r252: 60911, 4 января 2009, 21:59:32) на Debian Lenny – muhuk

0

Работы для меня. У меня нет «fromformfieldset.forms import FieldsetMixin» в моем коде. Возможно, это вызывает проблему.