2012-04-10 1 views
1

В продолжение этого вопроса: How to pickle a python function with its dependencies?Как получить зависимости функции 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 также есть some good tools, чтобы помочь вам понять, что приводит к сбою вашего травления, когда ваш код выходит из строя.

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

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

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

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

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