我可以在 MongoDB 集合上存储 Python 函数吗?
Can I store Python function on a MongoDB collection?
我正在使用 Python 字典来映射函数:
def linear(a, x, b):
return a * x + b
def quadratic(a, x, b, c):
return a * x * x + b * x + c
sensor = {
'id': 'aaaaa',
'name': 'temp001',
'quantity': 'temperature',
'unit': 'C',
'charlength': 4,
'convert': {
'linear': linear(3, 2, 6),
'quadratic': quadratic(2, 4, 7, 8)
}
}
但是当我使用 MongoDB 将 dict 存储在集合中时,我得到的结果只是一个字符串而不是函数调用。
如何转换?我听说使用 exec
或 eval
不是很安全?
你可以这样做:
sensor = {
'id': 'aaaaa',
'name': 'temp001',
'quantity': 'temperature',
'unit': 'C',
'charlength': 4,
'convert': {
'linear': ("linear", 3, 2, 6),
'quadratic': ("quadratic", 2, 4, 7, 8)
}
}
检索后,您可以:
linear_function = sensor["convert"]["linear"]
globals()[linear_function[0]](*linear_function[1:])
并通过字符串参数访问该函数,而不是使用 eval()
,这显然是有风险的。
并且为了让它更简洁,因为您已经将函数名称存储为键,您可以这样做:
sensor = {
'id': 'aaaaa',
'name': 'temp001',
'quantity': 'temperature',
'unit': 'C',
'charlength': 4,
'convert': {
'linear': (3, 2, 6),
'quadratic': (2, 4, 7, 8)
}
}
linear_function_parameters = sensor["convert"]["linear"]
globals()["linear"](*linear_function_parameters)
甚至
for function in sensor['convert']:
variables = sensor['convert'][function]
result = globals()[function](*variables)
这将使它完全动态。
这样,您只需将传统列表和字符串存储在 MongoDB 中,但您可以轻松访问脚本中定义的函数。
我正在使用 Python 字典来映射函数:
def linear(a, x, b):
return a * x + b
def quadratic(a, x, b, c):
return a * x * x + b * x + c
sensor = {
'id': 'aaaaa',
'name': 'temp001',
'quantity': 'temperature',
'unit': 'C',
'charlength': 4,
'convert': {
'linear': linear(3, 2, 6),
'quadratic': quadratic(2, 4, 7, 8)
}
}
但是当我使用 MongoDB 将 dict 存储在集合中时,我得到的结果只是一个字符串而不是函数调用。
如何转换?我听说使用 exec
或 eval
不是很安全?
你可以这样做:
sensor = {
'id': 'aaaaa',
'name': 'temp001',
'quantity': 'temperature',
'unit': 'C',
'charlength': 4,
'convert': {
'linear': ("linear", 3, 2, 6),
'quadratic': ("quadratic", 2, 4, 7, 8)
}
}
检索后,您可以:
linear_function = sensor["convert"]["linear"]
globals()[linear_function[0]](*linear_function[1:])
并通过字符串参数访问该函数,而不是使用 eval()
,这显然是有风险的。
并且为了让它更简洁,因为您已经将函数名称存储为键,您可以这样做:
sensor = {
'id': 'aaaaa',
'name': 'temp001',
'quantity': 'temperature',
'unit': 'C',
'charlength': 4,
'convert': {
'linear': (3, 2, 6),
'quadratic': (2, 4, 7, 8)
}
}
linear_function_parameters = sensor["convert"]["linear"]
globals()["linear"](*linear_function_parameters)
甚至
for function in sensor['convert']:
variables = sensor['convert'][function]
result = globals()[function](*variables)
这将使它完全动态。 这样,您只需将传统列表和字符串存储在 MongoDB 中,但您可以轻松访问脚本中定义的函数。