Install
openclaw skills install @thcjp/py-toolkit-freeopenclaw skills install @thcjp/py-toolkit-freePython 工具包免费版是面向个人开发者的 Python 优选实践助手。覆盖 Python 开发中最常见的陷阱与高频问题,提供即查即用的修复建议与代码规范,帮助开发者写出可靠的生产级代码. 从可变默认参数到 GIL 并发限制,从循环导入到浮点数精度,全面覆盖 Python 开发中的雷区.
识别 Python 开发中 13 类高频陷阱,提供修复建议与正确写法.
处理: 解析常见陷阱检测的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回常见陷阱检测的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作动态类型、类型提示(Type Hints)、鸭子类型的正确使用方式.
处理: 解析类型系统指导的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回类型系统指导的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作列表、字典、集合的常见陷阱与推导式优选实践.
处理: 解析集合操作规范的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回集合操作规范的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作参数传递、闭包、装饰器、生成器的正确使用模式.
处理: 解析函数式编程的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回函数式编程的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作GIL 限制说明,threading、asyncio、multiprocessing 的选择策略.
处理: 解析并发编程建议的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回并发编程建议的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作循环导入预防,包结构与 __init__.py 优选实践.
处理: 解析导入管理的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回导入管理的响应数据,包含状态码、结果和日志.
pytest 框架使用,mock 与 fixtures 优选实践.
处理: 解析测试编写的输入参数,完成核心逻辑,返回结构化响应. 输出: 返回测试编写的响应数据,包含状态码、结果和日志.
input_params参数,支持创建/查询/导出操作
能力覆盖范围:本skill的核心能力覆盖以下场景关键词:开发优选实践助手、避免可变默认参数、导入陷阱与常见运、行时问题、免费版、面向个人开发者与、学习者、核心能力、常见陷阱检测与修、类型提示与鸭子类、型指导、集合使用规范、生成器优选实践、与并发编程建议、测试编写指导等。这些关键词对应description中声明的使用场景,均已在上述能力点中提供对应的操作支持.Python 中最常见的陷阱之一:可变默认参数在函数定义时只创建一次,所有调用共享同一实例.
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | Python工具包-免费版处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
# 错误写法 - 所有调用共享同一个列表
def add_item(item, items=[]):
items.append(item)
return items
# ...
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] - 不是 [2]!
# ...
# 正确写法 - 使用 None 作为默认值
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
# ...
print(add_item(1)) # [1]
print(add_item(2)) # [2] - 正确
is 检查身份(同一对象),== 检查相等(值相同).
# is vs == 的陷阱
a = "hello"
b = "hello"
print(a == b) # True - 值相等
print(a is b) # True - 小字符串有缓存
# ...
# 长字符串可能不缓存
s1 = "a" * 1000
s2 = "a" * 1000
print(s1 == s2) # True
print(s1 is s2) # False - 不同对象!
# ...
# 正确做法:比较值用 ==,检查 None 用 is
if x is None: # 正确
if x == None: # 不推荐
# ...
# 检查类型用 isinstance,不用 type()
if isinstance(x, int): # 正确,支持继承
if type(x) == int: # 不推荐,不支持继承
文件操作必须使用上下文管理器,并显式指定编码.
# 依赖说明
f = open('data.txt')
content = f.read()
# 忘记 f.close() -> 句柄泄漏
# ...
# 正确写法 - 使用 with 语句,指定编码
with open('data.txt', encoding='utf-8') as f:
content = f.read()
# 文件自动关闭
# ...
# 浮点数精度问题
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
# ...
# 金额计算使用 Decimal
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2') == Decimal('0.3')) # True
以下场景Python工具包-免费版不适合处理:
需要代码生成、编程辅助、调试测试、开发部署时使用。不适用于非本工具能力范围的需求.
# 1. 可变默认参数 -> 用 None
def func(items=None):
items = items or []
# ...
# 2. 迭代时修改列表 -> 迭代副本
for item in list(my_list):
if condition(item):
my_list.remove(item)
# ...
# 3. 裸 except 捕获 -> 用 Exception
try:
risky_code()
except Exception as e: # 不是 bare except:
handle(e)
# ...
# 4. 上下文管理器 -> 总是用 with
with open('file.txt', encoding='utf-8') as f:
data = f.read()
# ...
# 5. 浮点数 -> 用 Decimal 处理金额
from decimal import Decimal
price = Decimal('19.99')
# ...
# 6. 生成器只能迭代一次 -> 重建或用 itertools.tee
gen = (x for x in range(10))
list(gen) # [0,1,...,9]
list(gen) # [] - 已耗尽!
from typing import List, Dict, Optional, Union
# ...
def process_data(
items: List[int],
config: Dict[str, str],
threshold: Optional[int] = None
) -> Dict[str, Union[int, float]]:
"""处理数据并返回统计结果"""
result = {
'count': len(items),
'avg': sum(items) / len(items) if items else 0.0
}
return result
[tool.black]
line-length = 88
target-version = ['py38']
# ...
[tool.isort]
profile = "black"
line_length = 88
# ...
[tool.mypy]
python_version = "3.10"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
# ...
[tool.pytest.ini_options]
minversion = "7.0"
addopts = "-ra -q --cov=myproject"
testpaths = ["tests"]
| 陷阱 | 错误写法 | 正确写法 |
|---|---|---|
| 可变默认参数 | def f(x=[]) | def f(x=None): x = x or [] |
| is 比较值 | if a is "hello" | if a == "hello" |
| 迭代时修改 | for x in lst: lst.remove(x) | for x in list(lst): ... |
| 裸 except | except: | except Exception: |
| 文件不用 with | f = open(...) | with open(...) as f: |
| 浮点金额 | price = 19.99 | price = Decimal('19.99') |
| 生成器复用 | gen = (x for x in ...) | 每次重建或用 itertools.tee |
| 类属性可变 | class C: items = [] | 在 __init__ 中定义 |
| 编码依赖平台 | open('f') | open('f', encoding='utf-8') |
encoding='utf-8',不依赖平台默认值except Exception:不要用裸 except:,避免捕获 SystemExit 和 KeyboardInterruptfor x in list(items):decimal.Decimal,不用 floatUnboundLocalError 是什么原因?A: 在函数内部对外部变量赋值时,Python 会将该变量视为局部变量。如果赋值前尝试读取,会报 UnboundLocalError。解决方法:使用 nonlocal(嵌套函数)或 global(全局变量)声明.
A: 循环导入是两个模块互相 import 导致的。解决方案:1) 将导入移到函数内部(延迟导入);2) 重构代码,提取共享部分到第三个模块;3) 合并循环依赖的模块.
A: GIL(全局解释器锁)阻止 Python 线程真正并行执行。对 I/O 密集型任务影响不大(线程会在 I/O 等待时释放 GIL)。对 CPU 密集型任务,使用 multiprocessing 替代 threading 实现真正的并行.
__init__ 和 __new__ 的区别?A: __new__ 创建实例(负责对象分配),__init__ 初始化实例(负责设置属性)。通常只重写 __init__。重写 __new__ 的场景:单例模式、不可变类型(如 tuple 的子类).
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Python 3 | 运行时 | 必需 | 官方网站下载 |
| pytest | 测试框架 | 推荐 | pip install pytest |
| mypy | 类型检查 | 推荐 | pip install mypy |
| black | 代码格式化 | 推荐 | pip install black |
| LLM API | API | 必需 | 由Agent内置LLM提供 |
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 配置错误 | 参数缺失或格式错误 | 检查依赖说明中的配置要求 |
| 运行时错误 | 运行环境不满足 | 确认运行环境符合依赖说明 |
| 网络错误 | 连接超时或不可达 | 执行ping命令测试网络连通性,检查防火墙和代理设置连接后执行ping命令测试网络连通性,检查防火墙和代理设置连接后重新执行命令,参考国内替代方案 |
{
"success": true,
"data": {
"result": "Python工具包-免费版处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "pykit"
}
},
"execution_log": ["解析输入参数", "执行核心处理", "格式化输出结果"],
"error": null
}