Как проверить, изменился ли модуль / класс / методы, и записать изменения? - PullRequest
0 голосов
/ 08 ноября 2010

Я пытаюсь сравнить два модуля / классы / метод и выяснить, изменился ли класс / метод. Мы разрешаем пользователям изменять классы / методы, и после обработки мы делаем эти изменения постоянными, не перезаписывая старые классы / методы. Однако перед тем, как мы фиксируем новые классы, нам необходимо установить, изменился ли код, а также изменились ли функционально методы, например, отличаются выходные данные и производительность также откладывается на те же входные данные. Я в порядке с изменением производительности, но моя проблема - изменения в коде и как войти - что изменилось. я написал что-то вроде ниже

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 ]

1 голос
/ 08 ноября 2010

Вы должны использовать программу контроля версий для управления разработкой. Это одна из особенностей d =, которую вы получаете от vc-программы - это возможность отслеживать изменения. Вы можете сделать различия между текущим исходным кодом и предыдущими регистрациями, чтобы проверить, были ли какие-либо изменения.

0 голосов
/ 08 ноября 2010

если у меня много методов, что я вижу здесь перебирает все методы. Возможно сделать это в классе или модуле уровень

Я не буду спрашивать, почему ты хочешь делать такие вещи? но да вы можете вот пример

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)
...