2010-11-08 79 views
0

我想比较两个模块/类/方法,并找出类/方法是否已经改变。我们允许用户更改类/方法,并且在处理之后,我们使这些更改持久化,而不覆盖旧的类/方法。然而,在我们提交新的类之前,我们需要确定代码是否已经改变,并且如果方法的功能已经改变,例如输出不同并且性能也延迟相同的输入数据。我对性能改变没问题,但是我的问题是代码的变化以及如何记录 - 发生了什么变化。我写的东西像下面如何检查模块/类/方法是否已更改并记录更改?

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)比较两者来获得差异,有没有更好的方法来做到这一点?

+0

'diff'和'patch',它存在于所有的Unix和类Unix系统上,是你最好的朋友。 – 2010-11-08 15:52:25

+0

所以你说的是你想在Python中使用版本控制系统? Mercurial:http://mercurial.selenic.com/? – katrielalex 2010-11-08 16:10:27

回答

1

您应该使用版本控制程序来帮助管理开发。这是您从vc程序获得的具体d =特性之一,就是跟踪更改的能力。您可以在当前的源代码和以前的签入之间做差异来测试是否有任何更改。

+0

真正的VC可以发展,但版本控制系统记录文件版本我想要的是程序实体的某种形式,比如包,类,方法!在功能层面上,而不仅仅是添加评论。 – json 2010-11-08 16:34:00

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) 
相关问题