首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JSON中存储Python函数

在JSON中存储Python函数
EN

Stack Overflow用户
提问于 2018-08-21 02:45:14
回答 4查看 8.7K关注 0票数 5

假设我有一个JSON文件:

代码语言:javascript
复制
{
  "x":5,
  "y":4,
  "func" : def multiplier(a,b):
               return a*d
}

这过度简化了我想尝试和做的事情,但基本上我是在尝试

将一个python UDF编写成一个JSON文件。有没有办法这样做,这样当我这样做的时候:

代码语言:javascript
复制
with open('config.json') as f:
    data = json.load(f)

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

代码语言:javascript
复制
v1, v2 = data['x'], data['y']
mult = data['func']
print(mult(v1,v2))

要获得预期输出: 20

注释:据我所知,JSON不存储函数,所以也许我可以将其存储为字符串,然后在我的python脚本中将该字符串解析为函数?不太确定。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-21 04:43:18

如果您确实需要将函数存储在外部JSON文件中,一种解决方案可能是将lambda函数存储为一个值,并使用eval函数从您的脚本中对其求值。

但请注意,在代码中使用eval可能是危险的,请在使用它之前考虑其安全含义(请参阅realpython.com的this文章)。

config.json

代码语言:javascript
复制
{
  "x": 5,
  "y": 4,
  "function": "lambda x, y : x * y"
}

您的Python文件(test.py)

代码语言:javascript
复制
import json


def run():
    """Run function from JSON config."""

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

    x, y = data["x"], data["y"]
    multiplier = eval(data["function"])
    return multiplier(x, y)


if __name__ == "__main__":
   result = run()
   print(result)

演示

代码语言:javascript
复制
In[2]: ls
test.py
config.json

In[3]: import json

In[4]: def run():
  ...:     """Run function from JSON config."""
  ...: 
  ...:     with open("config.json") as f:
  ...:         data = json.load(f)
  ...: 
  ...:     x, y = data["x"], data["y"]
  ...:     multiplier = eval(data["func"])
  ...:     return(multiplier(x, y))
  ...:    

In[5]: run()
20
票数 7
EN

Stack Overflow用户

发布于 2018-08-21 05:03:08

Python有一个内置的模块名为marshal,可以处理这个问题。

代码语言:javascript
复制
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)

为了找回它..。

代码语言:javascript
复制
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))
票数 9
EN

Stack Overflow用户

发布于 2018-08-21 04:59:54

值得尝试的方法就是将其保存为字符串。

你可以像这样做

代码语言:javascript
复制
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中有多个函数)

代码语言:javascript
复制
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

希望这能有所帮助

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51936785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档