Как вывести функцию с импортом внутри - PullRequest
2 голосов
/ 25 апреля 2020

Я пытаюсь записать функции в файл, чтобы я мог использовать этот файл / функцию в другом месте. Я выбираю dill, а не pickle, потому что мне нужны зависимости. Однако dill не работает, если функция имеет импорт внутри. Например:

def func():
    import numpy

import dill
dill.settings['recurse'] = True 
with open("test.pickle","wb") as f:
    dill.dump(func,f)

Когда я перезагружаюсь и загружаю функцию обратно, я получаю эту ошибку,

import dill 
func = dill.load(open("test.pickle"))
func()
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input> in <module>()
      1 import dill
      2 func = dill.load(open("test.pickle"))
----> 3 func()

<ipython-input> in func()

ImportError: __import__ not found

Этот пример работает, если я использую pickle для дампа, но * 1011 Кажется, * не рекурсивно сохраняет зависимости, поэтому я не могу сохранить такие функции, как def fun1(): return fun2(). Есть ли способ вывести функции как с импортом, так и с зависимостями? Я чувствую, что pickle или dill делает только половину.

1 Ответ

1 голос
/ 27 апреля 2020

Я dill автор. Я считаю, что dill также должно работать для вас:

$ python
Python 3.6.10 (default, Dec 21 2019, 11:39:07) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> def func():
...   import numpy
... 
>>> import dill
>>> 
>>> with open('XXX.pkl', 'wb') as f:
...   dill.dump(func, f)
... 
>>> 

$ python
Python 3.6.10 (default, Dec 21 2019, 11:39:07) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> func = dill.load(open('XXX.pkl', 'rb'))
>>> func()
>>> 

Настройки recurse означают рекурсивное отслеживание ссылок через глобальный диалог, но не хранят весь глобальный запрос. Настройка по умолчанию для dill заключается в сохранении всех глобальных значений при выборе функции. Таким образом, recurse может сделать маринады меньшими, но они также могут потерпеть неудачу из-за отсутствия ссылок.

...