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 ïŒ
çŸåšã®åäœã¯æ£ãããããŸããããå€ãåäœãééããªãæ£ãããããŸããã {% 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
ã䜿çšãããŠããªããšä»®å®ããå Žåã®Pythonã®ã¹ã³ãŒãã«äŒŒãŠãããããããŸããïŒïŒ ã€ãŸããå€éšã¹ã³ãŒãã§å®çŸ©ããããã®ããªãŒããŒã©ã€ãããããšã¯èš±å¯ããŸãããïŒã€ãŸããéã«ãã¯ããããå ŽåïŒãä»ã®ã¹ã³ãŒãã§ãªãŒããŒã©ã€ãããããšã¯èš±å¯ããŸããïŒ
ã©ãããããããã³ãã¬ãŒãã¢ãµãŒã·ã§ã³ãšã©ãŒã§ãã£ããããŠã³ãããåã«ïŒ
>>> 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ããã³https://github.com/MinchinWeb/seafoam/commit/89d555dbd6a2f256471d43e4184f09512694e5ãåç §ïŒããã§ãªããã°ç§ãã§ããã®ã§ã¯ãªãããšçãã æ¯èŒãã€ã³ã©ã€ã³ã§è¡ãããããã«ãªã£ããããæ°ããã³ãŒãã远跡ããã®ã¯å°é£ã§ãã ããšãã°ãç§ã®å€ãã³ãŒãïŒ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
ïŒ ãã³ã³ããã¹ããã¯ããã®ã³ã³ããã¹ãã§ã¯ããªãæ··ä¹±ããŠããããã«èãããŸãïŒãããã¯æå³ãããŠããŸããïŒ
.....ãããŠä»ãç§ã¯ãã§ã«èª°ãã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
ã¡ãœããã奜ãã§ãã
è¿œå ã®ããŒã¿ãã€ã³ããšããŠãçæãããHTMLã«ç¹å¥ãªã¯ã©ã¹ãæ¿å
¥ããå¿
èŠãããå Žåã«ãããã¯ç§ã®è¶³ã«èœã¡ãŸããããç¹å®ã®ããããã£ãèšå®ãããŠããªãå埩ãªã¹ãã®æåã®èŠçŽ ã«å¯ŸããŠã®ã¿ã§ãã å埩ããŒã¿ãå€æŽã§ããŸããã loop.first
ïŒå¥œããªã ãïŒãæåŸã®èŠçŽ ã®äœããšæ¯èŒããŠãããã§å¿
èŠãªããšã確å®ã«å®è¡ããããšã¯ã§ããŸãããããã«ãããå®å
šã«æ©èœããéªæªãªæ§é ãå®éšããããšã«ãªããŸããã ïŒãããŠããããå®éã«ãã°ãæªçšããŠããã®ãã©ããã¯ç§ã«ã¯ããããŸããã§ããïŒã
ããã«ããµãŒãããŒãã£ã®ãã©ã°ã€ã³ãä»ããŠæ¡åŒµæ©èœãæäŸããŠããŸãããäœæè ããã³ãã¬ãŒããã©ã®ããã«æ§æããããç£èŠããæ¹æ³ããªããããJinja2.9以éã«æŽæ°ããåŸã«ãšã³ããŠãŒã¶ãŒãçªç¶ç ŽæããŸãã äœæè ã«ãã³ãã¬ãŒããæŽæ°ãããæ¹æ³ãèŠã€ãããŸã§ãïŒããŒãžã§ã³ç®¡çã¹ããŒã ã§çŽæãããŠããããã«ïŒäžäœäºææ§ãç¶æããããã«ãããã°ã©ã ã«ææ°ã®2.8ããŒãžã§ã³ãåºå®ããŸããã
誰ãããªãjinja2ã¹ã³ãŒããPythonãšãŸã£ããåãããã«æ©èœããªãã®ããæ確ã«ããŠããã ããŸãããïŒ ã€ãŸããjinja2ãã³ãã¬ãŒãã¯pythonã¢ãžã¥ãŒã«ã«å¯Ÿå¿ãããã¯ãã¯é¢æ°ã«å¯Ÿå¿ãïŒãããŠç¬èªã®ã¹ã³ãŒããæã¡ãŸãïŒãforã«ãŒãã¯ç¬èªã®ã¹ã³ãŒããæã¡ãŸããã @mitsuhikoã«ãããšãjinja 2.8以äžã«ã¯ã¹ã³ãŒãã®ãã°ããããããããŸããããã¹ã³ãŒããã©ã®ããã«æ©èœããããç解ããæ¹ãçŽæçã§ããã
Pythonããã°ã©ããŒã«ãšã£ãŠãæåã®æçš¿ïŒJinja 2.8ïŒããã®åäœã¯æããã§ãã åãããšãhttps://github.com/pallets/jinja/issues/660ã«ãåœãŠã¯ãŸã
ãããã¯ãæšæž¬ããå¿ èŠããªãããã«ãjinjaã§ã®ã¹ã³ãŒããã©ã®ããã«æ©èœãããã説æããããã¥ã¡ã³ããå¿ èŠã§ãã
ãŸããç§ã®ã³ã¡ã³ããåŠå®çã«åãåããªãã§ãã ãããç§ã¯jinjaã«ãšãŠãæè¬ããŠããŸãã
@roganovããã«é¢ããããã€ãã®ã¡ã¢ïŒ
誰ãããªãjinja2ã¹ã³ãŒããPythonã®ããã«æ£ç¢ºã«æ©èœããªãã®ããæ確ã«ããŠãã ãã
ç§ã®æèŠã§ã¯ã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
ãå¿
èŠãªãšãã«Python2ã§äœ¿çšããåé¿çãšåãããã«...
ç§ã¯å®å šã«åæããŸãããã ãããããã«ããããšãææããŸãã ãããŠãAlexãææããããã«ããããã®åé¡ã®å€ãã¯ããã£ã«ã¿ãŒã䜿çšããããPythonã«ããžãã¯ã®äžéšãé 眮ããããšã§æžãçŽãããšãã§ããŸãã
å¥ã®ïŒéãïŒããã¯ã¯ããªã¹ããè¿œå ãããã³ãããã䜿çšããããšã§ãïŒ http ïŒ
ããã«ã¡ã¯ãç§ã¯ãã®ã³ãŒããçŽ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ã€ã®å¥ã ã®ã«ãŒãã§åç §ã§ããã°ããŒãã«ãªãã«ãŠã³ããå€æ°ãªãã§ãããè¡ãæ¹æ³ãããããŸããã ããã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ã«uniqueïŒansible filterïŒãé©çšããŸãã
last1-age1
last2-age2
last3-age3
last4-age4
last5-age5
last6-age6
ç§ãåéãããã®ããããããã¯è€æ°ã®å±æ§ã§æ©èœããŸããïŒ554
ç§ã¯ansibleçµç±ã§jinja2ã䜿çšããŠããã®ã§ãäºåã«pythonã§äœããè¿œå ããããšã¯ç§ã«ãšã£ãŠè¯ãèãã§ã¯ãããŸããã
@ pujan14 @aabdnn @Molodaxãã®ãã¿ãŒã³ã¯ãAnsibleã®å ¬åŒããã¥ã¡ã³ãããã®ãã®ã§ããããããšãä»ã®å Žæã§æãã€ãããã®ã§ããããããšãèŠã€ãããã®ã§ããïŒ ãããã«ãããAnsibleã¯è£œåã®äœ¿çšæ¹æ³ãç解ããŠãããããé©åãªãœãªã¥ãŒã·ã§ã³ãèãåºãããšãã§ããããããããAnsibleã«å ±åããæ¹ãç°¡åãªå ŽåããããŸãã
@davidismäžèšã§æ瀺ãããã³ãã¬ãŒãã¯ãAnsibleã®ããã¥ã¡ã³ãããã®ãã®ã§ã¯ãããŸããã Ansibleã¯Jinja2ãå ·äœçã«ææžåããŠããŸããã Jinja2ã®ããã¥ã¡ã³ããèªãã§ãã®ãã³ãã¬ãŒããèªåã§äœæãããšãããæ©èœããã®ã§ãæ¬çªç°å¢ã«ç§»è¡ããŸããã Jinja2ãå€æ°ãã°ããŒãã«ã«ãããšæããŸããã
å ¬åŒã«ææžåãããŠããªãå Žåã¯ãå ã ã®ããã«ãããéããåŸåããããŸãã Ansibleããã®ç¹ã§ããªãããã£ãšå©ããããšãã§ãããããããªãããšãç¹°ãè¿ããŸãã
@davidismæ°ããããã£ãŠã¿ãŸããã
ãããäŸã§ãã
{% 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)
ã¡ãœãããšset(key, value)
ã©ãã§ããïŒ ããããã°ã人ã
ã¯ã«ãŒãå
šäœã§å¥œããªãã®ãä¿åã§ããŸãã
åãèããæã£ãŠããŸãããããããå¿
èŠãšãªãéãã±ãŒã¹ãèŠã€ããããšãã§ããŸããã§ããã ãããŠãç§ã¯ãã§ã«èª°ããsetdefault
ã pop
ããã³ä»ã®dictã®ãããªæ¹æ³ãæ±ããŠããã®ãèŠãããšãã§ããŸããã
@ davidism @ ThiefMasterç§ã¯ã¹ãã¬ãŒãžãªããžã§ã¯ããå©çšã§ããããã«ããããšãèããŠããŸããã ãã®ãããªïŒ
{% set ns = namespace() %}
{% set ns.value = 42 %}
...{% set ns.value = 23 %}
æããã«ãçŸæç¹ã§ã¯setã¯å±æ§ãèšå®ã§ããŸããããããã¯ç°¡åã«æ¡åŒµã§ããŸãã åå空éèªäœãžã®åå²ãåœãŠã¯çºçããªããããããã¯éåžžã«å®å šã«å®è£ ã§ããŸãã
ç§ã«ã¯åé¡ãªãããã§ããããã¯ãPy 2ã®nonlocal
ãšåããœãªã¥ãŒã·ã§ã³ã§ãããŸãã¯ãã«ãŒãå€ã§ã¯äœ¿çšã§ããŸãããã loop.ns
èªåçã«èšå®ããŸãã
ç§ãåå空éã§å«ããªã®ã¯ã {% set obj.attr = 42 %}
ããããããªãããšã§ãã obj
ã¯namespace()
ã¯ãªããã®ã§ã-ç§ãæãã«ããŸããããªãããšã§ãã
ããã§ãªããã°ã 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
ãšããååã®å€æ°ã¯ããã³ãã¬ãŒãã«æž¡ãããå¯èœæ§ãéåžžã«äœãããã«ã¯èãããŸããããããããããã®ãã³ãã¬ãŒãã§åå空éæ©èœã䜿çšã§ããªãããã«ããã ãã§ãïŒPythonã®çµã¿èŸŒã¿ãã·ã£ããŠã€ã³ã°ããã®ãšåãããã«ïŒãå°ãæ±ãæããããŸã...
ãã®åé¡ã®åé¿çã¯ãããŸããããããšã2.9.6ã®previtem / nextitemãåŸ
ã€å¿
èŠããããŸããïŒ
ç§ã®saltstackãã³ãã¬ãŒãã®ããã€ããå£ããŠããŸãã
äžèšã®ããŸããŸãªçšåºŠã§ç€ºãããŠããããã«ãããªãã¯ããªããããŠããããšãããå¿ èŠãããªããããããŸããã ãã以å€ã®å Žåã¯ãã¯ãã2.9ã䜿çšããå Žåã¯åŸ ã€å¿ èŠããããŸãã 以åã¯ãµããŒããããŠããŸããã§ããããããŸããŸæ©èœããŠããŸããã
以åã®åäœã«æ»ãããšã¯ãããŸããã åçŽãªã±ãŒã¹ã§ã¯æ©èœããŸããããæ£ãããªãããµããŒããããŠãããšææžåãããŠããŸããã§ããã ããã¯é倧ãªå€æŽã§ãããšç解ããŠããŸãããæ©èœãªãªãŒã¹ïŒ2çªç®ã®çªå·ã®å€æŽïŒã§çºçããŸãããããã¯ãç§ãã¡ãåžžã«ãããã®å€æŽã管çããŠããæ¹æ³ã§ãã å€ãåäœã«äŸåãç¶ããå¿ èŠãããå Žåã¯ãä¿®æ£ããªãªãŒã¹ããããŸã§ããŒãžã§ã³ãåºå®ããŸãã
èšããªããã°ãªããªãããšã¯ãã¹ãŠèšãããŠããã®ã§ããããããã¯ããŸãã çŸåšæ€èšäžã®ä¿®æ£ã«ã€ããŠã¯ãïŒ676ããã³ïŒ684ãåç §ããŠãã ããã
æãåèã«ãªãã³ã¡ã³ã
changed_from_last
ã¯è¯ãããã§ã-å°ãªããšãæ©èœçã«ã¯ãååèªäœã¯å°ãåä»ãªIMOã§ãã ãã¶ãchanged
ã ãã§ååã¯ãªã¢ã§ããããïŒæåã®èŠçŽ ã¯ããããäœã§ãããåžžã«ãå€æŽãããããšèŠãªããããšæããŸããïŒ ãã®æ¯ãèãã誰ãã«ãšã£ãŠåé¡ãããå Žåããšã«ãã圌ãã¯ãã€ã§ã
not loop.first
ãã§ãã¯ãè¿œå ããããšãã§ããŸãã