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

时间:2015-11-16 12:52:28

标签: python mongodb pymongo

我使用Python dicts来映射函数:

exec

但是当我使用MongoDB将dict存储在集合上时,我得到的结果只是一个字符串而不是函数调用。

我该如何转换它?我读过使用eval或{{1}}不是很安全吗?

1 个答案:

答案 0 :(得分:2)

你可以这样做:

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中存储传统列表和字符串,但您可以轻松访问脚本中定义的函数。