Почему inspect.getsource не возвращает исходный код всего класса?
-
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" в моем коде.Возможно, это и вызывает проблему..