Jinja: "items" μš”μ†Œκ°€ μžˆλŠ” 객체λ₯Ό λ°˜λ³΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 01μ›” 09일  Β·  10μ½”λ©˜νŠΈ  Β·  좜처: pallets/jinja

μ„œλ²„κ°€ λ‹€μŒ JSON을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
{
"ν•­λͺ©": [1,2,3]
...
}

'items'λ₯Ό λ°˜λ³΅ν•˜λ €λŠ” μ‹œλ„λŠ” λ‹€μŒμ„ μƒμ„±ν•©λ‹ˆλ‹€.
{data.items %의 el에 λŒ€ν•œ %}
....
TypeError: 'builtin_function_or_method' 개체λ₯Ό λ°˜λ³΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μœ„λŠ” Python dict에 λ‚΄μž₯ ν•¨μˆ˜ "items()"κ°€ 있기 λ•Œλ¬Έμ— λ°œμƒν•©λ‹ˆλ‹€.

μž„μ‹œλ‘œ. 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ JSON μ‘λ‹΅μ—μ„œ 후크λ₯Ό μ„€μΉ˜ν•˜κ³  ν‚€ 이름을 "items"μ—μ„œ "__items"둜 λ³€κ²½ν•œ λ‹€μŒ 이λ₯Ό Jinja2에 μ „λ‹¬ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έ μ‹œμ μ—μ„œ λ‚˜λŠ” 이름이 바뀐 속성을 λ°˜λ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
{data.__items %의 el에 λŒ€ν•œ %}

μ΄μƒμ μœΌλ‘œ, Jinja2λŠ” function() ν‘œκΈ°λ²•μœΌλ‘œ νŠΉλ³„νžˆ ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ” ν•œ for-loop λ˜λŠ” if-statement의 λ‚΄μž₯ ν•¨μˆ˜λ₯Ό λ¬΄μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

{% for el in data['items'] %} λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•­λͺ©μ˜ μš°μ„  μˆœμœ„λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ¬Έμ„œμ—μ„œλ„ λ‹€λ£Ήλ‹ˆλ‹€. http://jinja.pocoo.org/docs/2.9/templates/#variables

λͺ¨λ“  10 λŒ“κΈ€

{% for el in data['items'] %} λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•­λͺ©μ˜ μš°μ„  μˆœμœ„λ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ¬Έμ„œμ—μ„œλ„ λ‹€λ£Ήλ‹ˆλ‹€. http://jinja.pocoo.org/docs/2.9/templates/#variables

JSON 응닡에 λ•Œλ•Œλ‘œ 'items'κ°€ ν¬ν•¨λ˜μ§€ μ•ŠμœΌλ©΄ μ‹€νŒ¨ν•©λ‹ˆλ‹€(μ‘λ‹΅μ˜ 선택적 속성이라고 κ°€μ •). 이 경우 {% for el in data['items'] %}도 λ‹€μŒμ„ μƒμ„±ν•©λ‹ˆλ‹€.
TypeError: 'builtin_function_or_method' 개체λ₯Ό λ°˜λ³΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

...ν•­λͺ©μ΄ 항상 μ •μ˜λ˜κΈ° λ•Œλ¬Έμ—(λ‚΄μž₯ ν•¨μˆ˜λ‘œ).

그리고 이것은 λ²„κ·Έμž…λ‹ˆλ‹€, IMO. data['items']λŠ” λ‚΄μž₯ ν•¨μˆ˜μ™€ μΆ©λŒν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. 즉, 선택적 "items" 속성을 κΉ”λ”ν•˜κ²Œ λ°˜λ³΅ν•˜λ €λ©΄ 이름을 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” 그렇지 μ•ŠμŠ΅λ‹ˆλ‹€.

JSON 응닡에 ν•­λͺ©μ΄ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? 여기에 λ¬Έμ œκ°€ μžˆλŠ”μ§€ μ™„μ „νžˆ ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 데이터가 무엇인지 미리 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€. ν…œν”Œλ¦Ώμ—μ„œ 이미 사전에 in μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ ν‚€λ₯Ό 확인할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이 속성/ν•­λͺ© 지원을 μ œκ±°ν•˜λ©΄ 수천 개의 ν…œν”Œλ¦Ώμ΄ μ†μƒλ˜κΈ° λ•Œλ¬Έμ— 이 λ™μž‘μ„ λ³€κ²½ν•˜λŠ” 것은 μ „ν˜€ λ¬Έμ œκ°€ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

