@Enot_Star

Как обратиться к функции по ключевому слову строки?

Есть множество функций. Есть объект, в котором содержаться списки. И есть строка. Если какая-то часть строки присутствует в одном из списков, то должна вызываться та функция, к которой привязан список. Выглядит это примерно вот так:
spoiler
def function1(string):
	print(string+'\nfunction1')

def function2(string):
	print(string+'\nfunction2')

def function3(string):
	print(string+'\nfunction3')

string = input()
obj =
	{
		'function1':
			['1','function1'],#Если в string присутствует элемент этого списка, то должна вызваться function1

		'function1':
			['2','function2'],#Если в string присутствует элемент этого списка, то должна вызваться function2

		'function3':
			['3','function3'],#Если в string присутствует элемент этого списка, то должна вызваться function3

	}

Как это организовать максимально рационально, без использования большой конструкции if else? Возможно некоторые функции принимают разные переменные.
  • Вопрос задан
  • 144 просмотра
Решения вопроса 4
kshnkvn
@kshnkvn Куратор тега Python
t.me/kshnkvn
def function1(string):
    print(string+'\nfunction1')


def function2(string):
    print(string+'\nfunction2')


def function3(string):
    print(string+'\nfunction3')


functions = {
    'function1': ['1','function1'],
    'function2': ['2','function2'],
    'function3': ['3','function3']
}

call_func = input()

for func, keys in functions.items():
    if call_func in keys:
        eval(f'{func}(call_func)')
        break
Ответ написан
@gorodnev
Если я правильно понял вопрос, то Вам следует создать словарь с функциями-обработчиками, которые будут вызываться по ключевому слову. Что-то вроде такого:

% cat ans.py
handlers = {
  'ADD': lambda x: print('ADD with %s' % x),
  'DELETE': lambda x: print('DELETE with %s' % x),
  'INSERT': lambda x: print('INSERT with %s' % x)
  }
for _ in range(int(input())):
  handler_name, arg = input().split()
  handler = handlers.get(
        handler_name, lambda _: print("%s wasn't found" % handler_name)
        )
  handler(arg)


% cat input.txt 
4
DELETE 10
INSERT 2
ADD 15
SELECT 7


В результате запуска:

% python3 ans.py < input.txt             
DELETE with 10
INSERT with 2
ADD with 15
SELECT wasn't found
Ответ написан
total4c
@total4c
Говнокодер
def func_1():
    print("I am func_1")


def func_2():
    print("I am func_2")


collection = {'1': func_1, '2': func_2}
string = input("Введите число: ")
if string in collection:
    collection[string]()
Ответ написан
@o5a
Можно использовать сами функции в качестве ключей, а затем перебором значений проверять входимость в строку

def function1(string):
  print(string+'\nfunction1')

def function2(string):
  print(string+'\nfunction2')

def function3(string):
  print(string+'\nfunction3')

user_input = input()
obj = {
    function1:
      ['1','function1'],#Если в string присутствует элемент этого списка, то должна вызваться function1
    function2:
      ['2','function2'],#Если в string присутствует элемент этого списка, то должна вызваться function2
    function3:
      ['3','function3'],#Если в string присутствует элемент этого списка, то должна вызваться function3
  }

# обходим весь словарь и проверяем наличие слов из каждого списка в строке пользователя
for func, wordlist in obj.items():
	if any(word in user_input for word in wordlist):
		func(user_input)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы