Python Jinja2查找未声明的变量忽略全局变量?

Python Jinja2查找未声明的变量忽略全局变量?,python,jinja2,Python,Jinja2,我想找出Jinja2模板的哪些变量没有被全局变量覆盖。我加载模板源,解析它,并将结果输入meta.find\u undeclared\u variables。无论环境的全局字典中有什么,我都会得到模板的完整变量列表。如何使此操作识别环境和模板中的全局变量,并仅返回它们未包含的变量列表 下面的示例创建一个环境,呈现模板以显示确实读取了全局变量,并调用meta.find_undeclared_variables以显示其结果 from jinja2 import Environment, meta,

我想找出Jinja2模板的哪些变量没有被全局变量覆盖。我加载模板源,解析它,并将结果输入
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)