Pourquoi ne retourne pas inspect.getsource la source de toute la classe?
-
06-09-2019 - |
Question
J'ai ce code dans mon 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',)}))
Lorsque je tente d'extraire le code programme avec inspect
elle laisse 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]:
Cela ne semble pas être un problème avec des lignes vides. Je l'ai testé sans la ligne blanche entre les deux et j'ai mis des lignes vides supplémentaires entre autres attributs. Les résultats ne changent pas.
Toutes les idées pourquoi inspectent est de retour que la partie avant fieldsets
et non toute la source de la classe?
La solution
modifier: révisé en fonction des commentaires:
A l'intérieur inspect.getsource(forms.ContactForm)
la méthode BlockFinder.tokeneater()
est utilisée pour déterminer l'emplacement du bloc de ContactForm
arrête. En plus d'autres, il vérifie tokenize.DEDENT
, qu'il trouve juste avant fieldsets dans votre version stockée sur GitHub. La ligne ne contient qu'une coupure de ligne, donc inspect
pense que le bloc en cours est terminée.
Si vous insérez 4 places, cela fonctionne pour moi. Je ne peux pas argumenter sur les raisons derrière tout cela, peut-être la performance.
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 raison pour laquelle inspect.getsource(forms)
fonctionne différemment est parce que inspect
dans ce cas, ne doit pas déterminer le début et la fin de la définition de classe. Il affiche simplement le fichier entier.
Autres conseils
Travaux pour moi. Je n'ai pas « de formfieldset.forms importer FieldsetMixin » dans mon code. Peut-être est à l'origine d'un problème ..