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 步)
- 方法 looks_like_dead_code() 为您提供了一种实际做某事并为其他开发人员留下注释的方法。改善现状只需要几秒钟。
- 如果您有 Tickler file System,您可以提醒自己在六个月后检查此代码。至少在我的上下文中,如果这行几个月没有执行,我可以非常确定这是死代码。
我需要重构一个大遗留 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 步)
- 方法 looks_like_dead_code() 为您提供了一种实际做某事并为其他开发人员留下注释的方法。改善现状只需要几秒钟。
- 如果您有 Tickler file System,您可以提醒自己在六个月后检查此代码。至少在我的上下文中,如果这行几个月没有执行,我可以非常确定这是死代码。