/ / При інтерпретації шаблонів Jinja2, чому об'єкт коду має нульове ім'я файлу? - python, jinja2

При інтерпретації шаблонів Jinja2, чому об'єкт коду має нульове ім'я файлу? - python, jinja2

Я намагаюся забрати Jinja2 TemplateSyntaxError щоб дізнатись, чому це не означає точне ім'я файлу, в якому виявлено помилку синтаксису.

Я насправді представляю цю помилку в під-шаблоні, щоб спробувати краще зрозуміти цю систему шаблонів. Після отримання синтаксичної помилки я бачу File "<unknown>", line 4, in template у моєму попереджувальному сервері Flask. Номер рядка правильний, але відладчик з'являється в замішанні про файл, з якого виникла проблема, що дуже дратує. Я ще не визначився з назвою об'єкта коду, template репрезентує

Як зазначив хтось, <unknown> Використовується тут як віддалений, коли значення імені файлу об'єкта коду є нульовим. Прочитавши через а мало хто посилання для об'єктних кодів, я ще не мав щастя обернути мою голову навколо цієї дивності.

Здається, що хтось отримує подібну помилку в це github питання.

Відповіді:

1 для відповіді № 1

Може бути, це лише довільне значення, надане Jinja2, для деякого динамічно генерованого коду?

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

І там, здається, справді є jinja2 / debug.py - translate_syntax_error.

Пояснення того, чому це, є досить простим. Вся техніка, починаючи з flask.render_template_string через jinja2.Environment.from_string до обробників винятків Jinja2 не беруть ніякого занепокоєння з приводу походження рядка шаблону, що передається.

Хоча можна було б ще тоннельінформація зверху вниз, яка б користь цього в будь-якому випадку? У випадку винятку ви отримуєте повний слід стека з відповідною локальною інформацією, доступною на кожному його рівні, у тому числі, звідки ви передали в рядку та номер рядка в рядок шаблону, що помилився, наприклад:

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