用 Python 编写 Dify 工作流脚本(小技巧)
Dify 作为一个支持自定义 Python 工作流的智能体平台,给了我们极大的灵活性。但很多人在写 Dify 脚本时,常常忽略了其中最常用、最实用的一些 Python 技巧。本文从我实际使用的几个脚本中,提炼出一些非常值得掌握的核心知识点。
1. json.loads与嵌套结构提取
Dify1.6 中传入的参数很多都是 JSON 字符串(不是Object,因为输入不支持),需要先用 json.loads() 解析:
import json def main(request: str) -> dict: data = json.loads(request) value = data.get('some_field', 'default') sublist = data.get('nested', {}).get('list', []) return {"value": value, "sublist": sublist}技巧点:
- dict.get() 支持默认值,避免 KeyError;
- 嵌套访问时用 .get(..., {}) 链式访问更安全;
- 字段缺失时自动降级为默认值,是写健壮代码的基本功。
2. 批量提取列表中的字段
当传入参数是一个包含多个对象的列表时,通常我们只关心每个对象中的一个字段。这时可以用一个简单的 for 循环快速提取:
def main(arg1: str, arg2: list) -> dict: arg1 = json.loads(arg1).get("output") token_list = [item.get("output") for item in json.loads(arg2)] return { "result": { "text": arg1, "tokens": token_list } }技巧点:
- 使用列表推导式比传统 for 更简洁;
- 处理 Dify 中多个节点输出(如 list[{"output":...}])时非常高效。
3. 多个 dict 合并的常见做法
你可能需要把多个字典合并成一个结构统一的输出,比如不同规则的匹配结果。用 {**a, **b, **c} 的形式可以快速实现:
def main(a, b, c) -> dict: a = json.loads(a) b = json.loads(b) c = json.loads(c) result = {**a, **b, **c} return {"merged": result}或者更实际一点:
rule_a = {"rule_a": [1, 2]} rule_b = {"rule_b": [3, 4]} rule_c = {"rule_c": [5]} merged = {**rule_a, **rule_b, **rule_c}技巧点:
- {**dict1, **dict2} 是 3.5+ 的语法,比 update() 更干净;
- 适合结构扁平的场景,不建议用于深层嵌套的 merge。
4. 从多个输入中整理成统一结构
当你处理多个输入对象,每个都返回结构类似的内容时,可以统一封装成一个最终结果:
def main(text, rule1, rule2, vec_result) -> dict: rule_matches = { "rule1": json.loads(rule1).get("match", []), "rule2": json.loads(rule2).get("match", []) } result = { "text": text, "rules": rule_matches, "vector": json.loads(vec_result).get("similar", []) } return {"result": result}技巧点:
- 用 .get(..., []) 处理可能缺失字段;
- 返回结构清晰、有层次,有助于调试和前端渲染。
总结
在 Dify 或任何支持 Python 的工作流平台中,掌握以下基础技能尤为重要:
技巧 | 示例 | 用途 |
|---|---|---|
json.loads | json.loads(str) | 解析传入字符串参数 |
.get() | dict.get("key", default) | 安全提取字段 |
列表推导 | [x.get("a") for x in list] | 从列表中批量提取字段 |
多 dict 合并 | {**a, **b} | 聚合结果 |
结构清晰的 return | return {"result": ...} | 提高可读性 |
这些技巧虽然基础,但在构建实际智能体时非常常用,建议每位使用 Dify 或编写轻量脚本的人都熟练掌握。
如果你对这类“工作流+Python”类型的技巧感兴趣,欢迎关注我后续的系列文章,也欢迎分享你的实践经验!