:为模板变量定制交互式提问与选项标签)
开发工具CLI代码生成【免费下载链接】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 的交互式命令行提问默认直接使用cookiecutter.json中的变量名例如full_name [Your Name]:对于终端用户而言既不友好也不直观。本文围绕docs/advanced/human_readable_prompts.rst介绍__prompts__保留键它允许模板作者为每一个变量自定义人类可读的提示文案并为多选choice变量的每个选项提供可读标签。读完本文你将掌握__prompts__的两种写法字符串提示与带__prompt__的字典式标签映射、它如何作用于普通字符串、布尔、多选与字典四类变量的提问并能从源码与测试层面理解其底层实现机制。__prompts__是什么__prompts__是cookiecutter.json中的一个特殊顶层键用于覆盖默认提问文案。它不会被渲染进最终项目上下文而是被prompt_for_config在进入提问流程时从上下文中取出并消费prompts context[cookiecutter].pop(__prompts__, {})上面的代码来自 cookiecutter/prompt.py。prompt_for_config遍历context[cookiecutter]中的每一个变量时会把__prompts__中对应变量的文案传给各个read_user_*函数实现问得清楚、答得明白。__prompts__支持两种取值形态形态适用场景说明字符串普通字符串、布尔、字典等单值提问直接替换该变量的提问文案字典含__prompt__键多选choice / list变量__prompt__指定提问语其余键为每个选项提供人类可读标签基本用法为单个变量定制提示文案对于普通字符串变量__prompts__中的值只需是一个字符串该字符串即会成为提问时展示的文案。原文档给出的cookiecutter.json示例即为最典型的写法{ package_name: my-package, module_name: {{ cookiecutter.package_name.replace(-, _) }}, package_name_stylized: {{ cookiecutter.module_name.replace(_, ).capitalize() }}, short_description: A nice python package, github_username: your-org-or-username, full_name: Firstname Lastname, email: emailexample.com, init_git: true, linting: [ruff, flake8, none], __prompts__: { package_name: Select your package name, module_name: Select your module name, package_name_stylized: Stylized package name, short_description: Short description, github_username: GitHub username or organization, full_name: Author full name, email: Author email, command_line_interface: Add CLI, init_git: Initialize a git repository } }注意两点示例中command_line_interface在__prompts__里配置了文案但该键并不存在于同一份cookiecutter.json中这不会引发错误——read_user_variable只有在var_name in prompts且值非空时才使用该文案否则回退到变量名本身见 cookiecutter/prompt.py。module_name、package_name_stylized这类由 Jinja2 模板派生的变量同样可以被__prompts__覆盖提问文案提问时它们已经通过render_variable渲染出默认值见 cookiecutter/prompt.py。多选变量的选项标签__prompt__ 标签映射当某个变量是列表choice 变量时__prompts__中可以将其对应值写成字典用__prompt__指定整个问题的文案用其余键为每个选项提供展示标签。沿用原文档示例中的linting{ linting: [ruff, flake8, none], __prompts__: { linting: { __prompt__: Which linting tool do you want to use?, ruff: Ruff, flake8: Flake8, none: No linting tool } } }最终用户在终端看到的效果类似[1/9] Which linting tool do you want to use? 1 - Ruff 2 - Flake8 3 - No linting tool Choose from 1, 2, 3 [1]:其中1 - Ruff中的1是选项在列表中的序号Ruff则是__prompts__为ruff提供的标签。若某个选项在__prompts__中没有对应标签则仍显示选项原值。这一行为由read_user_choice实现见 cookiecutter/prompt.pyif prompts and var_name in prompts: if isinstance(prompts[var_name], str): question prompts[var_name] else: if __prompt__ in prompts[var_name]: question prompts[var_name][__prompt__] choice_lines ( f [bold magenta]{i}[/] - [bold]{prompts[var_name][p]}[/] if p in prompts[var_name] else f [bold magenta]{i}[/] - [bold]{p}[/] for i, p in choice_map.items() )即字符串形式直接作为问题文案字典形式则优先读取__prompt__作为问题逐项用标签替换选项原值未配置标签的选项回退显示原值。选择变量的默认值为选项列表的第一个元素用户直接回车即选中它。四类变量的完整提示覆盖__prompts__并非只能用于字符串与多选变量。从 cookiecutter/prompt.py 的prompt_for_config主循环第 284-363 行可以看到prompts被统一传给所有提问函数覆盖四类变量变量类型判定方式提问函数__prompts__形态普通字符串not isinstance(raw, dict)且非 boolread_user_variable字符串多选choiceisinstance(raw, list)read_user_choice经prompt_choice_for_config字符串或含__prompt__的字典布尔isinstance(raw, bool)read_user_yes_no字符串字典isinstance(raw, dict)read_user_dict字符串布尔变量read_user_yes_no与read_user_variable使用相同的取用逻辑——prompts[var_name]存在且非空时替换提问文案例如init_git: Initialize a git repository会把默认的init_git [True]:变成Initialize a git repository [True]:。合法输入包括1/true/t/yes/y/on真与0/false/f/no/n/off假非法输入会报Error: ... is not a valid boolean相关规则见 cookiecutter/prompt.py也可见 docs/advanced/boolean_variables.rst。字典变量read_user_dict同样支持用__prompts__替换提问文案交互时要求用户输入 JSON 格式的字典见 cookiecutter/prompt.py。注意__prompts__本身也是一个字典但它以__双下划线开头属于双下划线私有变量会被render_variable渲染后原样放入上下文且不会触发read_user_dict提问见主循环第 307-309 行对key.startswith(__)的处理因此它不会反过来被当成一个需要用户输入的 dict 变量。派生变量的顺序prompt_for_config分两轮处理变量——第一轮处理普通、多选、布尔变量第二轮才处理字典变量以保证后者的键/值可以引用前者的结果__prompts__在循环开始前已被pop出上下文不参与任何渲染。运行时序与渲染细节__prompts__的生效流程可归纳为prompt_for_config从cookiecutter上下文中pop出__prompts__按cookiecutter.json中的键顺序遍历各变量使用create_env_with_context构建的 Jinja2 环境渲染默认值render_variable依据变量类型分派到read_user_variable/read_user_choice/read_user_yes_no/read_user_dict各函数内部用prompts[var_name]覆盖提问文案未在__prompts__中出现的变量保持默认行为——直接用变量名作为问题例如字符串变量显示full_name [Your Name]:多选变量显示Select linting。交互提示中还会出现[n/total]形式的进度前缀prefix f [dim][{count}/{size}][/] 见 cookiecutter/prompt.py它标识当前提问在所有可见变量中的序号与__prompts__文案并存。_单下划线开头的私有变量不会出现在该计数中也不会被提问。与no_input、replay 等机制的配合在no_inputTrue对应 CLI 的--no-input时prompt_for_config直接使用渲染后的默认值完全跳过read_user_*提问__prompts__文案自然不展示。默认值来自cookiecutter.json可被用户配置.cookiecutterrc覆盖也可通过extra_context注入参见 docs/advanced/suppressing_prompts.rst。replay 机制重放历史上下文时同样不再提问因此__prompts__主要影响交互式创建场景。模板作者若想进一步控制渲染环境例如注册自定义过滤器后再用于__prompts__或默认值渲染可参考 docs/advanced/jinja_env.rst 与 docs/advanced/template_extensions.rst。测试验证仓库中的测试用例直接印证了__prompts__的上述行为见 tests/test_prompt.pytest_prompt_for_config_with_human_prompts第 98-131 行验证带__prompts__的上下文会调用read_user_variable并传入自定义文案同时布尔与多选变量分别走read_user_yes_no、read_user_choice。test_prompt_for_config_with_human_choices第 133-173 行验证三种写法均可用——纯字符串提示、含__prompt__与全量标签的字典、以及仅含部分标签的字典未覆盖的选项回退显示原值。test_should_render_deep_dict_with_human_prompts第 248-275 行与test_internal_use_no_human_prompts第 277-288 行验证__prompts__不影响字典渲染且空__prompts__时行为与不配置完全一致。test_should_invoke_read_user_choice/test_should_invoke_read_user_variable第 389-431 行验证选择变量与普通变量分别路由到read_user_choice与read_user_variable且传入prompts字典作为参数。这些测试同时确认__prompts__中配置了但上下文中不存在的键如示例里的command_line_interface不会引发错误——各read_user_*函数只在var_name in prompts时读取文案否则回退到变量名。小结__prompts__是 Cookiecutter 模板作者改善终端用户体验最直接的手段用字符串为普通、布尔、字典变量提供友好提问文案用含__prompt__的字典为多选变量重写问题并为每个选项提供可读标签未配置的变量自动回退到默认提问行为不影响已有模板文案与选项标签仅在交互式提问时生效no_input与 replay 场景下不展示。借助 cookiecutter/prompt.py 的prompt_for_config、read_user_variable、read_user_choice等实现与 tests/test_prompt.py 的配套用例模板开发者可以放心地将__prompts__纳入cookiecutter.json的标配让每一次脚手架提问都清晰可读。赞分享开发工具CLI代码生成【免费下载链接】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 2.2.3 解析choice 可读标签与 replay 文件驱动的交互式提示Cookiecutter 2.2.3 解析choice 可读标签与 replay 文件驱动的交互式提示 本篇文章基于 Cookiecutter 2.2.3 版开发工具CLI代码生成Email Verification API 隐私深潜issuer 盲化如何让邮箱服务商学不到用户去向Email Verification API 隐私深潜issuer 盲化如何让邮箱服务商学不到用户去向 每次注册网站后在邮箱里等验证码时你可能没意识到你的Padrões de commits高级技巧交互式提交与模板定制Padrões de commits高级技巧交互式提交与模板定制 在团队协作中规范的提交信息Commit Message是保持代码仓库可维护性的关键。传开发工具版本控制上一篇Nuxt 3 中预渲染动态路由的实现方案下一篇formula.js文本函数完全手册字符串操作、查找替换的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考