더 μ—„κ²©ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ 아무 것도 μ‚­μ œν•˜μ§€ 말 것을 μ œμ•ˆν•©λ‹ˆλ‹€.

μ˜€λŠ˜λ‚ μ˜ λ¬Έμ œλŠ” λͺ…μ‹œμ  쑰회 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•  λ•Œ data['items'] λ‚΄μž₯ 사전 ν•¨μˆ˜λ₯Ό λ°œκ²¬ν•˜μ§€λ§Œ 발견 ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€λŠ” 것 μž…λ‹ˆλ‹€. νŒŒμ΄μ¬μ€ 그것을 ν•˜μ§€ μ•ŠμœΌλ©°, μ§„μžλ„ ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. λ‚΄μž₯(λ˜λŠ” ν•΄λ‹Ή λ¬Έμ œμ— λŒ€ν•œ ν•¨μˆ˜)을 ν˜ΈμΆœν•΄μ•Ό ν•˜λŠ” 경우 호좜 ν‘œκΈ°λ²•μ΄ μžˆμŠ΅λ‹ˆλ‹€. data.items()

νŠΉλ³„ν•œ 경우 dict.items 맀우 λͺ…ν™•ν•œμ§€ ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 특히 μ‚¬μš©μž μ •μ˜ dict-like μœ ν˜• λ˜λŠ” μ•„λ§ˆλ„ OrderedDict λŒ€ν•΄μ„œλŠ” μ—¬μ „νžˆ μ‹€νŒ¨ν•  것이기 λ•Œλ¬Έμ— 특히 κ·Έλ ‡μŠ΅λ‹ˆλ‹€. 그런 κ²½μš°μ—λŠ” foo['items'] 둜 ν•˜λŠ” 것이 μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. μ•„μ£Ό μ˜ˆμ˜μ§€λŠ” μ•Šμ§€λ§Œ μΌκ΄€λœ ν–‰λ™μž…λ‹ˆλ‹€.

μœ μΌν•˜κ²Œ κ°€λŠ₯ν•œ "μˆ˜μ • / ν•΄ν‚Ή"λ‚˜λŠ” 일반 속성 (예λ₯Όν•˜μ§€ ν•¨μˆ˜ 호좜이) λ°˜λ³΅μ—μ„œ μ‚¬μš© μ—¬λΆ€λ₯Ό ν™•μΈν•˜κ³  당신이 반볡 κ°€λŠ₯ν•˜μ§€λ§Œ, ν˜ΈμΆœν•˜μ§€ 무언가λ₯Ό λ°˜λ³΅ν•˜λ €κ³ ν•˜λŠ” 더 쒋은 방법이λ₯Ό hancle을 상상할 수 . 이 경우 ν•­λͺ©μ„ μ‹œλ„ν•˜λ©΄ κΈ°μ‘΄ μ½”λ“œκ°€ 손상될 κ°€λŠ₯성이 거의 μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Jinjaμ—μ„œ μ΄λŸ¬ν•œ λ™μž‘μ„ κ΅¬ν˜„ν•˜λŠ” 것은 μ•„λ§ˆλ„ 맀우 끔찍할 κ²ƒμž…λ‹ˆλ‹€. ;)

μ™œ 이것이 νŠΉλ³„ν•œ κ²½μš°μž…λ‹ˆκΉŒ? μ €λŠ” Jinjaκ°€ Pythonκ³Ό λ˜‘κ°™μ΄ ν–‰λ™ν•˜κΈ°λ₯Ό μš”μ²­ν•©λ‹ˆλ‹€. 특히 foo['items']λŠ” μ‚¬μš©μžκ°€ μ‚½μž…ν•œ ν‚€ "items"κ°€ μ—†λŠ” 경우 None을 λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ˜€λŠ˜λ‚  JinjaλŠ” 같은 μ΄λ¦„μ˜ λ‚΄μž₯ ν•¨μˆ˜λ₯Ό μ°ΎλŠ” κ²ƒμœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€. λ”°λΌμ„œ λ‹¨μˆœνžˆ Python이 ν•˜λŠ” λŒ€λ‘œ ν•˜μ‹­μ‹œμ˜€.

