#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, но решил просто создать текстовый файл для каждой комбинации типа / подтипа, чтобы упростить его.