Node.js lodash.template迁移至Python3如何支持占位符点号访问子属性?
方案1:使用Jinja2模板库(推荐)
Jinja2原生支持嵌套属性的点访问语法,同时支持自定义变量定界符,可以完美匹配你现有的${变量}格式模板,无需修改存量模板内容。
首先安装依赖:pip install jinja2
使用示例:
from jinja2 import Environment, BaseLoader # 配置模板环境,定界符匹配现有模板规则 template_env = Environment( loader=BaseLoader(), variable_start_string="${", variable_end_string="}", trim_blocks=True ) def render(template: str, context: dict) -> str: tpl = template_env.from_string(template) return tpl.render(**context) # 测试验证 result = render('${ foo.bar }, ${ baz }!', {"foo": {"bar": "Hello"}, "baz": "World"}) print(result) # 输出:Hello, World!
该方案还兼容模板中的条件判断、循环等扩展逻辑,适合复杂模板场景使用。
方案2:纯内置库实现(无第三方依赖)
如果只有简单的变量替换需求,不想引入额外依赖,可以自己实现点路径解析+模板替换的逻辑,代码如下:
import re from typing import Any, Dict def resolve_path(context: Dict[str, Any], path: str) -> Any: # 处理占位符内的空格,拆分点路径 keys = path.strip().split(".") current = context for key in keys: if isinstance(current, dict) and key in current: current = current[key] else: raise ValueError(f"无法解析占位符路径:{path}") return current def render(template: str, context: Dict[str, Any]) -> str: # 匹配所有${...}格式的占位符 placeholder_pattern = re.compile(r"\$\{([^}]+)\}") def replace_func(match: re.Match) -> str: path = match.group(1) return str(resolve_path(context, path)) return placeholder_pattern.sub(replace_func, template) # 测试验证 result = render('${ foo.bar }, ${ baz }!', {"foo": {"bar": "Hello"}, "baz": "World"}) print(result) # 输出:Hello, World!
该方案轻量无依赖,适合仅需变量替换的简单场景。
内容的提问来源于stack exchange,提问作者Haotian Chyi
相关产品推荐
相关产品推荐

