如何检查模块/类/方法是否已更改并记录更改?

0 投票
2 回答
1007 浏览
提问于 2025-04-16 06:44

我正在尝试比较两个模块、类或方法,看看它们是否有变化。我们允许用户修改类和方法,处理完后会把这些修改保存下来,而不是覆盖旧的类和方法。不过,在我们确认新的类之前,需要先判断代码是否有变动,以及方法的功能是否有变化,比如输出结果不同,或者在相同输入下性能也不同。我对性能变化没问题,但我关心的是代码的变化,以及如何记录这些变化。我写了下面这样的代码:

class TestIfClassHasChanged(unittest.TestCase):
    def setUp(self):
       self.old = old_class()
       self.new = new_class()    
    def test_if_code_has_changed(self): 
       # simple case for one method
       old_codeobject = self.old.area.func_code.co_code
       new_codeobject = self.new.area.func_code.co_code
       self.assertEqual(old_codeobject, new_codeobject)

这里的 area() 是两个类中的一个方法。不过,如果我有很多方法,我看到的就是要遍历所有的方法。有没有可能在类或模块的层面上进行这个操作呢?

其次,如果我发现代码对象不相等,我想记录这些变化。我使用了 inspect.getsource(self.old.area)inspect.getsource(self.new.area) 来比较这两个,找出不同之处,是否有更好的方法来做到这一点呢?

2 个回答

0

如果我有很多方法,我看到的是在循环遍历所有的方法。有没有可能在类或模块的层面上做到这一点呢?

我不会问你为什么想这么做,但答案是可以的,这里有一个例子:

import inspect
import collections

# Here i will loop over all the function in a module

module = __import__('inspect')   # this is fun !!!

# Get all function in the module.
list_functions = inspect.getmembers(module, inspect.isfunction)

# Get classes and methods correspond .
list_class = inspect.getmembers(module, inspect.isclass)

class_method = collections.defaultdict(list)

for class_name, class_obj in list_class:
    for method in inspect.getmembers(class_obj, inspect.ismethod):
        class_method[class_name].append(method)
1

你应该使用版本控制程序来帮助管理开发工作。版本控制程序的一个具体功能就是可以跟踪变化。你可以对比当前的源代码和之前的提交,看看有没有什么改动。

撰写回答