如何检查模块/类/方法是否已更改并记录更改?
我正在尝试比较两个模块、类或方法,看看它们是否有变化。我们允许用户修改类和方法,处理完后会把这些修改保存下来,而不是覆盖旧的类和方法。不过,在我们确认新的类之前,需要先判断代码是否有变动,以及方法的功能是否有变化,比如输出结果不同,或者在相同输入下性能也不同。我对性能变化没问题,但我关心的是代码的变化,以及如何记录这些变化。我写了下面这样的代码:
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
你应该使用版本控制程序来帮助管理开发工作。版本控制程序的一个具体功能就是可以跟踪变化。你可以对比当前的源代码和之前的提交,看看有没有什么改动。