Python Jinja2查找未声明的变量忽略全局变量?
我想找出Jinja2模板的哪些变量没有被全局变量覆盖。我加载模板源,解析它,并将结果输入Python Jinja2查找未声明的变量忽略全局变量?,python,jinja2,Python,Jinja2,我想找出Jinja2模板的哪些变量没有被全局变量覆盖。我加载模板源,解析它,并将结果输入meta.find\u undeclared\u variables。无论环境的全局字典中有什么,我都会得到模板的完整变量列表。如何使此操作识别环境和模板中的全局变量,并仅返回它们未包含的变量列表 下面的示例创建一个环境,呈现模板以显示确实读取了全局变量,并调用meta.find_undeclared_variables以显示其结果 from jinja2 import Environment, meta,
meta.find\u undeclared\u variables
。无论环境的全局字典中有什么,我都会得到模板的完整变量列表。如何使此操作识别环境和模板中的全局变量,并仅返回它们未包含的变量列表
下面的示例创建一个环境,呈现模板以显示确实读取了全局变量,并调用meta.find_undeclared_variables
以显示其结果
from jinja2 import Environment, meta, FunctionLoader, PrefixLoader
def load_mapping(name):
return 'Mapping %s {{version}} {{docid}}' % name
def load_link(name):
return 'Link %s {{version}} {{docid}}' % name
loader = PrefixLoader({
'link': FunctionLoader(load_link),
'map': FunctionLoader(load_mapping)
})
env = Environment(loader=loader)
globals = {'version': '1.0'}
env.globals.update(globals)
print env.get_template('map/test').render(docid='asdf')
tsrc = env.loader.get_source(env, 'link/test')
parsed = env.parse(tsrc)
print meta.find_undeclared_variables(parsed)
代码打印:
Mapping test 1.0 asdf
set(['version', 'docid'])
由于version
是一个全局代码,我想更改我的代码,以便只返回docid
我使用的是Python 2.7.6和Jinja 2.7.3。我最后做了类似的事情,不过考虑到这只是一种变通方法。我想在金贾找到一个解决办法。在库外部执行此操作意味着了解库的内部结构,最终可能会中断。未声明的变量是必须使用模板上下文或全局变量提供的所有变量。使用{%set..%}时,可以在模板中声明变量。更多信息请参见油井文档高级API:class jinja2.Environment
jinja_globals = env.globals.keys()
print meta.find_undeclared_variables(parsed) - set(jinja_globals)