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
ํ์ฌ ๋์์ด ์ฌ๋ฐ๋ฅด์ง ์์ง๋ง ์ด์ ๋์๋ ํ์คํ ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค. {% 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 -%}
—
{%- 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)) %}
—
{% 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 -%}
—
{%- 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 %}
—
{% 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๋ฅผ ์ฐธ์กฐํ์ธ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
changed_from_last
์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ด๋ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์ด๋ฆ ์์ฒด๊ฐ ์ฝ๊ฐ ์ด์ํ IMO์ ๋๋ค.changed
๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๋ช ํํ ๊น์?์ฒซ ๋ฒ์งธ ์์๋ ๊ทธ๊ฒ์ด ๋ฌด์์ด๋ ์๊ด์์ด ํญ์ "๋ณ๊ฒฝ๋" ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๊น? ๊ทธ ํ๋์ด ๋๊ตฐ๊ฐ์๊ฒ ์ข์ง ์๋ค๋ฉด ๊ทธ๋ค์ ํญ์
not loop.first
์ฒดํฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.