ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python中的小知识

Python中的小知识 平常使用1 *与** 解列表与解字典- *args把列表 / 元组解开成 位置参数- **kwargs把**字典解开变成关键字参数 (keyvalue)。**在这里叫字典解包运算符。TOOL_REGISTRY {YoloDetect: yolo_detect} tool_name data [name] tool_args {img_path:C:\Users\DreamV\Desktop\fushixiangmu\LangChainDay1\test2.jpg} func TOOL_REGISTRY [tool_name] obs func (**tool_args)obs func(**tool_args)等价于obs func(img_pathrC:\test.jpg)根据 keyvalue 呢这里 就是说把 tool_args 字典里的值直接 img_pathC:\... 了也就是说 obsyolo_detect (img_pathC:\)2 try 与 except 错误处理try:# 【风险代码】有可能会报错的代码写这里语句A语句Bexcept 异常类型1:# 发生异常类型1的时候执行这里做错误处理错误处理1except 异常类型2:# 发生异常类型2的时候执行这里错误处理2else:# try里面全部没有报错才会进else可选finally:# 无论报错与否一定会执行可选关闭文件、释放资源常用重点except 后面写异常类名代表只捕获这一种错误。如果你写裸的 except:不写异常名字会捕获所有全部异常不推荐容易掩盖 bug。3 3引号字符串的好处 里面的双引号不需要反斜杠\转义三引号好处里面的双引号不需要反斜杠\转义# 双引号版本内部出现必须加反斜杠转义 \good1 {\a\:1}# 三单引号版本内部随便写双引号 不用写反斜杠看着清爽good2 {a:1}1. # → 真正注释2. 单引号单行字符串3. 双引号单行字符串4. / **多行字符串**内部引号不用转义- 出现在右边赋值给变量普通字符串- 写在函数 /class 第一行文档字符串 docstring可充当注释4 遍历 列表字符串是否有 目标字符 部分匹配if 工具已执行 in state[logs]: ❌if any(工具已执行 in log for log in state[logs]): ✔这是成员判断判断字符串工具已执行是否作为列表里的一个完整元素存在。logs [完成思考, 工具已执行] 工具已执行 in logs # True但如果只是部分匹配logs [完成思考工具已执行完毕] 工具已执行 in logs # False因为列表里没有哪个元素正好等于工具已执行。if any(工具已执行 in log for log in state[logs]):这是子串判断遍历列表里的每个字符串log只要有一个log包含工具已执行就返回True。Class类里的1. __call__()1. 误区我要手动调用 yolo_tool.__call__(xxx)真相不要手动写__call__Python 对象加括号就自动调用。业务代码几乎永远不直接写__call__。2. 误区forward()会被直接调用真相Agent 不会直接调用forward()永远先走__call____call__内部再去调用forward()。__call__负责setup初始化、输入输出清洗forward只放纯业务逻辑2 Annotated是一个类型注解的特殊形式用来给类型附加额外信息from typing import Annotated from operator import add logs: Annotated[list[str], add]Annotated[类型, 合并函数]给字段定一个 “更新规则”。这里add是 Python 内置的加法用在列表上就是追加相当于你手动写messages.append(...)。如果不加Annotated默认规则是后写的覆盖前写的。可以理解为真正的类型是list[str]也就是“字符串列表”。附加元数据add不是类型它是Annotated附加的元数据通常是一个函数。在这里add来自from operator import add作用是“把两个列表合并”。JSON1 Json内部只能存在5种形式① JSON 对象 { ... } JSON 对象 { ... }里面必须是一组键:值 对 (和字典形式差不多)键key必须是双引号包裹的字符串不能裸写不能用单引号。②JSON 数组 [ ... ]③ JSON 字符串 abc JSON 字符串外层只能用双引号 绝对不能用单引号 ④JSON 数字⑤JSON 布尔 / null 全部小写这是高频踩坑点 JSON 布尔true、false全小写JSON 空值null全小写2 JSON字符串 与 Ajson()和 json.loads(A) 的作用Ajson()和 json.loads(A) 的作用是把 HTTP 响应体里A的 JSON 字符串解析成 Python 能直接操作的字典/列表整个传给 json.loads() 的文本必须从头到尾就是上面其中一种不能外面额外加人话。如s_bad 前面加文字 {\a\:1}json.loads(s_bad) # 报错实际文本 前面加文字 {\a\:1} 不是合法顶层JSON值s_ok 前面加文字 {\a\:1} # 实际文本前面加文字 {\a\:1}s_ok ” 前面加文字 {a:1} “ 都行 都可以json.loads (s_ok) 前后三引号 还是双引号都行 好的我现在需要调用工具{action:call_tool,name:YoloDetect} 这个字符串不是 JSON字符串 所以不是JSON “好的我现在需要调用工具{action:call_tool,name:YoloDetect}” 这种形式才是JSON字符串三引号里 包含双引号。JSON 语法规定整个输入只能是一个 JSON 值对象 / 数组 / 字符串 / 数字不能前面随便写自然语言中文。JSON字符串JSON 字符串不是普通字符串是格式特殊的字符串所以 llm_out 好的我现在需要调用工具 \n {action:call_tool,name:YoloDetect} 这个字符串不行。JSON 字符串里边的内容必须是一个 JSON 值对象 / 数组 / 字符串 / 数字不能前面随便写自然语言中文。所以 llm_out “{action:call_tool,name:YoloDetect}” 这样可以因为 {action:call_tool,name:YoloDetect} 是 JSON 对象形式且是字符串所以 “{action:call_tool,name:YoloDetect}” 是 JSON 字符串。
返回列表