• 회원가입
  • 로그인
  • 구글아이디로 로그인

[structures] Jinja - macro (매크로)

목차
  1. macro (매크로)
  2. varargs와 kwargs 차이


macro (매크로)

1. 매크로는 일반 프로그래밍 언어에서 함수와 비교됨. 자주 사용하는 관용구를 재사용 가능한 함수로 넣어서 반복하지 않도록 하는 데 유용 (DRY).


다음은 폼 요소를 렌더링하는 작은 매크로 예제임:

{% macro input(name, value='', type='text', size=20) -%}

<input type="{{ type }}" name="{{ name }}" value="{{

     value|e }}" size="{{ size }}">

{%- endmacro %}

 

그런 다음 매크로를 네임스페이스 내에서 함수처럼 호출 가능함.:

<p>{{ input('username') }}</p>

<p>{{ input('password', type='password') }}</p>

 


2. 매크로가 다른 템플릿에 정의된 경우엔 먼저 import 해야 함.

 


3. 매크로 내부에서는 세 가지 특별한 변수에 액세스할 수 있음:


  • varargs - 매크로에서 허용하는 것보다 더 많은 위치 인수가 매크로에 전달되면 특수 varargs 변수에 값 목록이 포함됨.
  • kwargs - varargs와 비슷하지만 키워드 인수용임. 사용되지 않은 모든 키워드 인수는 이 특수 변수에 저장됨.
  • caller - 매크로가 call 태그에서 호출된 경우 호출자(caller)는 이 변수에 호출 가능한 매크로로 저장됨..



4. 매크로는 내부 세부 정보 중 일부를 노출함. 매크로 객체에 포함된 속성 종류는 다음과 같음.:


  • name - 매크로의 이름임. {{ input.name }}은 input을 출력함.
  • arguments - 매크로가 수락하는 인수의 이름 튜플임.
  • catch_kwargs - 이 속성은 매크로가 추가 키워드 인수를 수락하는 경우(즉, 특별한 kwargs 변수에 액세스하는 경우) True임.
  • catch_varargs - 이 속성은 매크로가 추가 위치 인수를 수락하는 경우(즉, 특별한 varargs 변수에 액세스하는 경우) True임.
  • caller - 이 속성은 매크로가 특별한 caller 변수에 액세스하고 call 태그에서 호출될 수 있는 경우 True임.



5. 매크로 이름이 언더바(_)로 시작 시, 내보내기(expose)와 가져오기(import) 모두 할 수 없음. 즉, 언더바(_)로 시작하는 매크로는 외부에서 사용할 수 없음.



6. Jinja에서의 범위 작동 방식으로 인해, 하위 템플릿의 매크로는 상위 템플릿의 매크로를 재정의하지 않음. 다음은 child.txt 파일 렌더링 시, "CHILD"가 아닌 "LAYOUT"을 출력함.


layout.txt

{% macro foo() %}LAYOUT{% endmacro %}

{% block body %}{% endblock %}

 

child.txt

{% extends 'layout.txt' %}

{% macro foo() %}CHILD{% endmacro %}

{% block body %}{{ foo() }}{% endblock %}



PS. 위 코드해석 자세히 보기

 

위의 예제는 Jinja에서 매크로의 스코프 동작을 보여줌. 여기서는 "layout.txt"라는 부모 템플릿과 "child.txt"라는 자식 템플릿이 있음.


부모 템플릿 "layout.txt"에서는 "foo"라는 이름의 매크로가 정의되어 있고, 이 매크로는 "LAYOUT"을 출력함. 자식 템플릿 "child.txt"에서는 같은 이름의 "foo" 매크로를 다시 정의하지만, 이번에는 "CHILD"를 출력함.


그러나 Jinja의 스코프 동작에 따라 자식 템플릿의 매크로가 부모 템플릿의 매크로를 재정의하더라도 부모 템플릿의 매크로가 덮어쓰이지 않음. 따라서 위의 예제에서 "child.txt"를 렌더링하면 "LAYOUT"이 출력됨. "CHILD"가 출력되는 것이 아니라는 것이 포인트임.

 

 

varargs와 kwargs 차이

Varargs (가변인수)


1. 정의

  • 매크로에 전달되는 인수의 개수가 가변적일 때 사용됨.
  • Jinja2에서는 varargs를 처리하기 위해 매개변수 앞에 *를 사용.
  • 보통 *args로 표시되며, 매크로 호출 시 해당 인수들은 튜플로 묶임.

 

2. 예제 - 임의의 개수의 인수를 받아들이고, 받은 인수를 출력.

{% macro example_varargs(*args) %}

    {% for arg in args %}

        {{ arg }}

    {% endfor %}

{% endmacro %}


{{ example_varargs(1, 2, 3, 4) }}

 


Kwargs (키워드인수)

 

1. 정의

  • Jinja2에서는 kwargs를 처리하기 위해 매개변수 앞에 **를 사용.
  • 보통 **kwargs로 표시되며, 매크로 호출 시 지정한 모든 키워드 인수가 딕셔너리로 묶임.

 

2. 예제 - key=value 짝 형식의 여러 값을 받아 출력.

 

{% macro example_kwargs(**kwargs) %}

    {% for key, value in kwargs.items() %}

        {{ key }}: {{ value }}

    {% endfor %}

{% endmacro %}


{{ example_kwargs(name='John', age=30, city='New York') }}

 

 

공식 매뉴얼: https://jinja.palletsprojects.com/en/3.1.x/templates/#macros

방문 감사합니다. (즐겨찾기 등록: Ctrl + D)

분류 제목
structures Jinja - for 반복문 (= for반복문 = 포반복문/포문)
structures Jinja - if 조건문 (= if조건문 = 이프조건문/이프문)
structures Jinja - macro (매크로)
structures Jinja - call (콜블럭) ※ caller함수 = 콜러함수
structures Jinja - filter (필터섹션)
structures Jinja - Assignments (할당) ※ set태그 = 셋태그 ※ namespace (네임스페이스) …
structures Jinja - Block Assignments (블럭 할당)
structures Jinja - extends (익스텐드: 상속/확장)
structures Jinja - Blocks (블록)
structures Jinja - include (인클루드: 삽입하기)
structures Jinja - import (임포트: 가져오기)
목록
찾아주셔서 감사합니다. Since 2012