为什么“default( None )”并不总是显示为“None”

cue*_*dee 6 jinja2 ansible

是否有逻辑推理可以解释为什么debug下面的 Ansible 剧本中的两个任务分别输出"NONE""FALSE"而不是两者都输出"NONE"

- hosts:  'all'

  tasks:

    - debug:
        msg: '{{ foo | default( None ) | ternary( "TRUE", "FALSE", "NONE" ) }}'

    - debug:
        msg: '{{ bar | ternary( "TRUE", "FALSE", "NONE" ) }}'

  vars:

    bar: '{{ foo | default( None ) }}'
Run Code Online (Sandbox Code Playgroud)

ansible@2.8.5顺便说一句,我观察到了这一点


[编辑@2019-10-16]

从 @VladimirBotka 的回答推断,人们可以说真正的“问题”是相None对于替换而言不具有传递性。我的使用default(...)不必要地使事情复杂化,该示例可以简化为:

- hosts: 'all'
  tasks:
    - debug:
        msg: '{{ None | ternary( "TRUE", "FALSE", "NONE" ) }}'

    - debug:
        msg: '{{ bar | ternary( "TRUE", "FALSE", "NONE" ) }}'

  vars:
    bar: '{{ None }}'
Run Code Online (Sandbox Code Playgroud)

...并且仍然产生完全相同的输出。

Vla*_*tka 2

  • foo|default(None)评估为null
  • {{ foo|default(None) }}计算结果为空字符串""

任务

- debug:
    msg: bar is empty string
  when: bar|length == 0
Run Code Online (Sandbox Code Playgroud)

给出

"msg": "bar is empty string"
Run Code Online (Sandbox Code Playgroud)

但任务

- debug:
    msg: foo is empty string
  when: foo|default(None)|length == 0
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

"... object of type 'NoneType' has no len() ... "
Run Code Online (Sandbox Code Playgroud)

因此,在三元中,空字符串将选择FALSE,而null将选择NONE


笔记

1) 参见省略参数中的注释

2)如果省略第三个参数,则三元中的null空字符串和空字符串都""选择FALSE 。任务

   - debug:
        msg: "{{ bar|ternary('TRUE', 'FALSE') }}"
    - debug:
        msg: "{{ foo|default(None)|ternary('TRUE', 'FALSE') }}"
Run Code Online (Sandbox Code Playgroud)

"msg": "FALSE"
"msg": "FALSE"
Run Code Online (Sandbox Code Playgroud)