说我有一个这样的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脚本中将字符串解析为函数?不太确定。
答案 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-kulla和eatmeimadanish的解决方案
以下代码有效:
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)