Jinja中Namespace定义变量是否有数量限制?报错求解
你尝试用Jinja的Namespace实现循环外变量复用,但运行代码时出现UndefinedError: 'jinja2.utils.Namespace object' has no attribute 'count'错误,代码示例如下:
{% set det = namespace(abbr='') %} {% set det = namespace(DATE='01-01-2021') %} {% set det = namespace(BA=0) %} {% set det = namespace(BO=0) %} {% set det = namespace(CO=0) %} {% set det = namespace(CR=0) %} {% set det = namespace(CRAW=0) %} {% set det = namespace(PH=0) %} {% set det = namespace(CE=0) %} {% set det = namespace(CEAW=0) %} {% set det = namespace(SL=0) %} {% set det = namespace(RL=0) %} {% set det = namespace(CPFE=0) %} {% set det = namespace(CPFR=0) %} {% set det = namespace(CPFT=0) %} {% set det = namespace(TP=0) %} {% set det = namespace(NS=0) %} {% set det = namespace(count=0) %} {% set det = namespace(TA=0) %} {% set det.count = det.count + 1 %}
错误信息:
self.environment.handle_exception()
File "env/lib/python3.8/site-packages/jinja2/environment.py", line 925, in handle_exception
raise rewrite_traceback_stack(source=source)
File "", line 23, in top-level template code
jinja2.exceptions.UndefinedError: 'jinja2.utils.Namespace object' has no attribute 'count'
错误原因
你每次调用{% set det = namespace(...) %}都会重新创建一个全新的Namespace对象,并覆盖之前的det变量。最后一次执行{% set det = namespace(TA=0) %}后,det只包含TA这一个属性,之前定义的count等属性都被覆盖丢失了,所以后续访问det.count会报错。这和Namespace下变量数量无关。
解决方法
只需要创建一次Namespace对象,之后通过赋值的方式添加或修改属性即可:
方式1:初始化时一次性定义所有属性
{% set det = namespace( abbr='', DATE='01-01-2021', BA=0, BO=0, CO=0, CR=0, CRAW=0, PH=0, CE=0, CEAW=0, SL=0, RL=0, CPFE=0, CPFR=0, CPFT=0, TP=0, NS=0, count=0, TA=0 ) %} {% set det.count = det.count + 1 %}
方式2:先创建空/基础Namespace,再逐个添加属性
{% set det = namespace() %} {% set det.abbr = '' %} {% set det.DATE = '01-01-2021' %} {% set det.BA = 0 %} {% set det.BO = 0 %} {% set det.CO = 0 %} {% set det.CR = 0 %} {% set det.CRAW = 0 %} {% set det.PH = 0 %} {% set det.CE = 0 %} {% set det.CEAW = 0 %} {% set det.SL = 0 %} {% set det.RL = 0 %} {% set det.CPFE = 0 %} {% set det.CPFR = 0 %} {% set det.CPFT = 0 %} {% set det.TP = 0 %} {% set det.NS = 0 %} {% set det.count = 0 %} {% set det.TA = 0 %} {% set det.count = det.count + 1 %}
Namespace变量数量限制
Jinja官方没有对Namespace对象的属性数量做限制,只要你的系统内存足够容纳这些变量,就可以正常使用。
内容的提问来源于stack exchange,提问作者mark17

