cookiecutter 1.7.3模板中未定义变量如何设置默认值?
你之前的两种方案仅在最后一级属性(即login)未定义时生效,若中间层级(cookiecutter.github_repo、cookiecutter.github_repo.owner)任意一层不存在,Jinja会在访问中间层时直接抛出未定义错误,不会执行到后续的default过滤器或or运算。
可行解决方案
方案1:逐层添加默认过滤器
给每一层嵌套属性都搭配default过滤器,中间层不存在时默认返回空字典,避免访问时报错:
"github_username": "{{ (cookiecutter.github_repo|default({})).owner|default({}).login|default('Your GitHub username here', true) }}"
方案2:使用条件判断校验层级
如果需要更高的可读性,可以用Jinja条件判断逐层级校验变量存在性:
"github_username": "{% if cookiecutter.github_repo is defined and cookiecutter.github_repo.owner is defined and cookiecutter.github_repo.owner.login is defined %}{{ cookiecutter.github_repo.owner.login }}{% else %}Your GitHub username here{% endif %}"
方案3:全局修改Jinja未定义变量策略
如果模板内有大量类似的嵌套变量需要处理,可以在cookiecutter.json同级目录新增cookiecutter.yaml配置文件,修改Jinja的未定义变量处理策略:
undefined: "jinja2.Undefined"
配置完成后,你最开始尝试的default过滤器、or运算写法都可以正常生效,不会再抛出未定义错误。
内容的提问来源于stack exchange,提问作者Kim Stacks
相关产品推荐
相关产品推荐

