Как получить зависимости функции python для травления?

В качестве продолжения этого вопроса: Как раскрыть функцию python со своими зависимостями?

Что такое хороший подход для определения зависимостей метода? Например, как и в предыдущем сообщении, если у меня есть функция f, которая использует методы g и y, есть ли простой способ получить ссылку на g и y динамически?

Кроме того, я думаю, вы хотели бы, чтобы этот метод возвращал весь график функции таким образом, что если y зависело от z, вы также могли бы расслоить z.

Я вижу, что дискотека использует для этого следующий модуль: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py

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

Ответ 1

Чтобы сделать это, я бы использовал dill, который может сериализовать почти что угодно в python. У Dill также есть несколько хороших инструментов, которые помогут вам понять, что заставляет ваш травление терпеть неудачу, когда ваш код не работает.

>>> import dill
>>> dill.loads(dill.dumps(your_bad_object))
>>> ...
>>> # if you get a pickling error, use dill tools to figure out a workaround
>>> dill.detect.badobjects(your_bad_object, depth=0)
>>> dill.detect.badobjects(your_bad_object, depth=1)
>>> ...

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

Кроме того, objgraph является довольно удобным дополнением к набору тестов.

>>> # visualize the references in your bad objects
>>> objgraph.show_refs(your_bad_object, filename='your_bad_object.png')

Или, как я уже упоминал в вышеприведенном сообщении, вы можете использовать укроп, чтобы распиливать весь сеанс python одной командой. Это немного переполняет ваш вопрос здесь, но это тоже сработает.