You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置tox,使其在代码含TODO时执行失败?

配置tox检测代码中的TODO并在存在时执行失败

当然可以!你完全可以通过配置tox,让它在检测到代码中存在TODO注释时直接执行失败,这样就能在提交代码前把这类未完成的标记拦下来。下面给你两种实用的实现方法:

方法一:直接在tox.ini中集成grep命令

这种方法最简单,不需要额外写脚本,直接利用shell命令的退出码逻辑来实现。

核心逻辑

grep命令的退出码规则是:

  • 找到匹配内容时返回0(成功)
  • 未找到匹配时返回1(无错误但无结果)
  • 发生错误时返回2

我们需要反转这个逻辑:当找到TODO时让命令返回非0(失败),未找到时返回0(成功)。可以用shell的!符号来反转命令的退出码。

tox.ini配置示例

[tox]
envlist = py38, check-todo  # 把检查TODO的环境加入到默认执行列表

[testenv]
commands = pytest  # 你的常规测试命令

[testenv:check-todo]
basepython = python  # 这里用python只是占位,实际执行的是shell命令
commands = ! grep -rnI "TODO" foodir

如果想让TODO检查和常规测试绑定在一起(每次跑测试前先检查TODO),可以把检查命令加到[testenv]的commands列表里:

[testenv]
commands =
    ! grep -rnI "TODO" foodir
    pytest

方法二:用Python脚本实现更灵活的检查

如果需要更复杂的规则(比如允许带有特定标记的TODO、只检查特定类型的文件),可以写一个简单的Python脚本,让tox执行这个脚本并根据脚本的退出码判断结果。

编写检查脚本(check_todo.py)

import os
import re

# 自定义规则:匹配TODO,忽略大小写
TODO_PATTERN = re.compile(r'TODO', re.IGNORECASE)
# 允许的例外标记:带有这个标记的TODO不会触发失败
ALLOWED_TODO_MARKER = 'ALLOWED'

def check_todos(target_dir):
    for root, _, files in os.walk(target_dir):
        for file in files:
            # 只检查Python文件,可根据需要调整后缀
            if file.endswith('.py'):
                file_path = os.path.join(root, file)
                with open(file_path, 'r', encoding='utf-8') as f:
                    for line_num, line in enumerate(f, 1):
                        match = TODO_PATTERN.search(line)
                        # 如果找到TODO且不包含允许标记,输出位置并返回失败
                        if match and ALLOWED_TODO_MARKER not in line:
                            print(f"❌ Found unallowed TODO in {file_path}:{line_num}")
                            return 1
    # 未找到违规TODO,返回成功
    print("✅ No unallowed TODO found")
    return 0

if __name__ == '__main__':
    exit(check_todos('foodir'))

tox.ini配置示例

[tox]
envlist = py38, check-todo

[testenv]
commands = pytest

[testenv:check-todo]
basepython = python
commands = python check_todo.py

为什么这样可行?

tox是根据命令的退出码来判断环境执行是否成功的:只要命令返回0就视为成功,返回非0则视为失败。上面两种方法都是通过控制命令/脚本的退出码,让tox在检测到TODO时返回失败状态,从而阻止后续流程或者直接提示检查不通过,正好满足你提交前验证的需求。

内容的提问来源于stack exchange,提问作者Martin Thoma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:29:26