Почему inspect.getsource не возвращает исходный код всего класса?

StackOverflow https://stackoverflow.com/questions/929472

  •  06-09-2019
  •  | 
  •  

Вопрос

У меня есть этот код в моем 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]:      

Похоже, это не проблема с пустыми строками.Я тестировал без пустой строки между ними и вставил дополнительные пустые строки между другими атрибутами.Результаты не меняются.

Есть какие-нибудь идеи, почему inspect возвращает только ту часть, которая была раньше fieldsets и не весь исходный код класса?

Это было полезно?

Решение

Редактировать:пересмотрено на основе комментариев:

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

Другие советы

У меня это работает.У меня нет "from formfieldset.forms импортировать FieldsetMixin" в моем коде.Возможно, это и вызывает проблему..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top