Doramagic 项目包 · 项目说明书

kgb 项目

在单元测试中对 Python 函数进行监听和监控的工具

kgb 概述与快速入门

kgb 是一个用于 Python 单元测试的"间谍"(Spy)库,主要目的是在不修改被测代码的前提下,记录、替换或断言函数的调用行为。它既可以作为独立的单元测试辅助库使用,也已经集成到 Review Board、Djblets、Django Evolution 等多个项目中,资料来源:[README.rst:1-58]()。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 直接实例化 SpyAgency

继续阅读本节完整说明和来源证据。

章节 混入 unittest TestCase

继续阅读本节完整说明和来源证据。

章节 使用 pytest fixture

继续阅读本节完整说明和来源证据。

项目定位与用途

kgb 是一个用于 Python 单元测试的"间谍"(Spy)库,主要目的是在不修改被测代码的前提下,记录、替换或断言函数的调用行为。它既可以作为独立的单元测试辅助库使用,也已经集成到 Review Board、Djblets、Django Evolution 等多个项目中,资料来源:README.rst:1-58

kgb 的核心价值体现在三个方面:

  1. 行为替换:可以将某个函数临时替换为另一个函数(call_fake),或阻止其继续调用原始实现(call_original=False)。
  2. 调用记录:自动记录每一次调用的参数、返回值以及异常。
  3. 断言能力:提供丰富的方法验证函数是否被调用、是否以预期参数调用、是否抛出指定异常。

安装与版本要求

通过 pip 即可安装:

pip install kgb

根据 NEWS.rst:1-7 的发布说明,kgb 当前发布版本(截至 7.3 alpha)为 (7, 3, 1, 'alpha', 0, False),资料来源:kgb/__init__.py:30-50。版本兼容性演进如下:

