/ / Nell'interpretazione dei modelli Jinja2, perché l'oggetto codice ha un nome file nullo? - python, jinja2

Nell'interpretazione dei modelli Jinja2, perché l'oggetto codice ha un nome file nullo? - python, jinja2

Sto cercando di distinguere Jinja2 "s TemplateSyntaxError per capire perché non mi dice esattamente il nome del file in cui viene trovato un errore di sintassi.

In realtà sto introducendo questo errore in un sub-template appositamente per cercare di capire meglio questo sistema di template. Quando ottengo l'errore di sintassi, vedo File "<unknown>", line 4, in template nel mio server di anteprima Flask. Il numero di riga è corretto, ma il debugger appare confuso riguardo al file da cui è originato il problema, il che è molto fastidioso. Sono ancora incerto sul nome dell'oggetto codice, template rappresenta.

Come qualcuno ha sottolineato, il <unknown> è usato qui come throwaway quando il valore del nome file dell'oggetto codice è nullo. Dopo aver letto attraverso a pochi Riferimenti per gli oggetti in codice, non ho ancora avuto fortuna ad avvolgere la mia mente in questa stranezza.

Qualcuno sembra avere un errore simile in questo problema github.

risposte:

1 per risposta № 1

Potrebbe essere che è solo un valore arbitrario fornito da Jinja2 a un codice generato dinamicamente?

>>> code = compile("print("test")", "<unknown>", "exec")
>>> code
<code object <module> at 0x1064b6e30, file "<unknown>", line 1>
>>> exec code
test
>>> code.co_filename
"<unknown>"

E sembra che ci sia davvero dentro jinja2 / debug.py - translate_syntax_error.

La spiegazione del perché è piuttosto semplice. L'intero macchinario, a partire da flask.render_template_string attraverso jinja2.Environment.from_string verso i gestori di eccezioni Jinja2 non si preoccupa dell'origine della stringa di modello passata.

Mentre sarebbe possibile scavare un po 'di piùinformazioni dall'alto in basso, quale sarebbe il beneficio di esso comunque? In caso di eccezione si ottiene una traccia dello stack completa con le informazioni locali appropriate disponibili su ciascun livello di esso, incluso da dove si è passati nella stringa e il numero di riga nella stringa del modello errato, ad esempio:

File "jinja2-uknown-filename.py", line 7, in index
return flask.render_template_string("this is a n n {% test %}")
...
File "<unknown>", line 3, in template
TemplateSyntaxError: Encountered unknown tag "test".