在解析Jinja2模板时,为什么代码对象的文件名为null?
我正在研究Jinja2的TemplateSyntaxError
,想弄清楚为什么它不告诉我具体出错的文件名。
其实,我是故意在一个子模板里引入这个错误,以便更好地理解这个模板系统。当我遇到语法错误时,我在Flask的预览服务器上看到File "<unknown>", line 4, in template
。行号是对的,但调试器似乎对出问题的文件搞不清楚,这让我很烦恼。我现在还不确定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'.