我可以在MongoDB集合上存储Python函数吗?

我可以在MongoDB集合上存储Python函数吗?,python,mongodb,pymongo,Python,Mongodb,Pymongo,我使用Python dict映射函数: 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,

我使用Python dict映射函数:

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:])
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)
在检索时,您可以执行以下操作:

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:])
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)
并通过字符串参数访问函数,而不是使用
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:])
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中存储传统的列表和字符串,但可以轻松访问脚本中定义的函数。

您希望得到什么结果?如果可以存储“函数调用”,您会做什么/您希望如何处理数据?@deceze现在,当我迭代dict时,我可以通过.itervalues()方法调用函数。我也想这样做。@Hugo您不是在dict中存储函数,而是存储它们的结果。
。itervalues
不调用任何东西。如前所述,函数立即被调用,其结果存储在dict中,您在任何时候都不会“存储函数”。在交互式Python REPL中尝试
{“foo”:linear(3,2,6)}
,您将看到。