Я не знаю никаких инструментов для этого, но это должно быть выполнимо с помощью настраиваемого решения. Это зависит от того, насколько сложным будет решение, для которого вы хотите пойти.
Вот два возможных решения без лишних подробностей: Решение 1. Проделайте разницу между наборами изменений и убедитесь, что в вашей команде hg diff имеется много контекста (опция -U), а затем есть простой скрипт, который ищет от изменений строк до ближайшего определения функции (должно выполняться простое регулярное выражение)
Решение 2: Разберите diff как указано выше для номеров строк изменения (например, @@ -7,6 +7,10 @@) а затем напишите интроспективный инструмент, который сообщает вам, из какой функции эта строка исходит. Очевидно, что это может быть довольно сложным, но здесь очень простое приближение:
import sys
if __name__ == '__main__':
import foo
f_list = []
in_line = int(sys.argv[1])
for k,v in sys.modules['foo'].__dict__.iteritems():
if k.startswith('__'):
continue
if hasattr(v, '__call__'): #We have a function
f_list.append((v.__name__, v.__code__.co_firstlineno))
#sort our function list according to starting line of each function (if needed)
last_fn = None
for f_name, f_line in f_list:
if f_line >= in_line:
break;
else:
last_fn = f_name
if last_fn:
print 'Line {} is probably in function {}'.format(in_line, last_fn)
Здесь я просто смотрю в модуле обув, но который может быть изменен на любой модуль вам нужно. Я не собираюсь, чтобы вставить содержимое моего модуля, так что вы должны доверять мне, что это работает :)
./intro.py 7
Line 7 is probably in function do_foo
./intro.py 13
Line 13 is probably in function do_blah
Если «влияние» включает в себя метапрограммирование как декораторы и динамически создаваемые классы (что было бы очень полезно), то это практически невозможно, за исключением, возможно, путем импорта кода. – delnan
@ delnan Я понимаю, что что-то полностью всеобъемлющее слишком много, чтобы спросить. См. Редактирование на мой вопрос. – AgDude
Почему не просто grep diff для класса/def? – goncalopp