Использование dict для вызова функций из строки

#python #string #dictionary #key-value #dispatch

#python #строка #словарь #ключ-значение #отправка

Вопрос:

Я хотел бы, чтобы первые два слова строки пользовательского ввода считывались как аргументы функции для того, где сохранить строку. Я остановился на использовании dict вместо многих операторов if, но я не уверен, как структурировать dict.

Я считаю, что это правильное начало:

ввод: «вопрос физика, что происходит с атомами, когда в них попадают фотоны?» результат: программа сохраняет входные данные в location questions physics

 raw_entry = input("Enter text in the following format: type subtype text")
instructions = raw_entry.split()[:2]
  

Два слова (каждое из которых является «get_id» в примере) будут указывать, где сохранить текст. Этот пример, похоже, то, что я ищу, но я не уверен, как его изменить для моего случая.

 function_dict = {'get_id': 
                        (
                        # function
                        requests.get,

                        # tuple of arguments
                        (url   "/users/"   user,), 

                        # dict of keyword args
                        {'headers': self.headers}
                        )
                 }
  

Дайте мне знать, если я делаю это логически или если это не имеет смысла. Спасибо!

Комментарии:

1. Можете ли вы привести какой-нибудь пример ввода raw_entry.

2. Дайте мне знать, если я поступаю логически или если это не имеет смысла. Спасибо! : Я, насколько я понимаю, что вы пытаетесь сделать, что это?

3. Это то, что я предполагаю, основываясь на пользовательском вводе, вы хотите выполнить другую функцию / метод?

4. @JamesSapam Я добавил пример ввода.

Ответ №1:

Вам нужно будет определять функции отдельно из словаря

Например:

 def get_id():
    ... the function's code ...

function_dict = { "get_id":get_id, ... }
  

затем вы можете вызвать функцию с ее ключевым словом:

 function_dict["get_id"]()
  

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

 globals()["get_id"]()
  

Комментарии:

1. Отлично, это полезно. Я думал (неправильно), что функция должна была быть внутри dict.

2. Не могли бы OP использовать partial в своем вызове подобное partial(function_dict.get('get_id'), args) ? Таким образом, передача аргументов по-прежнему работает так, как задумано

3. Может быть, но это зависит от сигнатуры функции (о которой на данный момент у OP нет указаний). Если все они определены с помощью чего-то вроде get_id(*params), то partial() может и не понадобиться. Внедрение исправленных параметров, вероятно, было бы лучше обработано лямбдами непосредственно в словаре.

4. @AlainT. Я собирался использовать dict для json, но решил просто создать текстовый файл для каждой комбинации типа / подтипа, чтобы упростить его.