将Python函数存储在JSON中

时间:2018-08-20 18:45:14

标签: python json user-defined-functions

说我有一个这样的JSON文件:

{
  "x":5,
  "y":4,
  "func" : def multiplier(a,b):
               return a*d
}

这过度简化了我想尝试做的事情,但基本上我正在尝试
将python UDF转换为JSON文件。有没有办法做到这一点,当我 做:

with open('config.json') as f:
    data = json.load(f)

我可以访问这些值并执行以下操作:

v1, v2 = data['x'], data['y']
mult = data['func']
print(mult(v1,v2))

要获得预期的输出:20

注意:据我了解,JSON不存储函数,因此也许我可以将其存储为字符串,然后在python脚本中将字符串解析为函数?不太确定。

4 个答案:

答案 0 :(得分:3)

Python有一个内置模块名称marshal可以处理此问题。

import marshal, ujson as json

def multiplier(a, b):
    return a * b

x = {
  "x":5,
  "y":4,
  "func" : marshal.dumps(multiplier.func_code)
}

x = json.dumps(x)
print(x)

然后找回...

x = json.loads(x)
x = marshal.loads(x['func'])
# maybe save the function name in dict
func = types.FunctionType(x, globals(), "some_func_name") 

print(func(2,4))

答案 1 :(得分:1)

如果您确实需要将函数存储在外部json文件中,则一种解决方法是改为存储lambda函数,然后使用eval函数从脚本中调用它。但是我真的不建议您将其作为良好的做法...

config.json

{
  "x": 5,
  "y": 4,
  "func": "lambda a, b : a * b"
}

您的Python文件

import json


def main():

    with open('config.json') as f:
        data = json.load(f)

    v1, v2 = data['x'], data['y']
    multiplier = eval(data['func'])
    print(multiplier(v1, v2))


if __name__ == "__main__":
    main()

演示

Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

In[2]: ls
a.py
config.json

In[3]: import json

In[4]: def main():
  ...: 
  ...:     with open('config.json') as f:
  ...:         data = json.load(f)
  ...: 
  ...:     v1, v2 = data['x'], data['y']
  ...: 
  ...:     multiplier = eval(data['func'])
  ...: 
  ...:     print(multiplier(v1, v2))
  ...:    

In[5]: main()
20

答案 2 :(得分:1)

值得尝试的只是将其保存为字符串。

您可以做类似的事情

my_func = "
def function(a,b):
   constant = {input_var}
   return a*b + constant
"
my_func.format(input_var = 5)

exec(my_func)
function(1,2) # will return 7

这将创建您可以调用的函数的对象。不太确定您要做什么,但是创建如下所示的json文件应该可以为您提供所需的服务: (我添加了“ func”包装器,因为我假设您将在一个JSON中具有多个功能)

function_json = {
'func': {
    'x':5
    'y':4
    'multiplier':
'def multiplier(a,b):
    return a*b'
}

x=function_json['func']['x']
y=function_json['func']['y']
exec(function_json['func']['multiplier'])
multiplier(x,y) # will return 20

希望这会有所帮助

答案 3 :(得分:1)

我已经尝试并结合了ethan-kullaeatmeimadanish的解决方案

以下代码有效:

my_func = '''
def function(a,b):
   constant = {input_var}
   return a*b + constant
'''

exec(my_func.format(input_var=5), globals())
# For Python 3.x, use globals() to change global context
function(2,2)