어떻게 재귀 적으로을 Jinja2에서 병합 할 수 있습니까? 사용자 정의 필터를 정의하지 않아도됩니까? Jinja2에서 임의의 깊이의 딕트를 병합하십시오.
그래서{ a: { b: 'ab', d: 'ad' } }
+ { a: { b: 'aX', e: 'ae' } }
는
{ a: { b: 'aX', d: 'ad', e: 'ae' } }
내가 Jinja2에 몇 가지 마 코 템플릿을 마이그레이션하고있어이된다. Mako를 사용하면 작은 파이썬 코드 스 니펫을 사용하여 간단하게 사용할 수 있습니다 ... 사용자 지정 필터를 사용할 수없는 이유는 템플릿 엔진에 사용자 지정 필터를 등록 할 수 없기 때문에 직접 액세스 할 수 없기 때문입니다. null
로 설정되어 a
에서 중복 키 (b
이 우선) 및 제거 키를 무시 a
에
{%- macro deep_merge(a, b): %}
{%- for k,v in b.items(): %}
{%- if v is not defined: %}
{%- do a.pop(k) %}
{%- else: %}
{%- if v is mapping: %}
{%- if a[k] is not mapping: %}
{%- do a.update({ k: { } }) %}
{%- endif %}
{%- do deep_merge(a[k], v) %}
{%- else: %}
{%- do a.update({ k: v }) %}
{%- endif %}
{% endif %}
{%- endfor %}
{%- endmacro %}
{%- do deep_merge(a, b) %}
Jinja2 - 코드의이 조각은 재귀 적으로 병합 b
:
당신이 돈 같이 "사용자 정의 필터를 등록 할 수 없습니다" ' 템플리트 엔진을 제어 할 수 있습니다. Mako 또는 Jinja의 선택 만 제공하고 Mako/Jinja 코드가 유효한 한 원하는대로 작성할 수 있습니까? –
수정하십시오. 나는 템플릿 엔진을 제어하지 못하기 때문에 어떤 식 으로든 확장 할 수 없다. 그러나 유효한 Jinja2 코드로 간주되는 것은 무엇이든 그것을 먹일 수 있습니다. –
[표현식'do'] (http://jinja.pocoo.org/docs/dev/templates/#expression-statement)에 대한 액세스 권한이 있습니까? –