# python: 使用 derive URL: https://generaltranslation.com/zh/docs/python/tutorials/derive.mdx --- title: 使用 derive description: 如何使用 derive 实现一致性、可复用内容和静态分析 --- ## 什么是 `derive`? [`derive`](/docs/python/api/derive) 是一个恒等函数,用于标记内容,供 GT CLI 进行静态分析。当 CLI 扫描你的代码时,它会识别 `derive(...)` 调用,并确定所有可能的返回值,为每种返回值分别创建独立的翻译条目。 这在以下场景中很有用: * 保持不同语言中**一致性** (性、数、格) * **可复用内容**:在已翻译的字符串中包含函数调用 * **拆分的句子**:字符串的一部分具有一组已知结果 *** ## 保持一致性 许多语言都有会影响周围词语的语法规则 (如性、数和格) 。如果没有 `derive`,单个翻译条目就无法处理这种一致性: ```python # 不使用 derive — 只有一条翻译条目,无法实现一致性 message = t(f"The {get_subject(gender)} is playing.") # "The boy is playing." 和 "The girl is playing." 共用同一条翻译条目 ``` 使用 `derive` 时,CLI 会为每种结果创建单独的条目: ```python from gt_flask import derive, t def get_subject(gender: str) -> str: return "boy" if gender == "male" else "girl" message = t(f"The {derive(get_subject(gender))} is playing.") ``` 这会生成两个翻译条目: * `"The boy is playing."` → `"El niño está jugando."` * `"The girl is playing."` → `"La niña está jugando."` 注意,西班牙语会根据主语使用 "El" 或 "La"——这种一致性会自动处理。 *** ## 工作原理 1. **在构建时**,GT CLI 会分析经过 `derive` 包装的表达式 2. 它会确定所有可能的返回值 (这些返回值必须可静态分析) 3. 它会为每个唯一的结果创建单独的翻译条目 4. **在 runtime**,`derive` 只是一个恒等函数——会原样返回其参数 *** ## 示例 ### 内联表达式 你可以直接在 `derive` 中嵌入逻辑: ```python from gt_flask import derive, t message = t(f"The {derive('boy' if gender == 'male' else 'girl')} is playing.") ``` ### 函数调用 对返回值已知的函数调用进行封装: ```python from gt_flask import derive, t def get_status_label(status: str) -> str: if status == "complete": return "completed" elif status == "pending": return "pending" return "unknown" message = t(f"Task is {derive(get_status_label(status))}.") ``` ### 可复用内容 ```python from gt_flask import derive, t def get_subject() -> str: return "boy" translation1 = t(f"The {derive(get_subject())} is playing.") translation2 = t(f"The {derive(get_subject())} is having fun.") ``` ### 使用 `declare_var` 当你需要在静态表达式中插入动态内容时,可将 `derive` 与 [`declare_var`](/docs/python/api/declare-var) 结合使用: ```python from gt_flask import derive, declare_var, t def get_greeting(name: str | None) -> str: if name: return f"Hello, {declare_var(name, name='user')}" return "Hello, stranger" message = t(f"{derive(get_greeting(name))}! How are you?") ``` *** ## 性能注意事项 `derive` 会让翻译条目数量成倍增加。每次调用如果有 N 种可能结果,就会创建 N 个条目;而在同一个字符串中多次调用 `derive`,数量还会呈指数级增长。请谨慎使用。