Jinja: 2.9 ๋ฃจํ”„ ๋‚ด์—์„œ ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•  ๋•Œ ํšŒ๊ท€

์— ๋งŒ๋“  2017๋…„ 01์›” 07์ผ  ยท  65์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pallets/jinja

2.9:

>>> jinja2.Template('{% set a = -1 %}{% for x in range(5) %}[{{ a }}:{% set a = x %}{{ a }}] {% endfor %}{{ a }}').render()
u'[:0] [:1] [:2] [:3] [:4] -1'

2.8:

>>> jinja2.Template('{% set a = -1 %}{% for x in range(5) %}[{{ a }}:{% set a = x %}{{ a }}] {% endfor %}{{ a }}').render()
u'[-1:0] [0:1] [1:2] [2:3] [3:4] -1'

์›๋ž˜ IRC์— ๋ณด๊ณ ๋œ ๋‚ด์šฉ:

jinja2 ๋ฒ”์œ„ ์ง€์ •์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์ • ์‚ฌํ•ญ์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฌธ์ œ๋Š” ์—ฌ๊ธฐ์— ์—ฐ๋„ ํ• ๋‹น์ž…๋‹ˆ๋‹ค. https://github.com/kennethlove/alex-gaynor-blog-design/blob/551172/templates/archive.html#L13 -L24

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

changed_from_last ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•œ IMO์ž…๋‹ˆ๋‹ค. changed ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ• ๊นŒ์š”?

์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ํ•ญ์ƒ "๋ณ€๊ฒฝ๋œ" ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ ํ–‰๋™์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ข‹์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋“ค์€ ํ•ญ์ƒ not loop.first ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  65 ๋Œ“๊ธ€

ํ˜„์žฌ ๋™์ž‘์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์ง€๋งŒ ์ด์ „ ๋™์ž‘๋„ ํ™•์‹คํžˆ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. {% set %} ํƒœ๊ทธ๋Š” ์™ธ๋ถ€ ๋ฒ”์œ„๋ฅผ ์žฌ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค ๊ฒฝ์šฐ์— ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ณ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๋™์ž‘์€ [-1:0] [-1:1] [-1:2] [-1:3] [-1:4] -1 ์™€ ๊ฐ™์€ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค.

์ด ํŠน์ • ๊ฒฝ์šฐ์—๋Š” groupby ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค์†Œ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฃจํ”„์—์„œ {% set found = true %} ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์ฐพ์€ ๋‹ค์Œ ๋‚˜์ค‘์— ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž‘๋™์„ ๋ฉˆ ์ถ”๋ฉด ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋ฌผ๊ฑด์„ ๋ง๊ฐ€ ๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค ...

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ „์— ์ž‘๋™ํ–ˆ๋‹ค๋Š” ๊ฒƒ์— ์ถฉ๊ฒฉ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•ญ์ƒ ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

๋ถ„๋ช…ํžˆ ์˜ˆ:

>>> import jinja2
>>> jinja2.__version__
'2.0'
>>> jinja2.Template('{% for x in range(5) %}[{{ a }}:{% set a = x %}{{ a }}] {% endfor %}{{ a }}').render()
u'[:0] [0:1] [1:2] [2:3] [3:4] '

์—„์ฒญ๋‚œ. ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ๊ฑด์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ ์‚ฌ์ด์— ํ•จ์ˆ˜ ๋ฒ”์œ„๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์˜ˆ: ๋งคํฌ๋กœ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ. ๋‚˜๋Š” ์ง€๊ธˆ ์ด๊ฒƒ์„ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅธ๋‹ค.

ํ  ์•„๋งˆ๋„ nonlocal ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ ํŒŒ์ด์ฌ์˜ ๋ฒ”์œ„ ์ง€์ •๊ณผ ๋น„์Šทํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค)? ์ฆ‰, ์™ธ๋ถ€ ๋ฒ”์œ„์— ์ •์˜๋œ ํ•ญ๋ชฉ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ(์ฆ‰, ์‚ฌ์ด์— ๋งคํฌ๋กœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ) ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?

๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์ด ํ…œํ”Œ๋ฆฟ ์–ด์„ค์…˜ ์˜ค๋ฅ˜๋กœ ํฌ์ฐฉ๋˜๊ธฐ ์ „์—:

>>> Template('{% set x = 0 %}{% for y in [1, 2, 3] recursive %}{{ x }}{% set x = y %}{% endfor %}').render()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
jinja2.exceptions.TemplateAssertionError: It's not possible to set and access variables derived from an outer scope! (affects: x (line 1)

์žฌ๊ท€๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๋™์ž‘์ด ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(2.8.1์€ ์žฌ๊ท€๊ฐ€ ์žˆ๋Š” UnboundLocalError ์˜ค๋ฅ˜ ๋ฐ ์—†๋Š” '012')

๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ๋กœ์ปฌ ์˜ค๋ฅ˜๋Š” ๋งˆ์Šคํ„ฐ์—์„œ ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ•ด์•ผ ํ• ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ถ„๋ช…ํžˆ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ •๋ง ์‹ซ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ "์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•จ"์œผ๋กœ ์ข…๋ฃŒํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋กœ๋ถ€ํ„ฐ ๋” ๋งŽ์€ ์—ฌํŒŒ๊ฐ€ ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋Œ€์•ˆ์„ ๋‹ค์‹œ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด v.2.8.1์—์„œ v2.9.4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ๋‚ด ๋ธ”๋กœ๊ทธ ํ…œํ”Œ๋ฆฟ์ด ํญ๋ฐœํ•œ ํ›„ ์ด ๋ฌธ์ œ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค(#656 ์ฐธ์กฐ).

๋ฃจํ”„ ๋ฐ˜๋ณต ์‚ฌ์ด์— ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์ถ”์ ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์น  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค(https://github.com/MinchinWeb/seafoam/commit/8eb760816a06e4f0382816f82586204d1e7734fd, Ifed464,122649 but1264152deafoam/55db5566d5 ์ฐธ์กฐ). ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ ํ•˜๋Š” ์˜์‹ฌ. ๋น„๊ต๊ฐ€ ์ด์ œ ์ธ๋ผ์ธ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ƒˆ ์ฝ”๋“œ๋ฅผ ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด ์ด์ „ ์ฝ”๋“œ(v.2.8.1):

{%- set last_day = None -%}

{% for article in dates %}
    {# ... #}
    <div class="archives-date">
        {%- if last_day != article.date.day %}
            {{ article.date | strftime('%a %-d') }}
        {% else -%}
            &mdash;
        {%- endif -%}
    </div>
    {%- set last_day = article.date.day %}
{% endfor %}

์ธ๋ผ์ธ ๋น„๊ต๊ฐ€ ํฌํ•จ๋œ ์ƒˆ ์ฝ”๋“œ(v2.9.4):

{% for article in dates %}
    {# ... #}
    <div class="archives-date">
        {%- if ((article.date.day == dates[loop.index0 - 1].date.day) and
                (article.date.month == dates[loop.index0 - 1].date.month) and 
                (article.date.year == dates[loop.index0 - 1].date.year)) %}
                    &mdash;
        {% else -%}
                    {{ article.date | strftime('%a %-d') }}
        {%- endif -%}
    </div>
{% endfor %}

๊ทธ๋ž˜์„œ ์ €๋Š” "๊ธฐ๋Šฅ"(๋˜๋Š” ์›ํ•˜๋Š” ๊ฒฝ์šฐ "ํ•ดํ‚น") ์ด ์‚ฌ์šฉ๋˜์—ˆ๊ณ  ์ด๋ฏธ ๋ˆ„๋ฝ๋˜์—ˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„ ์ง€์ • ๋ฌธ์ œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•˜์—ฌ ํ˜„์‹œ์ ์—์„œ ํ˜„๋ช…ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ๋กœ๊ทธ์— ๋ฌด์–ธ๊ฐ€(์ตœ์†Œํ•œ)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์„ ๋œ

๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋„๋ฆฌ ๋‚จ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค :-/ ์งœ์ฆ๋‚˜๊ฒŒ๋„ ์ด ์ž‘์—…์„ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—์„œ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๋” ๋ฉ‹์ง„ API๋ฅผ ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค( loop.changed_from_last ):

{% for article in dates %}
    <div class="archives-date">
        {%- if loop.changed_from_last(article.date.day) %}
            {{ article.date | strftime('%a %-d') }}
        {% else -%}
            &mdash;
        {%- endif -%}
    </div>
{% endfor %}

changed_from_last ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•œ IMO์ž…๋‹ˆ๋‹ค. changed ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ• ๊นŒ์š”?

์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋Š” ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด ํ•ญ์ƒ "๋ณ€๊ฒฝ๋œ" ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ ํ–‰๋™์ด ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ข‹์ง€ ์•Š๋‹ค๋ฉด ๊ทธ๋“ค์€ ํ•ญ์ƒ not loop.first ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ previous_context ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜์ง€ ์•Š๊ณ  ์ „์ฒด ์ด์ „ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณด์œ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ previous ๋˜๋Š” prev ? "context"๋Š” ์ด ๋ฌธ๋งฅ์—์„œ ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค(๋ง์žฅ๋‚œ ์˜๋„ ์—†์Œ)

.....๊ทธ๋ฆฌ๊ณ  ์ด์ œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ next ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ด๋ฏธ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :/

๋˜๋Š” ๋ฒ”์œ„ ๋ฐ–์—์„œ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ช…์‹œ์  ์ง„์ˆ : set_outer ๋˜๋Š” ๊ธฐํƒ€.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค :

class LoopContextBase(object):

    def __init__(self, recurse=None, depth0=0):
        ...
        self._last_iteration = missing

    def changed(self, *value):
        if self._last_iteration != value:
            self._last_iteration = value
            return True
        return False

@davidism ์ „์ฒด ๋ฒ”์œ„ ์ง€์ • ์‹œ์Šคํ…œ์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ ๋Š” set_outer ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฃผ๋กœ ์ „์ฒด๋ฅผ ๋ง์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๋Ÿด ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. "ํ˜„์žฌ ๊ฐ’์ด ์ด์ „ ๊ฐ’ ๋ณด๋‹ค ํฐ์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด" ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์˜ˆ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ changed ๋ฐฉ์‹๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ, ๊ทธ๊ฒƒ์€ํ•˜์ง€๋งŒ ์ผ๋ถ€ ํŠน์ • ์†์„ฑ์ด loop.first (๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ) ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ์˜ ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ๋น„๊ตํ•  ์ˆ˜ ์—†์–ด ์—ฌ๊ธฐ์„œ ํ•ด์•ผ ํ•  ์ผ์„ ์•ˆ์ •์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ๋‚จ์šฉํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค๋„ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)

๋˜ํ•œ ํƒ€์‚ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์ž‘์„ฑ์ž๊ฐ€ ํ…œํ”Œ๋ฆฟ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ์‹œํ•  ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ Jinja 2.9+๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด ์†์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๊ฐ€ ํ…œํ”Œ๋ฆฟ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์ตœ์‹  2.8 ๋ฒ„์ „์„ ํ”„๋กœ๊ทธ๋žจ์— ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ jinja2 ๋ฒ”์œ„๊ฐ€ ํŒŒ์ด์ฌ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ฆ‰, jinja2 ํ…œํ”Œ๋ฆฟ์€ ํŒŒ์ด์ฌ ๋ชจ๋“ˆ์— ํ•ด๋‹นํ•˜๊ณ , ๋งคํฌ๋กœ๋Š” ํ•จ์ˆ˜์— ํ•ด๋‹นํ•˜๊ณ (์ž์ฒด ๋ฒ”์œ„๊ฐ€ ์žˆ์Œ) for ๋ฃจํ”„์—๋Š” ์ž์ฒด ๋ฒ”์œ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. @mitsuhiko ๋Š” jinja 2.8 ์ดํ•˜๊ฐ€ ๋ฒ”์œ„ ์ง€์ • ๋ฒ„๊ทธ๊ฐ€

ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ(Jinja 2.8)์˜ ๋™์ž‘์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. https://github.com/pallets/jinja/issues/660 ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค(ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ์ธ์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๋ชจ๋“  ํŒŒ์ด์ฌ ๊ฐœ๋ฐœ์ž๋Š” ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜).

๋˜๋Š” ์ถ”์ธกํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก jinja์˜ ๋ฒ”์œ„ ์ง€์ •์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ œ ๋Œ“๊ธ€์„ ๋ถ€์ •์ ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ๋ง์•„์ฃผ์„ธ์š”. ์ง„์ž์—๊ฒŒ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@roganov ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฐธ๊ณ  ์‚ฌํ•ญ:

๋ˆ„๊ตฐ๊ฐ€ jinja2 ๋ฒ”์œ„๊ฐ€ ํŒŒ์ด์ฌ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ •ํ™•ํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ƒ๊ฐ์— Python์˜ ๋ฒ”์œ„ ์ง€์ •์€ ํŠนํžˆ ํ…œํ”Œ๋ฆฟ์—์„œ ๋งค์šฐ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์‰ฝ๊ฒŒ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@mitsuhiko ๋Š” jinja 2.8 ์ดํ•˜๊ฐ€ ๋ฒ”์œ„ ์ง€์ • ๋ฒ„๊ทธ๊ฐ€

์ด๊ฒƒ์€ ๋ฒ„๊ทธ๋กœ ์ธํ•œ ์˜ˆ์™ธ์˜€์œผ๋ฉฐ ์ผ๋ถ€ ์ œํ•œ๋œ ์ƒํ™ฉ์—์„œ๋งŒ ์ˆœ์ „ํžˆ ์šฐ์—ฐํžˆ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. Jinja๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ๋ฌธ์„œํ™”๋œ ๋ฒ”์œ„ ์ง€์ • ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ณ  ์ด ๋™์ž‘์€ ๋ฌธ์„œํ™” ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค . ํ•ญ์ƒ ๋ณ€์ˆ˜๋Š” ์™ธ๋ถ€ ๋ฒ”์œ„๋กœ ์ „ํŒŒ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํ”„๊ฐ€ ๋๋‚œ ํ›„ ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ถ”์ธกํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก jinja์˜ ๋ฒ”์œ„ ์ง€์ •์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด ์ด๋ฏธ ๋ฉฐ์น  ์ „์— ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€์ˆ˜๋ฅผ ๋ฃจํ”„์— ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค(ํ…์ŠคํŠธ ํ•„ํ„ฐ์—์„œ ์ฐจ์šฉ).

{%- set last_day = None -%}

{% for article in dates | pass_variable ( last_day ) %}
    {# ... #}
    <div class="archives-date">
        {%- if last_day != article.date.day -%}
            {{ article.date | strftime('%a %-d') }}
        {%- else %}
            &mdash;
        {% endif -%}
    </div>
    {%- set last_day = article.date.day %}
{% endfor %}

์•„๋‹ˆ๋ฉด ํ˜„์žฌ ๋งคํฌ๋กœ์— ์ ์šฉ๋˜๋Š” scoped ์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?


๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋ฃจํ”„ ๊ฐ„์— ์ผ์ข…์˜ ์นด์šดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํ–‰์€ ๋ช‡ ๊ฐœ์ž…๋‹ˆ๊นŒ? ๋ช‡ ๊ฐœ์˜ ํ–‰์ด ์ผ๋ถ€ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๊นŒ? ์„ ํƒํ•œ ํ–‰์— ๋Œ€ํ•œ ์ผ๋ถ€ ์†์„ฑ์˜ ์ด๊ณ„(์ด ํ–‰ ์ธ์‡„)?

ํ•„ํ„ฐ๋Š” iterable์—์„œ ์ด๋ฏธ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ๋Š” ํ•„ํ„ฐ ๊ตฌ๋ฌธ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์˜๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š” ์ด์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{% for article in dates with last_day %}

ํŠนํžˆ with ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด {% with %} ์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋  ๋•Œ Jinja์—์„œ ์ด๋ฏธ ๋ฒ”์œ„ ์ง€์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. OTOH, ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ๋ฒ”์œ„๊ฐ€ ์—ด๋ฆฌ๊ณ  ์™ธ๋ถ€ ๋ฒ”์œ„ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฐ˜๋Œ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด Jinja์—๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฒ”์œ„ ์ง€์ • ๊ทœ์น™์„ ์—ฌ์ „ํžˆ ํŒŒ๊ดดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ์€ ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ปดํŒŒ์ผ ๋˜๋Š” ID ์ถ”์  ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜๋”๋ผ๋„ recursive for ๋ฃจํ”„๊ฐ€ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€ for ๋ฃจํ”„์—์„œ ๋งคํฌ๋กœ๋ฅผ ์ •์˜ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? for ๋ฃจํ”„์— ํ˜ธ์ถœ ๋ธ”๋ก์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

์Šคํ† ๋ฆฌ์ง€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๊ณ  ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ๊ฐœ์ฒด๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

{% set foo = namespace() %}
{% set foo.iterated = false %}
{% for item in seq %}
  {% set foo.iterated = true %}
{% endfor %}

๊ทธ๋Ÿฌ๋‚˜ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด set ํƒœ๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@mitsuhiko ๋ฐ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ํŒจํ„ด์€ ์ด๋ฏธ do ํƒœ๊ทธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค. http://stackoverflow.com/a/4880398/400617

FWIW, do ์˜ ์†”๋ฃจ์…˜์€ ๋งค์šฐ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด nonlocal ๊ฐ€ ํ•„์š”ํ•  ๋•Œ Python 2์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ...

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฑฐ๊ธฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ง€์ ํ•˜๋ฉด์„œ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Alex๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ๋งŽ์€ ๋ฌธ์ œ๋Š” ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Python์— ์ผ๋ถ€ ๋…ผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ (์ถ”ํ•œ) ํ•ดํ‚น์€ ๋ชฉ๋ก, ์ถ”๊ฐ€ ๋ฐ ํŒ์—…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. http://stackoverflow.com/a/32700975/4276230

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ์ด ์ฝ”๋“œ๋ฅผ ์•ฝ 2๋…„ ์ „๋ถ€ํ„ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ƒˆ ๋ฌธ์„œ์™€ ์ด ํ† ๋ก ์—์„œ ์ค‘๋‹จ๋˜๊ณ  ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ €๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.

{% set list = "" %}
{% for name in names %}
{% if name.last is defined %}
{% set list = list + name.last + " " %}
{% if loop.last %}
{{ list.split(' ')|unique }}
{% endfor %}

@pujan14

{{ names|map(attribute="last")|select|unique }}

unique ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ํ•„ํ„ฐ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์ด๋ฏธ unique ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”,
์ด๋กœ ์ธํ•ด "์ถ”ํ•œ" ์˜ˆ๊ฐ€ ๋งŽ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ jinja ํ…œํ”Œ๋ฆฟ์˜ for ๋ฃจํ”„์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์šฐ์•„ํ•˜๊ณ /์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์กฐ์–ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚ด ์ฝ”๋“œ๋„ ์†์ƒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์™œ ๊ทธ๊ฒƒ์„ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์‹ญ์‹œ์˜ค.

{% for state in states.sensor -%}
{% if loop.first %}
{% set devnum = 0 %}
{% endif -%}
{%- if state.state == "online" %}
{% set devnum = devnum + 1 %}
{%- endif -%}
{% if loop.last %}
{{ devnum }}
{% endif -%}
{%- endfor -%}

์šฐ์•„ํ•˜๊ณ /์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ jinja ํ…œํ”Œ๋ฆฟ์˜ for ๋ฃจํ”„์—์„œ ๋ณ€์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์กฐ์–ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์ „ํ˜€ ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค(๋˜๋Š” ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ). ๊ทธ๋ž˜์„œ ๋Œ€๋‹ต์€ ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ์ž๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Jinja๋Š” ์ด๋ฏธ ๋ฃจํ”„๋ฅผ ์—ด๊ฑฐํ•ฉ๋‹ˆ๋‹ค. {{ loop.index0 }}

@davidism ์กฐ๊ฑด์—

devnum, sensor ํŠœํ”Œ์„ ํ•„์š”ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ •ํ™•ํžˆ ์ƒ์„ฑํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” Python์—์„œ ๊ณ„์‚ฐํ•˜์—ฌ ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์•„๋ž˜์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋ณธ ๋‹ค๋ฅธ ๋ชจ๋“  ์˜ˆ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

@Molodax ๋‹น์‹ ์€

{{ states.sensor|selectattr('state', 'equalto', 'online')|sum }}

|count ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ?

๋„ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@mitsuhiko ,
์•„๋งˆ๋„ jinja2(ํ•„ํ„ฐ)๋Š” ( ํ™ˆ ์–ด์‹œ์Šคํ„ดํŠธ )๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ ์‚ฌํ•ญ์œผ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์— ๋‚ด๊ฐ€ ์ œ๊ณตํ•œ ์ฝ”๋“œ๋กœ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๋ฏผ.

์•ˆ๋…• ์—ฌ๋Ÿฌ๋ถ„. 2.8์—์„œ ์ž‘๋™ํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์š”์ฒญํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ ๋‚ด ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

{% set count = 0 %}
{% if 'anchors' in group_names %}
nameserver 127.0.0.1
{% set count = count+1 %}
{% endif %}
{% for resolver in resolvers %}
{% if count < 3 %}
{% if resolver|ipv6 and ansible_default_ipv6.address is defined %}
nameserver {{ resolver }}
{% set count = count+1 %}
{% elif resolver|ipv4 and ansible_default_ipv4.address is defined %}
nameserver {{ resolver }}
{% set count = count+1 %}
{% endif %}
{% endif %}
{% endfor %}

2๊ฐœ์˜ ๊ฐœ๋ณ„ ๋ฃจํ”„์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ "count" ๋ณ€์ˆ˜ ์—†์ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. 2.8๊ณผ 2.9์—์„œ ๋ชจ๋‘ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋Š” ์ œ์•ˆ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@davidism ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐœ์˜ ๋ชฉ๋ก์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

{% set list1 = name|default()|map(attribute="last")|select|list %}
{% set list2 = name|default()|map(attribute="age")|select|list %}

๊ทธ๋Ÿฐ ๋‹ค์Œ list3์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ list3์— ๊ณ ์œ (ansible ํ•„ํ„ฐ)์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋งˆ์ง€๋ง‰ 1-๋‚˜์ด 1
last2-age2
๋งˆ์ง€๋ง‰3์„ธ3์„ธ
๋งˆ์ง€๋ง‰ 4์„ธ 4์„ธ
๋งˆ์ง€๋ง‰ 5์„ธ 5์„ธ
๋งˆ์ง€๋ง‰ 6์„ธ 6์„ธ

๋‚ด๊ฐ€ ์ˆ˜์ง‘ํ•œ ์ง€๋„์—์„œ ์—ฌ๋Ÿฌ ์†์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. #554
๋‚˜๋Š” ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ†ตํ•ด jinja2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฏธ๋ฆฌ ํŒŒ์ด์ฌ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@pujan14 @aabdnn @Molodax ์ด ํŒจํ„ด์€ ๊ณต์‹ Ansible ๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ ์ž…๋‹ˆ๊นŒ , ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ƒ๊ฐํ•ด ๋ƒˆ๊ฑฐ๋‚˜ ์ฐพ์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์–ด๋Š ์ชฝ์ด๋“  Ansible์— ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Ansible์€ ์ œํ’ˆ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ๋” ๊ด€๋ จ์„ฑ ๋†’์€ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@davidism ์œ„์—์„œ ์ œ์‹œํ•œ ํ…œํ”Œ๋ฆฟ์€ Ansible ๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. Ansible์€ Jinja2๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ Jinja2 ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ์ด ํ…œํ”Œ๋ฆฟ์„ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๊ณ  ์ž‘๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋•์…˜์— ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Jinja2๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ณต์‹์ ์œผ๋กœ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์›๋ž˜๋Œ€๋กœ ๋‹ซ๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•˜์—ฌ Ansible์ด ๋” ๋งŽ์€ ๋„์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ง์”€๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@davidism ์ƒˆ๋กœ์šด jinja 2.9์—์„œ ๋ฃจํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค .
๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

{% for name in names %}
{% if loop.first %}
{% set list = "" %}
{% endif %}
{% if name.first is defined and name.last is defined and not name.disabled %}
{% set list = list + name.first|string + "-" + name.last|string %}
{% if loop.last %}
{% for item in list.split(' ')|unique %}
{{ item }}
{% endfor %}
{% else %}
{% set list = list + " " %}{% endif %}
{% endif %}
{% endfor %}

์ด๊ฒƒ์€ ์ด๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋‚ด ์ดํ•ด์— ๋”ฐ๋ฅด๋ฉด ๋ฒ”์œ„ ์ง€์ • ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2.8 ์ด์ƒ์—์„œ ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค.

import unittest
from jinja2 import Template

TEMPLATE1 = """{% set a = 1 %}{% for i in items %}{{a}},{% set a = a + 1 %}{% endfor %}"""

class TestTemplate(unittest.TestCase):

  def test_increment(self):
    items = xrange(1,10)
    expected='%s,' % ','.join([str(i) for i in items])
    t = Template(TEMPLATE1)
    result = t.render(items=items)
    self.assertEqual(expected,result)

unittest.main()

๋Œ€์‹  loop.index ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

loop ๊ฐœ์ฒด์˜ ์†์„ฑ์„ ํ†ตํ•ด ์ด์ „ ๋ฃจํ”„ ๊ฐ’์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ด์— ๋Œ€ํ•œ ์œ ์ผํ•œ ์ข‹์€ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๊ฐœ์ฒด๊ฐ€ ํ˜„์žฌ ๊ฐœ์ฒด์™€ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์ด ์Šค๋‹ˆํŽซ์„ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์‚ฌ์†Œํ•œ ํ•ญ๋ชฉ/์†์„ฑ ์•ก์„ธ์Šค ์ด์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— groupby๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :

{% set previous_date = none %}
{% for item in entries -%}
    {% set date = item.start_dt.astimezone(tz_object).date() %}
    {% if previous_date and previous_date != date -%}
        ...
    {% endif %}
    {% set previous_date = date %}
{%- endfor %}

๋„ค, ์•„์ด๋””์–ด ๊ฐ™์•„์š”.

๋ฃจํ”„ ๊ฐœ์ฒด์— set(key, value) ๋ฐ get(key) ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ์‚ฌ๋žŒ๋“ค์€ ๋ฃจํ”„์— ๊ฑธ์ณ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์ด๊ฒƒ์ด ํ•„์š”ํ•  ๋•Œ ์ถ”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  setdefault , pop ๋ฐ ๊ธฐํƒ€ dict-like ๋ฉ”์†Œ๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์ด๋ฏธ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

@davidism @ThiefMaster ์ €๋Š” ์ €์žฅ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด:

{% set ns = namespace() %}
{% set ns.value = 42 %}
...{% set ns.value = 23 %}

๋ถ„๋ช…ํžˆ set์€ ํ˜„์žฌ ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ด๊ฒƒ์€ ์‰ฝ๊ฒŒ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ž์ฒด์— ๋Œ€ํ•œ ์žฌํ• ๋‹น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ํ•˜๊ธฐ์— ๋งค์šฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ Py 2์˜ nonlocal ์™€ ๋™์ผํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฃจํ”„ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์ž๋™์œผ๋กœ loop.ns ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์‹ซ์–ดํ•˜๋Š” ๊ฒƒ์€ obj ๊ฐ€ namespace() ๊ฐ€ ์•„๋‹Œ {% set obj.attr = 42 %} ํ•˜๊ณ  ์‹ถ์€ ์œ ํ˜น์„ ๋Š๋‚€๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. .

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด previtem / nextitem / changed() ๊ฐ€ ์ƒˆ ๊ฐœ์ฒด๋ฅผ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” "์†Œ์Œ" ์—†์ด "๊ฐ„๋‹จํ•œ" ๊ฒฝ์šฐ๋ฅผ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ปค๋ฒ„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋”๋ผ๋„ ํฅ๋ฏธ๋กœ์šด ์•„์ด๋””์–ด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค

@ThiefMaster ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ๋ณด๋Š” ๋ฐฉ์‹์€ ์†์„ฑ ํ• ๋‹น์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ˆ˜์ •๋งŒ ํ—ˆ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ฝœ๋ฐฑ์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌ๋œ ๊ฐœ์ฒด์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค๋Š” ํ…œํ”Œ๋ฆฟ์˜ ์œ„ํ—˜์ด ์ตœ์†Œํ•œ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ์‚ฌ๋žŒ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์กฐ์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค...

{% macro do_stuff(ns) %}
    {% set ns.foo %}bar{% endset %}
    {% set ns.bar %}foobar{% endset %}
{% endmacro %}

{% set ns = namespace() %}
{{ do_stuff(ns) }}

์‹ค์ œ๋กœ {% namespace ns %} ์™€ ๊ฐ™์€ ์ƒˆ ๋ธ”๋ก์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋ณด๋‹ค ํ•˜๋‚˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. namespace ๋ผ๋Š” ๋ณ€์ˆ˜๋Š” ํ…œํ”Œ๋ฆฟ์— ์ „๋‹ฌ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ๋ฐ˜๋ฉด ๊ทธ๊ฒƒ์€ ์•„๋งˆ๋„ ๋‹น์‹ ์ด ๊ทธ ํ…œํ”Œ๋ฆฟ์—์„œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํŒŒ์ด์ฌ์—์„œ ๋นŒํŠธ์ธ์„ ์„€๋„์ž‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ) ์•ฝ๊ฐ„ ๋”๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค...

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด 2.9.6์˜ previtem/nextitem์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ?
๋‚ด saltstack ํ…œํ”Œ๋ฆฟ ์ค‘ ์ผ๋ถ€๊ฐ€ ์ง€๊ธˆ ์†์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๋‹ค์–‘ํ•œ ์ •๋„๋กœ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ํ˜„์žฌ ํ•˜๊ณ  ์žˆ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ˆ, 2.9๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์ง€์›๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋ฐฉ๊ธˆ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด์ „ ํ–‰๋™์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™ํ–ˆ์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๊ณ  ์ง€์›๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ๋ฆด๋ฆฌ์Šค(๋‘ ๋ฒˆ์งธ ์ˆซ์ž ๋ณ€๊ฒฝ)์—์„œ ๋ฐœ์ƒํ–ˆ์œผ๋ฉฐ, ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด์ „ ๋™์ž‘์— ๊ณ„์† ์˜์กดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฆด๋ฆฌ์Šค๋  ๋•Œ๊นŒ์ง€ ๋ฒ„์ „์„ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋งํ•ด์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ์„ ๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ž ๊ธ‰๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ณ ๋ ค ์ค‘์ธ ์ˆ˜์ • ์‚ฌํ•ญ์€ #676 ๋ฐ #684๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