Warum nicht zurück inspect.getsource die ganze Klasse Quelle?
-
06-09-2019 - |
Frage
Ich habe diesen Code in meinem 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',)}))
Wenn ich versuche, den Code programmatisch mit inspect
extrahieren läßt es aus 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]:
Dies scheint nicht ein Problem mit Leerzeilen zu sein. Ich habe zwischendurch ohne Leerzeile getestet und ich habe zwischendurch andere Attribute zusätzliche Leerzeilen setzen. Ergebnisse ändern sich nicht.
Irgendwelche Ideen, warum inspizieren kehrt nur den Teil vor fieldsets
und nicht die ganze Quelle der Klasse?
Lösung
Bearbeiten: Revidierte basierend auf Kommentare:
Innerhalb inspect.getsource(forms.ContactForm)
wird das Verfahren BlockFinder.tokeneater()
verwendet, um zu bestimmen, wo der ContactForm
Block stoppt. Neben anderen, überprüft es für tokenize.DEDENT
, die es unmittelbar vor einem Fieldset in Ihrer Version auf GitHub gespeichert findet. Die Zeile enthält nur einen Zeilenumbruch, so inspect
denkt, dass der aktuelle Block beendet ist.
Wenn Sie 4 Leerzeichen einfügen, funktioniert es wieder für mich. Ich kann nicht auf die Logik dahinter argumentieren, vielleicht Leistung.
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',)}))
Der Grund, dass inspect.getsource(forms)
funktioniert anders ist, weil inspect
in diesem Fall nicht die Klassendefinition der Start- und Ziel zu bestimmen hat. Es gibt einfach die ganze Datei.
Andere Tipps
Funktioniert für mich. Ich habe nicht in meinem Code „von formfieldset.forms FieldsetMixin importieren“. Vielleicht ein Problem, das verursacht ..