python - 如何删除未涵盖的Python代码

标签 python dependencies code-coverage minify

是否有一个工具可以删除运行时未覆盖的Python代码,或者是否有一个工具可以删除特定函数不依赖的代码?如果没有,什么是好的方法?

这是我更具体的问题:

我需要 github 上 networkx 算法模块的 ma​​xflow 子集

通常我只会下载整个库,然后导入我需要的模块:

1).我需要将其中一些算法打印到纸上。

2).有些比赛有一位在线评委来运行您的代码。法官没有安装 networkx,因此我需要将所需的代码剪切并粘贴到单个 .py 文件中,然后再上传到法官。法官规定文件大小限制为 50,000 字节。

例如,剪切并粘贴一个函数后

def ford_fulkerson(G, s, t, capacity='capacity'):

但是ford_fulkerson依赖于其他算法、networkx自定义错误以及整个networkx图和有向图类。

剪切并粘贴这些依赖项后,我的代码从 50 行增加到 3000 行。

我查看了一些应该涵盖所有内容的测试用例的覆盖率,但覆盖率仅为 39%。这 39% 中的大部分只是读取甚至没有使用过的函数的函数名称。

C:\Users\robert\code\play\spoj>coverage run TOSCORE.py < in.txt
No goal
Goal

C:\Users\robert\code\play\spoj>coverage report -m
Name      Stmts   Miss  Cover   Missing
---------------------------------------
TOSCORE     733    444    39%   226, 233, 236, 252, 280-283, 301, 377-389, 437-4
56, 489-497, 526-534, 568-570, 597, 618, 633, 655-658, 712-715, 772-801, 835, 86
4-869, 900-906, 948-949, 988-991, 1011-1014, 1107, 1115-1119, 1167-1170, 1195, 1
221, 1257-1260, 1297-1308, 1328-1331, 1357, 1361, 1406-1415, 1452, 1493-1512, 15
38, 1570-1574, 1600, 1636-1640, 1673-1677, 1704-1707, 1731-1733, 1757-1759, 1803
-1828, 2029, 2078-2091, 2142-2154, 2160, 2193-2203, 2232-2243, 2296, 2300-2301,
2305-2307, 2309-2311, 2359-2391, 2424-2425, 2455-2459, 2467, 2474, 2483-2484, 24
90-2491, 2498, 2502, 2551-2562, 2588-2599, 2608, 2645-2658, 2698-2709, 2747-2758
, 2798-2801, 2838-2841, 2859-2862, 2867, 2910, 2949-2963, 2979-2990, 3032-3055,
3084, 3091-3092, 3134-3140, 3148-3151, 3178-3180, 3192, 3198, 3208, 3254, 3265-3
283

最佳答案

在我看来,作为第一次尝试,可以使用 coverage 的输出作为读取原始 TOSCORE.py 的(比如说)Python 脚本的输入> 并写出了一个 TOSCORE.py 版本,省略了所有未覆盖的行。

但实际上,这种方法可能有点幼稚。更复杂的方法可能是:

  1. 获取由coverage生成的未覆盖线的列表。
  2. 找到第一个长度超过 1 行的未覆盖行 block (假设单个未覆盖行不太可能是整个未使用的函数)。
  3. 写出省略该 block 的 TOSCORE.py 版本。
  4. TOSCORE.py 的修订版本上运行测试套件。
  5. 如果测试成功运行,请返回步骤 1,使用 TOSCORE.py 的修订版本作为覆盖率的 TOSCORE.py 基本版本待测量。
  6. 如果省略给定的未覆盖代码块导致测试失败,请继续尝试省略下一个未覆盖代码块。

这可能需要一段时间才能执行,但应该确保生成的缩短代码通过所有测试。

执行时间较短的中间方法会尝试在再次运行测试之前一次省略几个未覆盖的代码块。

更复杂的方法可能是插入一个 pass 语句来代替我们省略的行(以第一个省略行的缩进为前缀),以处理未覆盖的行包含在未使用的 if 语句分支或未使用的 while 循环,因此仅省略这些行就会导致错误。

关于python - 如何删除未涵盖的Python代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800018/

相关文章:

winforms - 如何使用 NuGet 工作流程避免因程序集版本不匹配而导致的 Winforms 设计器错误

java - 如何为用 java 和 angular 编写的 Web 服务代码启用代码覆盖率

python - scapy:如何从 fields_desc 获取 ByteEnumField 值?

python - 如何根据日期条件从多索引中删除特定列

Java Jersey 声明性超链接配置

python - Py.Test : Report using --cov, 排除了报告中的一些 'def' 并且没有显示任何失败

java - JaCoCo 报告在 Jenkins : java. lang.ArrayIndexOutOfBoundsException 中失败

python - 如何将 PIL ImageDraw 转换为 Image

python - 如果回答 : BLAH import script,我如何制作像 answer = raw_input() 这样的 python 脚本

java - 为什么在完成组装任务之前不能复制依赖项?