版本新增兼容的 Python重要变更
kgb 7.0Python 3.10引入 pytest 插件,添加 snake_case 断言方法
kgb 7.1Python 3.11完成 3.11 兼容性修复(对应社区 Issue #9)
kgb 7.1.1打包包含 LICENSE 文件(对应 Issue #10)
kgb 7.2Python 3.13修复 3.13 函数对象变更引发的崩溃(对应 Issue #11)
kgb 7.3Python 3.14新增 SpyAgency.get_spy(),修复生成器函数的 DeprecationWarning

kgb 7.0 起正式放弃对 Python 2.6、3.4、3.5 的支持,资料来源:NEWS.rst:33-52

核心概念与架构

kgb 的内部架构由四个互相协作的组件构成:SpyAgencyFunctionSpySpyCall 以及一组 SpyOp* 操作符。

flowchart LR
    A[测试代码] --> B[SpyAgency<br/>spy_on / spy_for]
    B --> C[FunctionSpy<br/>替换函数对象]
    C --> D[SpyCall<br/>单次调用记录]
    D --> E{SpyOp* 操作符}
    E -->|SpyOpReturn| F[返回值替换]
    E -->|SpyOpRaise| G[抛出异常]
    E -->|SpyOpMatchAny / InOrder| H[参数匹配]
  • SpyAgency:负责登记、追踪和清理所有间谍。可以在 unittest.TestCase 中作为 mixin 混入,也支持直接 SpyAgency() 实例化,资料来源:kgb/agency.py:11-60
  • FunctionSpy:在函数对象层面替换原始实现,记录每次调用上下文,并支持 call_original/call_fake/返回值/异常替换,资料来源:kgb/spies.py:1-50
  • SpyCall:对应一次具体的调用记录,包含参数、返回值与异常信息,资料来源:kgb/spies.py:1-30
  • SpyOp 操作符:通过 SpyOpReturnSpyOpReturnInOrderSpyOpMatchAny 等对象控制间谍在多次调用时的不同行为,资料来源:kgb/__init__.py:15-28

函数签名层面的内部工作委托给 kgb.signature.BaseFunctionSig,它会针对不同 Python 版本(CPython、PyPy、不同小版本)生成相应的间谍代码对象,资料来源:kgb/signature.py:1-60。常见错误(如重复间谍)由 kgb.errors.ExistingSpyErrorIncompatibleFunctionError 提供友好提示,资料来源:kgb/errors.py:14-46

四种启动间谍的方式

README 中介绍了四种主要的间谍启动方式,资料来源:README.rst:60-130

直接实例化 SpyAgency

from kgb import SpyAgency

def test_mind_control_device():
    mcd = MindControlDevice()
    agency = SpyAgency()
    agency.spy_on(mcd.assassinate, call_fake=give_hugs)

混入 unittest TestCase

import unittest
from kgb import SpyAgency

class TopSecretTests(SpyAgency, unittest.TestCase):
    def test_doomsday_device(self):
        dd = DoomsdayDevice()
        @self.spy_for(dd.kaboom)
        def _save_world(*args, **kwargs):
            print('Sprinkles and ponies!')
        dd.kaboom()

使用 pytest fixture

kgb 7.0 起提供 pytest 插件,在测试中可直接注入 spy_agency,测试结束后自动 unspy_all(),资料来源:kgb/pytest_plugin.py:1-30

def test_doomsday_device(spy_agency):
    @spy_agency.spy_for(dd.kaboom)
    def _save_world(*args, **kwargs):
        ...

上下文管理器

仅需一个临时间谍时,可以使用 with spy_on(...),离开上下文即自动注销,资料来源:kgb/contextmanagers.py:1-30

from kgb import spy_on

def test_the_bomb():
    bomb = Bomb()
    with spy_on(bomb.explode, call_original=False):
        bomb.explode()  # 不会爆炸

快速入门示例

下面给出一个最小可运行示例,覆盖"安装间谍 → 调用 → 断言 → 还原"完整流程:

from kgb import SpyAgency

class SampleTests(SpyAgency):
    def test_calls(self):
        target = TargetClass()

        # 启动间谍:阻止原函数被调用,并提供伪造返回值
        self.spy_on(target.dangerous_call,
                    call_original=False,
                    call_fake=lambda *a, **kw: 'safe')

        # 业务调用
        result = target.dangerous_call(1, mode='test')
        assert result == 'safe'

        # 断言调用次数与参数
        self.assertSpyCalledWith(target.dangerous_call, 1, mode='test')
        self.assertSpyCalledOnceWith(target.dangerous_call, 1, mode='test')

        # tearDown 会自动 unspy_all

如果不想继承 SpyAgency,可以在 pytest 中通过 spy_agency.assert_spy_called_with(...) 完成同样的断言,资料来源:kgb/pytest_plugin.py:1-25;在其它环境下可以使用独立断言函数 from kgb.asserts import assert_spy_called,资料来源:kgb/asserts.py:1-15

已知问题与最佳实践

社区中已记录的若干使用陷阱值得注意:

  • 重复间谍:使用 DDT 等参数化测试时,同一函数会被多次设置间谍。重复设置会抛出 ExistingSpyError,并附带上一次间谍设置的堆栈,便于定位,资料来源:kgb/errors.py:14-37
  • Python 版本兼容性:PyPy 3.11 上 test_spy_on_generator 存在已知失败(Issue #13)。3.13 早期 beta 中闭包 + 间谍的组合会崩溃,已在 kgb 7.2 修复(Issue #11)。3.12 移除了 assertRaisesRegexp,但 kgb 自身未直接依赖该别名(Issue #12)。
  • 异步测试:可通过 asynctest.TestCase 配合 SpyAgency mixin 来测试异步函数(Issue #4)。
  • call_fake 多返回值:若希望不同调用返回不同结果,可在 call_fake 中维护状态,或改用 SpyOpReturnInOrder 实现顺序返回,资料来源:kgb/__init__.py:20-28

最佳实践:每次测试结束后调用 agency.unspy_all()(在 SpyAgency.tearDown() 中会自动执行),并在可能的情况下优先使用 pytest 插件或上下文管理器,以减少手动清理负担,资料来源:kgb/agency.py:40-60

See Also

  • kgb 7.2 发布说明:<https://github.com/beanbaginc/kgb/releases/tag/release-7.2>
  • kgb 在 PyPI:<https://pypi.org/project/kgb/>
  • 相关 Issue 列表:#4、#5、#7、#8、#9、#10、#11、#12、#13

来源:https://github.com/beanbaginc/kgb / 项目说明书

核心架构:FunctionSpy、签名内省与字节码替换

kgb 是一个面向 Python 的函数间谍(function spy)库,其核心能力是「在不改动调用方代码的前提下」拦截任意可调用对象并记录其行为。整体架构围绕三个相互协作的层次展开:FunctionSpy 负责运行时拦截与状态记录,FunctionSig 负责跨 Python 版本的函数签名内省,SpyCall 负责把每一次调用实例化为可断言的对象。最高层则由 SpyA...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述与设计目标

kgb 是一个面向 Python 的函数间谍(function spy)库,其核心能力是「在不改动调用方代码的前提下」拦截任意可调用对象并记录其行为。整体架构围绕三个相互协作的层次展开:FunctionSpy 负责运行时拦截与状态记录,FunctionSig 负责跨 Python 版本的函数签名内省,SpyCall 负责把每一次调用实例化为可断言的对象。最高层则由 SpyAgency 统一管理所有间谍的生命周期,包括与 unittest.TestCase 的 mixin 集成以及 pytest 插件的 fixture 支持。

这种分层设计的目的,是为了在 Python 2.7 直至 3.14 之间的多版本差异下,提供一套统一而稳定的「拦截—记录—断言」API。资料来源:kgb/spies.py:1-40kgb/signature.py:1-20

FunctionSpy:间谍代理

FunctionSpy 是 kgb 的核心类,它在内部持有一个「原始函数对象」与一个「替换函数对象」,并通过 __call__ 暴露与原函数完全一致的调用接口。每次被调用时,spy 都会先记录参数、转发至 call_fake 或原函数、再记录返回值与异常,最后把结果回传给调用方。资料来源:kgb/spies.py:1-60

spy 的三种工作模式如下表所示。

模式触发参数行为
透传模式默认调用 call_original() 执行原始函数
阻断模式call_original=False完全不调用原函数,返回 None
替代模式call_fake=fn调用 fn(*args, **kwargs) 取代原函数

calls 列表中可访问每一次调用的 SpyCall 对象,从而查询是否抛出了 TypeError、返回值是否匹配等。spy_on() 的入口同时支持位置参数与关键字参数,并通过 assertSpyCalledWithassertSpyLastCalledWith 等命名风格方法(kgb 7+ 还提供 assert_spy_called_with 蛇形命名别名)进行断言。资料来源:kgb/agency.py:1-80kgb/calls.py:1-50

签名内省:FunctionSig 层次结构

由于 Python 3.0 起 inspect.getfullargspec 取代了 getargspec,并且 3.8+ 引入了仅限位置参数(positional-only parameters),kgb 通过 FunctionSigPy2 / FunctionSigPy3 两个子类做版本分流,并在模块底部按 sys.version_info[0] 选定具体实现。资料来源:kgb/signature.py:1-30

内省过程需要解决三件事:确定函数的「真正所有者」(区分类方法、绑定方法、静态方法)、解析参数顺序与默认值、以及为生成替换代码对象提供 format_arg_spec() 输出。在 Python 3 分支中,FunctionSigPy3.format_arg_spec 直接基于 inspect.Signature 重建参数列表,并把默认值占位为 _UNSET_ARG,从而让生成的转发函数能在调用时动态注入真实参数。资料来源:kgb/signature.py:60-110

辅助函数 get_defined_attr_value 用于在类的 __dict__ 与所有 __bases__ 中递归查找真实定义,绕过描述符(descriptor)协议的影响——这是判断一个方法究竟属于「绑定方法」还是「未绑定方法」的前提。资料来源:kgb/utils.py:1-40

字节码替换机制

kgb 实现 spy 的关键在于「代码对象替换」:它不修改原函数体,而是构造一个与原函数共享 __globals____name____defaults__ 等元数据的新 code 对象,然后把这个新 code 装入原函数。这样,调用栈中的所有位置看到的都是「同一个函数对象」,却执行了不同的字节码。资料来源:kgb/spies.py:100-180

flowchart LR
    A[原始函数 func] -->|spy_on| B[FunctionSpy]
    B -->|读取签名| C[FunctionSigPy3]
    C -->|format_arg_spec| D[生成转发函数源码]
    D -->|compile| E[新 code 对象]
    E -->|func.__code__ = new_code| F[拦截生效]
    F -->|调用| G[SpyCall 记录]
    G -->|call_original / call_fake| H[返回值/异常]

在 3.11 之前,这一替换策略相对稳定;但 CPython 3.11 引入的「内联生成器 / 协程标志」以及 3.13 改动的函数构造方式,使早期 kgb 出现崩溃。issue #11 报告的闭包崩溃案例,正是因为新版本对 gi_codeco_flags 的处理更严格;kgb 7.2 之后通过把 CO_GENERATOR / CO_COROUTINE / CO_ASYNC_GENERATOR 标志从旧 code 镜像到新 code 解决了 3.13 的崩溃。资料来源:kgb/spies.py:120-170issue #11

调用追踪与代理管理

SpyCall 持有 spyargskwargsreturn_valueexception 五个字段,并提供 called_with()raised()returned() 等语义化查询。这些方法以「子集匹配」为原则——传入的参数只需是真实调用参数的前缀,从而让断言更宽容。资料来源:kgb/calls.py:1-60

SpyAgency 是 spy 的注册中心,其内部 self.spies 集合确保同一函数不能被重复 spy,否则抛出 ExistingSpyError。当 SpyAgency 以 mixin 形式被 TestCase 继承时,tearDown 会自动调用 unspy_all();pytest 用户则通过 spy_agency fixture 获得同样的自动清理。资料来源:kgb/agency.py:1-50kgb/pytest_plugin.py:1-20

已知限制与跨版本兼容性

社区中讨论较多的几个边界场景均与字节码替换的版本敏感性相关:

  • PyPy 3.11 上的生成器 spyissue #13 报告 test_spy_on_generator 失败,因为 PyPy 的代码对象布局与 CPython 存在差异。kgb 7.3 的 NEWS 中也专门提到修复了 spy 生成器函数时的 DeprecationWarning
  • Python 3.10 未绑定方法issue #8 显示 call_original 对无实例方法支持不佳,已在 7.1.1 后续版本逐步完善。
  • asynctest 异步用例issue #4 中用户通过把 SpyAgencyasynctest.TestCase 多重继承来实现 async def 测试,这是 mixin 模式的合理外推。
  • 重复 spyissue #5 中用户在 DDT 参数化测试里多次执行同一 spy 触发 ExistingSpyError,需要在每个测试用例的 setUp 中重新初始化 agency。

整体而言,kgb 通过「签名内省 → 字节码构造 → 运行时拦截 → 调用记录」四级流水线,把 Python 跨版本差异封装在 FunctionSigspies.py 的版本分支中,使上层用户面对的是稳定而一致的 API。资料来源:kgb/NEWS.rst:1-30kgb/__init__.py:1-40

See Also

来源:https://github.com/beanbaginc/kgb / 项目说明书

Spy 操作规划、调用跟踪与断言

kgb 的核心价值在于三件事:拦截函数调用、记录调用上下文、断言调用行为。本页聚焦于这三件事背后的内部机制——BaseSpyOperation/SpyOp 系列(规划调用应如何被响应)、SpyCall(记录每一次调用的实参、关键字、返回值、异常),以及 SpyAgency 与 kgb.asserts(基于上述记录进行断言)。它们共同构成"spy 三件套",使测试代码既能控制...

章节 相关页面

继续阅读本节完整说明和来源证据。

概述

kgb 的核心价值在于三件事:拦截函数调用记录调用上下文断言调用行为。本页聚焦于这三件事背后的内部机制——BaseSpyOperation/SpyOp* 系列(规划调用应如何被响应)、SpyCall(记录每一次调用的实参、关键字、返回值、异常),以及 SpyAgencykgb.asserts(基于上述记录进行断言)。它们共同构成"spy 三件套",使测试代码既能控制被测函数的副作用,也能事后验证它确实被以预期方式调用过。

资料来源:kgb/ops.py:1-12kgb/calls.py:1-9kgb/agency.py:1-19

资料来源:kgb/ops.py:1-12kgb/calls.py:1-9kgb/agency.py:1-19

Python 兼容性、框架集成与常见问题

本页聚焦于 kgb 在不同 Python 解释器与测试框架中的兼容策略、集成方式以及社区中常见的故障与排查思路。kgb 通过版本分支机制和分发插件机制,使其能在多种环境下保持一致的间谍(spy)行为。

章节 相关页面

继续阅读本节完整说明和来源证据。

章节 分支选择机制

继续阅读本节完整说明和来源证据。

章节 函数代码对象的版本适配

继续阅读本节完整说明和来源证据。

章节 与 PyPy 的兼容性

继续阅读本节完整说明和来源证据。

Python 版本兼容策略

kgb 不是一个"一码通吃"的库。它通过运行时检查 sys.version_info 来选择不同的实现分支,以应对 Python 解释器在函数对象表示、签名规范和字节码结构上的差异。

分支选择机制

kgb/signature.py 末尾,kgb 通过版本三元组选择具体的 FunctionSig 实现:

  • FunctionSigPy2 适用于 Python 2;
  • FunctionSigPy3 适用于 Python 3,并使用 inspect.Signature 处理参数;
  • 其余版本会抛出 Exception('Unsupported Python version')

这种分支式设计使得 kgb 能在 Python 2.7 和 3.6 至 3.11 的广泛范围内正常工作。最新版本 kgb 7.3 又新增了对 Python 3.14 的支持。

函数代码对象的版本适配

FunctionSpy 在替换原函数时,需要构造一个与原函数签名兼容的新代码对象。在 kgb/spies.py 中可以看到,kgb 对 temp_code.replace(...) 的调用会根据 Python 版本传入不同的关键字参数。特别地,对于 3.11+,kgb 会镜像 co_flags 上的 CO_GENERATORCO_COROUTINECO_ASYNC_GENERATOR 标志位,避免在替换生成器函数时触发解释器的 DeprecationWarningkgb 7.3 修复)。

与 PyPy 的兼容性

kgb/spies.py 中针对 PyPy 3.11 的生成器函数间谍测试存在已知缺陷(Issue #13)。这是由于 PyPy 的字节码格式与 CPython 不同所导致。如果项目需要同时覆盖 CPython 与 PyPy,建议在使用 spy_on 包装生成器函数时增加 CI 矩阵验证。

框架集成

kgb 的设计目标是同时支持 unittest、pytest 以及第三方异步测试框架。

pytest 插件集成

kgb/pytest_plugin.py 注册了一个名为 spy_agency 的 pytest fixture。它在测试执行前实例化一个 SpyAgency,并在测试结束后调用 agency.unspy_all() 自动清理间谍:

@pytest.fixture
def spy_agency():
    agency = SpyAgency()
    try:
        yield agency
    finally:
        agency.unspy_all()

只要安装 kgb,pytest 会自动发现这个插件;用户也可以通过显式声明 pytest_plugins = ['kgb.pytest_plugin'] 来加载。

unittest 集成

SpyAgency 实现了 tearDown,因此可以当作 mixin 混入 unittest.TestCase 的子类(kgb/agency.py)。当 SpyAgencyTestCase 一起使用时,每个测试方法运行结束后都会自动解除间谍注册,避免跨用例的污染。

独立断言函数

kgb/asserts.py 提供了一套独立于 mixin 的断言函数。它在模块加载时实例化一个共享的 _agency,并把 SpyAgency 中所有以 assert_ 开头的方法重新暴露为模块级函数。这样在 pytest 函数式测试中可以直接调用 assert_spy_called_with(...),无需显式创建机构。

异步测试框架(asynctest)

社区已验证 kgb 可与 asynctest 配合使用(Issue #4)。典型做法是将 SpyAgencyasynctest.TestCase 多重继承:

import asynctest
from kgb import SpyAgency

class testApi(SpyAgency, asynctest.TestCase):
    async def test_register(self):
        ...

由于 spy_onassert_spy_* 都不涉及阻塞或事件循环,普通 spy 可在 async def 中安全使用;若需要 spy 协程函数本身,则依赖前述的 CO_COROUTINE 标志位镜像机制。

常见错误与排查思路

ExistingSpyError

kgb/errors.py 定义了 ExistingSpyError,它在重复注册间谍时抛出。错误消息会打印第一次注册时的栈帧回溯,便于定位"未清理"的代码路径。在 Issue #5 中,使用 DDT 进行参数化测试时常见此错误——DDT 会把同一个测试函数展开成多个用例,每个用例都需要重新注册间谍。建议在参数化测试外显式调用 spy.unspy() 或在 fixture 层使用 spy_agency

Python 3.13 上的闭包崩溃

Issue #11 报告了在 Python 3.13 b2 上,结合闭包外层函数与 SpyAgency mixin 触发的崩溃。该问题已在 kgb 7.2 发布说明 中修复,原因是 3.13 重构了函数对象的构造方式。如果仍在使用 7.1 或更早版本,建议升级到 >= 7.2。

Python 3.12 上 `assertRaisesRegexp` 失效

Issue #12 指出 Python 3.12 移除了 unittest.TestCase.assertRaisesRegexp 别名,导致部分历史测试失败。如果你的测试代码沿用旧别名,应替换为 assertRaisesRegex

PyCharm 静态分析误报

spy_on(*args, **kwargs) 的文档中使用了 *args (tuple) 写法(kgb/pytest_plugin.pykgb/contextmanagers.py),PyCharm 会把 tuple 误识别为内置类型而非 Python 的 *args 语义(Issue #7)。规避方式是使用 *args: tuple*args: Any 风格。

总体流程示意

下图概括了 kgb 在一次典型 spy 调用中的版本检测、对象构造和清理路径:

flowchart TD
    A[pytest/unittest 启动测试] --> B{是否使用 spy_agency fixture?}
    B -- 是 --> C[SpyAgency 实例化]
    B -- 否 --> D[用户手动创建 SpyAgency 或 with spy_on]
    C --> E[FunctionSpy 解析函数签名]
    D --> E
    E --> F{Python 版本分支}
    F -- Py3 --> G[FunctionSigPy3 + inspect.Signature]
    F -- Py2 --> H[FunctionSigPy2 + inspect.formatargspec]
    G --> I[构造新代码对象并镜像 co_flags]
    H --> I
    I --> J[替换原函数并记录 calls]
    J --> K[测试执行完毕]
    K --> L{自动清理?}
    L -- 是 (fixture/tearDown) --> M[unspy_all]
    L -- 否 --> N[手动 spy.unspy 或抛 ExistingSpyError]

版本历史速查

下表总结了 kgb 各版本对 Python 解释器和测试框架的关键变更,便于在选型时参考。

版本发布日期主要兼容性变更
7.02022-01-20显式支持 Python 3.10;新增 pytest 插件;提供 snake_case 断言方法
7.12022-08-04支持 Python 3.11
7.1.12022-08-06加入 LICENSE 文件以便打包分发
7.22024-11-03修复 Python 3.13 上的崩溃
7.32025-12-09支持 Python 3.14;新增 SpyAgency.get_spy()

资料来源:NEWS.rst

See Also

资料来源:NEWS.rst

失败模式与踩坑日记

保留 Doramagic 在发现、验证和编译中沉淀的项目专属风险,不把社区讨论只当作装饰信息。

high 来源证据:`kgb/tests/test_function_spy.py::FunctionSpyTests::test_spy_on_generator` fails on PyPy3.11

可能增加新用户试用和生产接入成本。

high 来源证据:Crashes with Python 3.13 b2

可能阻塞安装或首次运行。

medium 来源证据:Pytest failing on python 3.10

可能增加新用户试用和生产接入成本。

medium 来源证据:Python 3.11 compatibility

可能增加新用户试用和生产接入成本。

Pitfall Log / 踩坑日志

项目:beanbaginc/kgb

摘要:发现 12 个潜在踩坑项,其中 2 个为 high/blocking;最高优先级:安装坑 - 来源证据:kgb/tests/test_function_spy.py::FunctionSpyTests::test_spy_on_generator fails on PyPy3.11。

1. 安装坑 · 来源证据:`kgb/tests/test_function_spy.py::FunctionSpyTests::test_spy_on_generator` fails on PyPy3.11

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:kgb/tests/test_function_spy.py::FunctionSpyTests::test_spy_on_generator fails on PyPy3.11
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/beanbaginc/kgb/issues/13 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

2. 配置坑 · 来源证据:Crashes with Python 3.13 b2

  • 严重度:high
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个配置相关的待验证问题:Crashes with Python 3.13 b2
  • 对用户的影响:可能阻塞安装或首次运行。
  • 证据:community_evidence:github | https://github.com/beanbaginc/kgb/issues/11 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

3. 安装坑 · 来源证据:Pytest failing on python 3.10

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Pytest failing on python 3.10
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/beanbaginc/kgb/issues/8 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

4. 安装坑 · 来源证据:Python 3.11 compatibility

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个安装相关的待验证问题:Python 3.11 compatibility
  • 对用户的影响:可能增加新用户试用和生产接入成本。
  • 证据:community_evidence:github | https://github.com/beanbaginc/kgb/issues/9 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

5. 能力坑 · 能力判断依赖假设

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:README/documentation is current enough for a first validation pass.
  • 对用户的影响:假设不成立时,用户拿不到承诺的能力。
  • 证据:capability.assumptions | github_repo:10215090 | https://github.com/beanbaginc/kgb | README/documentation is current enough for a first validation pass.

6. 运行坑 · 来源证据:ExistingSpyError: The function <function foobar at ......> has already been spied on.

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个运行相关的待验证问题:ExistingSpyError: The function <function foobar at ......> has already been spied on.
  • 对用户的影响:可能阻塞安装或首次运行。
  • 证据:community_evidence:github | https://github.com/beanbaginc/kgb/issues/5 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

7. 维护坑 · 来源证据:3.12+: `assertRaisesRegexp` alias removed

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:GitHub 社区证据显示该项目存在一个维护/版本相关的待验证问题:3.12+: assertRaisesRegexp alias removed
  • 对用户的影响:可能影响升级、迁移或版本选择。
  • 证据:community_evidence:github | https://github.com/beanbaginc/kgb/issues/12 | 来源讨论提到 python 相关条件,需在安装/试用前复核。

8. 维护坑 · 维护活跃度未知

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:未记录 last_activity_observed。
  • 对用户的影响:新项目、停更项目和活跃项目会被混在一起,推荐信任度下降。
  • 证据:evidence.maintainer_signals | github_repo:10215090 | https://github.com/beanbaginc/kgb | last_activity_observed missing
  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 证据:downstream_validation.risk_items | github_repo:10215090 | https://github.com/beanbaginc/kgb | no_demo; severity=medium

10. 安全/权限坑 · 存在评分风险

  • 严重度:medium
  • 证据强度:source_linked
  • 发现:no_demo
  • 对用户的影响:风险会影响是否适合普通用户安装。
  • 证据:risks.scoring_risks | github_repo:10215090 | https://github.com/beanbaginc/kgb | no_demo; severity=medium

11. 维护坑 · issue/PR 响应质量未知

  • 严重度:low
  • 证据强度:source_linked
  • 发现:issue_or_pr_quality=unknown。
  • 对用户的影响:用户无法判断遇到问题后是否有人维护。
  • 证据:evidence.maintainer_signals | github_repo:10215090 | https://github.com/beanbaginc/kgb | issue_or_pr_quality=unknown

12. 维护坑 · 发布节奏不明确

  • 严重度:low
  • 证据强度:source_linked
  • 发现:release_recency=unknown。
  • 对用户的影响:安装命令和文档可能落后于代码,用户踩坑概率升高。
  • 证据:evidence.maintainer_signals | github_repo:10215090 | https://github.com/beanbaginc/kgb | release_recency=unknown

来源:Doramagic 发现、验证与编译记录