腌制一个函数并包含导入

Pickling a Function and Include the Imports

我的想法是这样的,所以我想允许用户将代码发送到网络端点。

我想从方法中获取 modules/imports。 这可能吗?

import pickle
import inspect

def add(x,y):
    return x+y

def stringify_method(func):
    """"""
    return pickle.dumps(func)

print(pickle.loads(stringify_method(add))(1,2))
3

所以它 returns 3,这是预期的。

现在假设我有更复杂的事情:

import sys
import pickle
import inspect
import arcpy
import pandas as pd
import numpy as np

def create_array(array):
    return np.array(array)

def unpickle_method(func):
    """"""
    return pickle.dumps(func)

print(pickle.loads(stringify_method(create_array))([1,2,3,4]))

方法我搞定了,但是模块跟不上。如何获得我的 import numpy as np 和 pandas,等等?

不确定您要做什么,但这有帮助吗?

>>> import sys
>>> import numpy as np
>>> import inspect
>>> 
>>> [x[0] for x in inspect.getmembers(sys.modules[__name__], inspect.ismodule)]
['__builtins__', 'inspect', 'np', 'sys']

this gets me 1/2 way there, I need to be able to then grab the import statements from the method: import numpy as np

您可能可以从中重建语句:

>>> [(x, y.__name__) for x,y in inspect.getmembers(sys.modules[__name__], inspect.ismodule)]
[('__builtins__', 'builtins'), ('inspect', 'inspect'), ('np', 'numpy'), ('sys', 'sys')]

(注意 ('np', 'numpy') 元素告诉你 import numpy as np