>>> print {}.get('items')
None

Btw, λ˜ν•œ "()"λ₯Ό μ‚¬μš©ν•˜μ—¬ 호좜 κ°€λŠ₯ ν•­λͺ©μ„ ν˜ΈμΆœν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λŒ€μ²΄ ν‘œκΈ°λ²• "foo.items"도 잘 μ²˜λ¦¬λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν‚€λ₯Ό λˆ„λ₯΄κ±°λ‚˜ μžλ™μœΌλ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 그건 λ„ˆλ¬΄ λ‚˜μœ 것 κ°™μ•„μš”.

['x'] 및 .x λŒ€ν•œ Jinja λ…Όλ¦¬λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • item/attr(Pythonμ—μ„œ ꡬ문이 무엇이든 μƒκ΄€μ—†μŒ)이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κ³ , κ·Έλ ‡λ‹€λ©΄ 이λ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.
  • attr/item(Pythonμ—μ„œ ꡬ문이 μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ˜ "λ°˜λŒ€")이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κ³ , κ·Έλ ‡λ‹€λ©΄ ν•΄λ‹Ή ν•­λͺ©μ„ μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.
  • λ‘˜ λ‹€ μ—†μœΌλ©΄ μ‹€νŒ¨

λ”°λΌμ„œ x.items λŠ” 속성을 ν™•μΈν•˜κ³  속성이 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 λ…Όλ¦¬λŠ” λŒ€νšŒμ— 상관없이 μ΄λ ‡κ²Œ μž‘λ™ν•©λ‹ˆλ‹€. 이λ₯Ό κ°œμ„ ν•˜λ €λ©΄ μ»¨ν…μŠ€νŠΈμ— 따라 속성 쑰회 논리λ₯Ό λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그런 λ‹€μŒμ—λ„ μž‘λ™ν•˜λŠ” λ‹€μŒ μ½”λ“œμ™€ 같은 μ–΄μƒ‰ν•œ 상황이 λ°œμƒν•©λ‹ˆλ‹€.

{% for x in mydict.items %}

vs μž‘λ™ν•˜μ§€ μ•ŠλŠ” 이 μ½”λ“œ

{% set items = mydict.items %}
{% for x in items %}

그리고 이 κ²½μš°μ— νŠΉλ³„ν•œ 처리λ₯Ό μœ μ§€ν•˜λŠ” 것은 λ³€μˆ˜κ°€ μ–΄λ””μ—μ„œ μ™”λŠ”μ§€ μΆ”μ ν•˜μ§€ μ•Šκ³ λŠ” λΆˆκ°€λŠ₯ν•  κ²ƒμž…λ‹ˆλ‹€.

@slisznia 당신은 본질적으둜 이 μ‹œμ μ—μ„œ μ•½ 7λ…„ λ™μ•ˆ μ œμžλ¦¬μ— μžˆμ—ˆλ˜ 속성 쑰회 μ‹œμŠ€ν…œμ„ μ™„μ „νžˆ λ³€κ²½ν•˜κΈ° μœ„ν•΄ Jinja2λ₯Ό μš”μ²­ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ•„, λ‚˜λŠ” foo['bar'] 속성 쑰회λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ œμ•ˆμ‘°μ°¨ 보지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 그것은 ν™•μ‹€νžˆ λ‚˜μœ μƒκ°μž…λ‹ˆλ‹€! λ‹¨μˆœνžˆ for item in data.get('items', []) λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 무슨 λ¬Έμ œμž…λ‹ˆκΉŒ?

@ThiefMaster mydict.get('items', []) λŠ” λ¬Όλ‘  μž‘λ™ν•˜λ©° ν‚€ 이름을 λ°”κΎΈλŠ” 것보닀 λ‹€λ₯Έ 방법을 지적해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