/ / Al interpretar las plantillas de Jinja2, ¿por qué el objeto de código tiene un nombre de archivo nulo? - python, jinja2

Al interpretar las plantillas de Jinja2, ¿por qué el objeto de código tiene un nombre de archivo nulo? - python, jinja2

Estoy tratando de desarmar Jinja2 s TemplateSyntaxError para ver por qué no me dice el nombre exacto del archivo en el que se encuentra un error de sintaxis.

En realidad, estoy introduciendo este error en una sub-plantilla con el propósito de intentar comprender mejor este sistema de plantillas. Al obtener el error de sintaxis, veo File "<unknown>", line 4, in template en mi servidor de vista previa de matraz. El número de línea es correcto, pero el depurador parece confundido sobre el archivo desde el cual se originó el problema, lo cual es muy molesto. Todavía no estoy seguro de cuál es el nombre del objeto de código, template representa

Como alguien ha señalado, la <unknown> se usa aquí como un descarte cuando el valor del nombre de archivo del objeto de código es nulo. Después de leer un pocos referencias para los objetos de código, todavía no he tenido la suerte de envolver mi cabeza en torno a esta rareza.

Alguien parece tener un error similar en este problema github.

Respuestas

1 para la respuesta № 1

¿Puede ser que sea solo un valor arbitrario proporcionado por Jinja2 a algún código generado dinámicamente?

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

Y allí parece estar ciertamente en jinja2 / debug.py - translate_syntax_error.

La explicación de por qué eso es bastante sencillo. Toda la maquinaria, comenzando con flask.render_template_string mediante jinja2.Environment.from_string hasta los manejadores de excepciones Jinja2 no se preocupa por el origen de la cadena de plantilla que se pasa.

Si bien sería posible hacer un túnel másInformación de arriba abajo, ¿cuál sería el beneficio de todos modos? En el caso de una excepción, obtiene un seguimiento completo de la pila con la información local apropiada disponible en cada nivel del mismo, incluido el lugar desde donde pasó la cadena y el número de línea en la cadena de la plantilla que erró, por ejemplo:

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