完整指南:True/False 交互输入与模板条件渲染)
Cookiecutter 布尔变量Boolean Variables完整指南True/False 交互输入与模板条件渲染【免费下载链接】cookiecutterA cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects.项目地址: https://gitcode.com/gh_mirrors/co/cookiecutter导读本文深入解析 Cookiecutter 中的布尔变量Boolean Variables从cookiecutter.json中的true/false定义到交互式run_as_docker [True]:提问再到 Jinja2 条件渲染与输入校验完整覆盖布尔变量从配置到渲染的全生命周期。读完本文你将能够为模板设计可交互的开关型选项如是否初始化 Git是否生成 Docker 配置并理解其底层解析逻辑与测试依据。该特性自 Cookiecutter 2.2.0 引入属于 高级用法文档 中的核心章节之一原文位于 docs/advanced/boolean_variables.rst。什么是布尔变量布尔变量是 Cookiecutter 中用于回答True/False是/否问题的变量类型。它与普通变量一样是键值对但区别在于其值只能是true或falseJSON 布尔字面量而不是字符串或列表。从源码结构看prompt_for_config在遍历cookiecutter.json上下文时会按值的类型分派不同的处理函数cookiecutter/prompt.py 的prompt_for_config值为list→ 选择变量Choice Variables走prompt_choice_for_config值为bool→布尔变量走read_user_yes_no值为其他非dict类型 → 普通变量走read_user_variable值为dict→ 字典变量第二轮处理这一类型分派逻辑意味着只要把cookiecutter.json中某个键的值写成 JSON 的true/falseCookiecutter 就会自动按布尔变量方式提问并解析无需任何额外声明。基础用法在 cookiecutter.json 中定义假设你的模板根目录下有一个 cookiecutter.json 文件在其中添加一个布尔变量{ run_as_docker: true }运行时Cookiecutter 会根据该默认值生成如下交互提示run_as_docker [True]:中括号内的True是默认值来自cookiecutter.json中定义的true直接按回车不输入即采用默认值True输入合法值并回车后会将其解析为对应的布尔结果。合法输入值一览用户输入由 cookiecutter/prompt.py 中的read_user_yes_no函数解析其核心是YesNoPrompt类中定义的两组白名单源码中yes_choices与no_choices同时也在函数 docstring 中声明解析结果合法输入值True是1、true、t、yes、y、onFalse否0、false、f、no、n、off解析过程做了两点处理见YesNoPrompt.process_response去空白并转小写value.strip().lower()因此 YES 、True、On等大小写混合、带空格的输入同样合法精确白名单匹配命中yes_choices返回True命中no_choices返回False均未命中则抛出InvalidResponse触发重问详见下文输入校验。布尔字符串也适用于命令行覆盖当你通过--overwrite-context或extra_context以字符串形式覆盖布尔变量时同样会被转换为布尔值。tests/test_generate_context.py 中的test_apply_overwrites_overwrite_value_as_boolean_string参数化测试逐一验证了yes_choices/no_choices中的每个字符串都能被正确转换非法字符串如invalid则会抛出ValueError对应 cookiecutter/generate.py 中apply_overwrites_to_context对布尔变量的字符串转布尔分支。在模板中使用布尔变量定义后布尔变量会以cookiecutter.run_as_docker的形式注入模板上下文可在任意 Jinja2 模板文件中配合条件表达式使用{%- if cookiecutter.run_as_docker -%} # In case of True add your content here {%- else -%} # In case of False add your content here {% endif %}Cookiecutter 借助 Jinja2 的if条件表达式判断run_as_docker的取值从而决定渲染哪一段内容。注意凡是布尔值在 Jinja2 条件判断中True为真、False为假因此也可以直接简写为{% if cookiecutter.run_as_docker %} Docker-related config: - image: python:3.12 {% endif %}与 选择变量 用比较字符串不同布尔变量直接用其真值参与条件判断即可这是两者在模板中最大的使用差异。更复杂的条件组合示例布尔变量可以与and/or/not组合出多条件逻辑也可以在文件级条件中配合使用。仓库测试模板 tests/test-generate-files/input{{cookiecutter.food}}/simple-with-conditions.txt 展示了先判上下文再判具体变量的嵌套写法{% if cookiecutter %} {% if cookiecutter.food %} I eat {{ cookiecutter.food }} {% endif %} {% endif %}对于布尔变量常见实战组合包括{% if cookiecutter.use_docker and cookiecutter.use_compose %} # 同时启用 Docker 与 Compose 时才渲染 {% endif %}输入校验当用户输入一个不在这两组白名单中的值时Cookiecutter 会立即给出错误提示并要求重新输入run_as_docker [True]: docker Error: docker is not a valid boolean这一行为由YesNoPrompt.process_response中的InvalidResponse异常驱动非法输入会触发rich.prompt的校验失败机制打印上述错误并重新显示问题直到用户给出合法输入或按回车采用默认值为止。对应测试见 tests/test_read_user_yes_no.pytest_yesno_prompt_process_response验证了wrong会抛出InvalidResponse而t/f分别被转换为True/False。布尔变量与其他变量类型的协同与 human-readable prompts 结合可以为布尔变量提供更友好的提问文案。在cookiecutter.json中通过__prompts__键为init_git设置人类可读提示示例见 docs/advanced/human_readable_prompts.rst{ init_git: true, __prompts__: { init_git: Initialize a git repository } }运行时提示将变为Initialize a git repository [True]:实现上read_user_yes_no会优先使用prompts中对应键的文案cookiecutter/prompt.py未配置时才回退为变量名。与no_input/--no-input结合当以--no-input模式运行或通过 Python API 调用时传no_inputTrue时布尔变量不会弹出任何提问直接采用cookiecutter.json中的默认值若通过extra_context/default_context覆盖则采用覆盖值。对应逻辑见 cookiecutter/prompt.pyno_input为真时走render_variable直接取渲染后的默认值否则才调用read_user_yes_no。这也意味着布尔变量的默认值可以在 用户配置文件 的default_context中预置default_context: run_as_docker: false从而让不同使用者获得不同的开箱默认行为。源码与测试佐证提示实现cookiecutter/prompt.py 中的read_user_yes_no对外入口与YesNoPrompt解析核心yes_choices/no_choices白名单与process_response转换逻辑均在此定义分派逻辑prompt_for_config依据isinstance(raw, bool)判断布尔变量并调用read_user_yes_notests/test_prompt.py 的TestReadUserYesNo.test_should_invoke_read_user_yes_no验证了布尔变量必然走read_user_yes_no而非read_user_variable字符串覆盖转换cookiecutter/generate.py 的apply_overwrites_to_context负责将extra_context/default_context中的布尔字符串如yes转为布尔值tests/test_generate_context.py 覆盖了全部合法值与非法值抛ValueError两种场景解析单元测试tests/test_read_user_yes_no.py 验证read_user_yes_no的调用方式与YesNoPrompt.process_response的转换/报错行为。常见问题与注意事项布尔值必须是 JSON 的true/false而非字符串run_as_docker: true会被当作普通字符串变量处理提问方式为普通文本输入且模板中字符串true在条件判断中恒为真只有true/false字面量才会触发布尔提问与合法值校验。默认值来自cookiecutter.json与上下文覆盖提示中括号内的默认值取自上文已渲染的上下文若值本身包含 Jinja2 表达式如{{ cookiecutter.some_var }}会先经render_variable渲染后再作为默认值展示。大小写与空格不敏感YesNoPrompt.process_response会先strip().lower()因此YES、Yes、y等写法均合法。非法输入不会崩溃只会重问InvalidResponse由 rich 的 prompt 机制捕获并提示程序不会中途退出。不要在布尔变量上使用 true比较模板中的cookiecutter.run_as_docker是 Python 布尔对象直接{% if cookiecutter.run_as_docker %}判断即可字符串比较写法在布尔变量上反而无法正常工作。小结布尔变量是 Cookiecutter 模板设计中最常用的开关型变量在cookiecutter.json中用 JSON 布尔字面量声明运行时获得[True]形式的 Yes/No 提问底层由read_user_yes_noYesNoPrompt完成白名单解析与非法输入校验最终以cookiecutter.name形式注入模板供 Jinja2 条件渲染使用。配合__prompts__自定义提问文案、default_context预设默认值以及--no-input静默模式可以构建出既友好又健壮的交互式项目脚手架。【免费下载链接】cookiecutterA cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects.项目地址: https://gitcode.com/gh_mirrors/co/cookiecutter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考