Perché non inspect.getsource restituire tutta la sorgente della classe?
-
06-09-2019 - |
Domanda
Ho questo codice nel mio 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',)}))
Quando si tenta di estrarre il codice di programmazione con inspect
lascia fuori 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]:
Questo non sembra essere un problema con righe vuote. Ho provato senza la riga vuota in mezzo e ho messo le ulteriori righe vuote tra gli altri attributi. I risultati non cambiano.
Tutte le idee perché controllano sta tornando solo la parte prima fieldsets
e non tutta la fonte della classe?
Soluzione
modifica: Revised sulla base di commenti:
All'interno inspect.getsource(forms.ContactForm)
metodo BlockFinder.tokeneater()
viene utilizzato per determinare dove il blocco ContactForm
ferma. Inoltre altri, verifica la presenza di tokenize.DEDENT
, che si trova a destra prima fieldsets nella versione conservati a github. La linea contiene solo un'interruzione di linea, in modo da inspect
pensa che il blocco corrente è terminata.
Se si inserisce 4 spazi, funziona per me. Non posso discutere sulla logica alla base di questo, forse le prestazioni.
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',)}))
La ragione per cui inspect.getsource(forms)
funziona in modo diverso è perché inspect
in quel caso non ha bisogno di stabilire inizio e la fine della definizione della classe. Emette semplicemente l'intero file.
Altri suggerimenti
funziona per me. Non ho "dal formfieldset.forms import FieldsetMixin" nel mio codice. Forse che sta causando un problema ..