Как проверить, была ли изменена функция python (в живом коде)?

Если у меня есть ссылка на функцию, я могу проверить ее объект кода f.__code__, получить подпись, а затем выполнить более поздние проверки против этой сигнатуры, чтобы увидеть, изменился ли код. Это хорошо. Но что, если одна из зависимостей funciton изменилась? Например.

def foo(a, b): return bar(a, b)

Скажем, foo остался прежним, но бар изменился. Есть ли способ проверить "живые" зависимости foo зависимостей через объект foo.__code__ (против разбора текста и использования AST)?

Ответы

Ответ 1

Я просто воткнулся в объект __code__ здесь, поэтому не могу сказать, что это сработает наверняка, но мне кажется, что вы можете использовать кортеж co_names для (рекурсивного) прохождения график вызова, внедренный в определенную функцию, чтобы создать какой-то хэш транзитивного замыкания функций, которые можно было бы назвать. (Я не думаю, что можно было бы включить только те функции, которые будут вызваны для конкретного ввода, но вы можете быть консервативными и включать все возможные вызовы.)

Для этого вам нужно будет поддерживать какую-то таблицу символов, чтобы иметь возможность искать имена вызываемых функций. Но как только вы начнете идти по этому пути, кажется, что вы в основном собираетесь создать свой собственный аналог AST. Итак, почему бы просто не использовать AST для начала?