У меня есть класс для анализа данных из некоторых онлайн-словарей, он читает информацию о слове из json, а затем выполняет методы, как сообщает json. Пример JSON:

{
"functions": [
    {
        "name": "find_translations",
        "properties": {
            "only_first": false
        }
    },
    {
        "name": "find_synonyms",
        "properties": {
             "number": 5
        }
],
"word": "to exuberate",
"language": "angielski",
"target_language": "polski",
"collection": "default"
}

Итак, у меня есть класс с методами find_translations и find_synonyms. И __init __ читает json, и я хочу выполнять функции с параметрами , как в json. Я мог бы сделать кучу ifs, но это не масштабируется, я думаю. Я мог бы сделать eval (), но это уязвимость. Что мне делать? Могу ли я создать что-то вроде словаря с функциями?

РЕДАКТИРОВАТЬ:

Вот мой класс (упрощенно):

class Parser:
  def __init__(self, path):
    ...
    # reads data from json
    ...

    # my problem: I need to launch methods from this class
    # that were mentioned in json. In case from example, I'd launch
    self.find_translations(self)
    self.find_synonyms(self)
    # it is an example, so without parameters


def find_translations(self):
    # do something

def find_synonyms(self):
    # do something

def find_usage(self):
    # do something
1
Jakub Cichalewski 13 Мар 2018 в 15:37

2 ответа

Лучший ответ

Вы можете использовать функцию getattr для вызова определенного метода класса, например:

getattr(Parser, function_name_here)(arguments_here)

Я думаю, это было то, что вы просили? Я надеюсь, что это помогает.

2
gautamaggarwal 13 Мар 2018 в 13:07

Используйте ast.literal_eval как более безопасную альтернативу eval:

Из документации:

ast.literal_eval: безопасное вычисление узла выражения или строки содержащий литерал Python или отображение контейнера. Строка или узел предоставленный может состоять только из следующих литеральных структур Python: строки, байты, числа, кортежи, списки, словари, наборы, логические значения и None.

Это может использоваться для безопасной оценки строк, содержащих значения Python из ненадежных источников, без необходимости разбора значений самостоятельно. Он не способен вычислять произвольно сложные выражения, например, с использованием операторов или индексации.

2
jpp 13 Мар 2018 в 12:53