Python:检测从未在生产中执行的代码

Python: Detect code which gets never executed in production

我需要重构一个大遗留 Python 代码库。

我经常想"these lines don't get executed in production any more"。

但我不确定。

有一些测试触及这些线。但是我不能确定在生产中是否真的没有使用。

遇到这种情况我该怎么办?

这个问题是关于生产系统的覆盖率。这个问题与 testing/CI.

期间的报道无关

我不想注释掉那几行,因为我不想在生产系统中产生错误。

通常的做法是在该代码行中使用日志记录。例如您有一段您认为未使用的代码。您在该代码块的开头添加 try catch 块。在 trycatch 中,您将行添加到与您的可疑代码块同名的特定 json。

try:
    with open("block1.dat", "rb") as file:
        activity = pickle.load(file)

    curtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    currentact = "dt = {}; code done that: var1 = {}, 
        var2 = {}".format(curdate, var1, var2)

    activity.append(currentact)

    file = open("block1.dat", "ab")
    pickle.dump(activity, file)
    file.close()
except Exception: pass

您可以使用电报 api 来记录代码。一段时间后,您将了解您的代码工作的频率以及它的作用。 然后你监控一段时间,如果一个月没有任何反应,你可以评论区块。

生产系统是确定性的吗? 它是互动的吗? 控制流是否取决于输入数据? 您可以访问所有可能的输入吗? 测试的存在是有原因的还是仅仅因为?

除非我知道没有很少发生的异常情况,否则我会根据需要根据日志记录小心删除代码。

我会按照常见的代码路径尝试逐段理解代码库,以便找出可以简化的地方。如果不了解您正在处理的系统,很难给出更具体的建议。

我们使用一个简单的模式来处理这个问题:looks_like_dead_code(my_string)

这是一种记录字符串 "my_string" 的方法。

用法示例:

    if ext == '.jpe':
        looks_like_dead_code('2018-11-30 tguettler: looks fixed in mime_type_to_extension')

不强制使用日期和开发者登录,这只是最佳实践。

如果该行被执行,负责检查日志的人将与开发人员交谈。

由于我们的生产环境大约每两周更新一次,您可以确定这行代码在过去几个月没有执行。

我喜欢这个解决方案,因为在大多数情况下它是这样的:

  1. 您想修复错误或实施新功能
  2. 您查看代码并看到一些看起来像死代码的行。我的意思是无用的代码,因为它不会再被执行。
  3. 您没有时间进行调查。您可以模糊地猜测这是死代码。你想做你的实际工作(修复错误或实现新功能。请参阅第 1 步)
  4. 方法 looks_like_dead_code() 为您提供了一种实际做某事并为其他开发人员留下注释的方法。改善现状只需要几秒钟。
  5. 如果您有 Tickler file System,您可以提醒自己在六个月后检查此代码。至少在我的上下文中,如果这行几个月没有执行,我可以非常确定这是死代码。