Por que não retorna inspect.getsource toda a fonte de classe?
-
06-09-2019 - |
Pergunta
Eu tenho esse código no meu 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 tento extrair o código de programação com inspect
deixa de fora 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]:
Este não parece ser um problema com linhas em branco. Eu testei sem a linha em branco no meio e eu coloquei as linhas em branco adicionais entre outros atributos. Os resultados não mudam.
Todas as ideias por inspecionar está retornando apenas a parte antes fieldsets
e não toda a fonte da classe?
Solução
edit: revisto com base em comentários:
Dentro inspect.getsource(forms.ContactForm)
o método BlockFinder.tokeneater()
é usada para determinar onde o bloco ContactForm
pára. Além de outros, ele verifica para tokenize.DEDENT
, que se encontra bem diante fieldsets em sua versão armazenados no github. A linha contém apenas uma quebra de linha, de modo inspect
acha que o bloco atual foi encerrada.
Se você inserir 4 espaços, ele trabalha para mim novamente. Eu não posso discutir sobre a lógica por trás disso, talvez o desempenho.
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',)}))
A razão que inspect.getsource(forms)
funciona de forma diferente é porque inspect
nesse caso não tem que determinar início da definição de classe e fim. Ele simplesmente envia o arquivo inteiro.
Outras dicas
Funciona para mim. Eu não tenho "de formfieldset.forms importar FieldsetMixin" no meu código. Talvez isso está causando um problema ..