wrapt作者Graham Dumpleton推出的新项目,用统一接口同时实现函数包装、测试Mock和OpenTelemetry追踪,支持纯配置化注入。
Introducing wrapture Simon Willison 的链接博客
2026年8月31日
Graham Dumpleton(wrapt、mod_wsgi 以及 New Relic Python agent 的作者)发布了一款名为 Wrapture 的新工具,他将 Wrapture 描述为:将 wrapt 中的 monkeypatching 思想进一步扩展,同时应用于测试和追踪。
Wrapture(完整文档见此)让任意函数或方法的包装变得轻而易举,可以追踪所有访问,也可以覆盖返回值以返回不同的值。
它既是 unittest.mock 的替代方案,也是一种为现有项目实现追踪的方式:
将观察能力附加到你无法控制的代码上,记录流经其中的内容,同时不干扰被监听的程序——这个问题我从未真正停止过思考。
Wrapture 包含 OpenTelemetry 支持,甚至提供了一种完全基于配置的机制来为现有 Python 项目添加追踪功能,大致如下:
capture = "summary"
[[observe]]
target = "domain:Calculator"
name = ["outer", "inner"]
[[sink]]
type = "jsonlines"
path = "trace.jsonl"
这仍然是一个非常年轻的项目——仅仅几周大——但它有一个非常有希望的起点。
有趣的是,这也是 Graham 第一次尝试完全由 AI 驱动的大型项目:
Wrapture 中的每一行代码和文档都由一个 AI 助手在我的指导下编写。我想在此坦诚相告,同样也要坦诚地说明它不是什么。这不是 vibe coding——那种一次性 prompt 产生一堆生成代码,然后推动者因为缺乏判断能力只能寄希望于最好的结果。Vibe coding 获得它的坏名声是有道理的。我从一开始就精心设计了 wrapture。我在这个特定的 Python 领域已经深耕了很久,非常清楚最终结果需要是什么,AI 是生产它的手段,而不是设计的来源。
在后续文章「Using wrapture for unit testing」中,Graham 展示了这个新库支持的测试模式:
def test_stub_with_wrapture():
with wrapture.binding(
Gateway, "charge"
).on_call.returns({
"id": "stub", "amount": 0}
):
assert OrderService().place(
500
)["id"] == "stub"
以及一个调用后修改原始方法返回值的测试示例:
def test_pinned_result_with_wrapture():
charge = wrapture.binding(
Gateway, "charge"
)
charge.on_call.transforms_result(
lambda r: {**r, "id": "ch_TEST"}
)
with charge:
assert OrderService().place(
500
) == {
"id": "ch_TEST", "amount": 500
}
(以上两个示例中,OrderService().place(...) 方法都调用了 Gateway().charge(...)。)
延伸阅读
本文是 Simon Willison 的链接帖,发布于 2026年8月31日。
赞助我每月 $10,即可获得当月最重要 LLM 进展的精选邮件摘要。
付费让我少给你发邮件!