/ / Warum hat das Codeobjekt bei der Interpretation von Jinja2-Templates den Dateinamen Null? - Python, jinja2

Warum hat das Code-Objekt bei der Interpretation von Jinja2-Vorlagen einen Null-Dateinamen? - Python, Jinja2

Ich versuche, Jinja2 's auseinanderzunehmen TemplateSyntaxError um zu sehen, warum es nicht den genauen Dateinamen angibt, in dem ein Syntaxfehler gefunden wird

Ich führe diesen Fehler absichtlich in eine Untervorlage ein, um zu versuchen, dieses Schablonensystem besser zu verstehen. Nachdem ich den Syntaxfehler erhalten habe, sehe ich File "<unknown>", line 4, in template in meinem Flask-Preview-Server. Die Zeilennummer ist korrekt, aber der Debugger scheint verwirrt über die Datei zu sein, aus der das Problem stammt. Ich bin noch nicht sicher, wie der Name des Code-Objekts lautet. template repräsentiert.

Wie jemand darauf hingewiesen hat, das <unknown> wird hier als Wegwerf verwendet, wenn der Dateiname des Code-Objekts NULL ist. Nach dem Lesen einer wenige Verweise Für Code-Objekte habe ich noch nicht das Glück gehabt, meinen Kopf um diese Verrückung zu legen.

Jemand scheint einen ähnlichen Fehler zu bekommen dieses GitHub Problem.

Antworten:

1 für die Antwort № 1

Kann es sein, dass es nur ein beliebiger Wert ist, der von Jinja2 für einen dynamisch generierten Code bereitgestellt wird?

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

Und da scheint es tatsächlich in zu sein jinja2 / debug.py - translate_syntax_error.

Die Erklärung, warum das so ist, ist ziemlich einfach. Die ganze Maschine, angefangen mit flask.render_template_string durch jinja2.Environment.from_string Bis auf Jinja2-Ausnahmebehandler gibt es keine Bedenken hinsichtlich des Ursprungs der übergebenen Vorlagenzeichenfolge.

Es wäre zwar möglich, noch mehr zu tunnelnInformationen von oben, was wäre der Vorteil davon? Im Ausnahmefall erhalten Sie eine vollständige Stack-Ablaufverfolgung mit entsprechenden lokalen Informationen, die auf jeder Ebene verfügbar sind, einschließlich der Position, an der Sie die Zeichenfolge übergeben haben, und der Zeilennummer in der fehlerhaften Vorlagenzeichenfolge, z.

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".