假设我有一个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脚本中将该字符串解析为函数?不太确定。
发布于 2018-08-21 04:43:18
如果您确实需要将函数存储在外部JSON文件中,一种解决方案可能是将lambda函数存储为一个值,并使用eval
函数从您的脚本中对其求值。
但请注意,在代码中使用eval
可能是危险的,请在使用它之前考虑其安全含义(请参阅realpython.com的this文章)。
config.json
{
"x": 5,
"y": 4,
"function": "lambda x, y : x * y"
}
您的Python文件(test.py)
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)
演示
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
发布于 2018-08-21 05:03:08
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))
发布于 2018-08-21 04:59:54
值得尝试的方法就是将其保存为字符串。
你可以像这样做
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
希望这能有所帮助
https://stackoverflow.com/questions/51936785
复制相似问题