Динамически импортировать модули для использования в лямбда-выражении - PullRequest
1 голос
/ 20 сентября 2019

Мне нужно динамически создать функцию из лямбда-выражения, которое предоставляется в виде строки (она будет прочитана из файла конфигурации).Я хочу позволить пользователю также указать список модулей, которые затем могут быть использованы в лямбда-выражении.Для этого мне нужно динамически загрузить модули и сделать их доступными, чтобы к ним можно было обращаться по имени в лямбда-выражении.

Ниже приведена возможная реализация того, что я хочу сделать:

import importlib

def create_function(lambda_expression, modules=[]):
    for module in modules:
        globals()[module] = importlib.import_module(module)
    function = eval('lambda ' + lambda_expression)
    return function

Это можно использовать так:

f = create_function('x: numpy.clip(x, 0, 1)', ['numpy'])

Однако использование globals() не кажется хорошим решением.Есть ли более элегантный способ добиться этого?

1 Ответ

1 голос
/ 20 сентября 2019

Функция Python eval принимает аргумент globals.Таким образом, вы можете сделать что-то вроде этого:

function = eval('lambda ' + lambda_expression, lambda_globals)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...