Использование словаря для выбора функции для выполнения
Я пытаюсь использовать функциональное программирование для создания словаря, содержащего ключ и функцию для выполнения:
myDict={}
myItems=("P1","P2","P3",...."Pn")
def myMain(key):
def ExecP1():
pass
def ExecP2():
pass
def ExecP3():
pass
...
def ExecPn():
pass
Теперь я видел код, используемый для нахождения определенных функций в модуле, и мне нужно сделать что-то вроде этого:
for myitem in myItems:
myDict[myitem] = ??? #to dynamically find the corresponding function
Итак, мой вопрос: как мне составить список всех функций Exec
, а затем назначить их нужному элементу с помощью словаря? поэтому в конце у меня будет myDict["P1"]() #this will call ExecP1()
Моя реальная проблема заключается в том, что у меня есть тонны этих элементов, и я создаю библиотеку, которая будет обрабатывать их, поэтому конечному пользователю нужно только позвонить myMain("P1")
Я думаю, используя модуль проверки, но я не уверен, как это сделать.
Моя причина:
def ExecPn():
pass
myDict["Pn"]=ExecPn
заключается в том, что я должен защищать код, поскольку я использую его для предоставления функции сценариев в своем приложении.
Ответы
Ответ 1
Не горжусь этим, но:
def myMain(key):
def ExecP1():
pass
def ExecP2():
pass
def ExecP3():
pass
def ExecPn():
pass
locals()['Exec' + key]()
Однако я рекомендую, чтобы вы помещали их в модуль/класс, это действительно ужасно.
Ответ 2
Упростить, упростить, упростить
def p1( args ):
whatever
def p2( more args):
whatever
myDict={
"P1": p1,
"P2": p2,
...
"Pn": pn
}
def myMain(name):
myDict[name]()
Это все, что вам нужно.
Ответ 3
Упростить, упростить, упростить + DRY:
tasks = {}
task = lambda f: tasks.setdefault(f.__name__, f)
@task
def p1():
whatever
@task
def p2():
whatever
def my_main(key):
tasks[key]()
Ответ 4
# index dictionary by list of key names
def fn1():
print "One"
def fn2():
print "Two"
def fn3():
print "Three"
fndict = {"A": fn1, "B": fn2, "C": fn3}
keynames = ["A", "B", "C"]
fndict[keynames[1]]()
# keynames[1] = "B", so output of this code is
# Two
Ответ 5
#!/usr/bin/python
def thing_a(arg=None):
print 'thing_a', arg
def thing_b(arg=None):
print 'thing_b', arg
ghetto_switch_statement = {
'do_thing_a': thing_a,
'do_thing_b': thing_b
}
ghetto_switch_statement['do_thing_a']("It lovely being an A")
ghetto_switch_statement['do_thing_b']("Being a B isn't too shabby either")
print "Available methods are: ", ghetto_switch_statement.keys()
Ответ 6
Вы зря теряете время:
- Вы собираетесь написать много бесполезного кода и ввести новые ошибки.
- Чтобы выполнить функцию, ваш пользователь должен знать имя
P1
в любом случае.
- и т.д. и т.д.
Просто поместите все свои функции в файл .py
:
# my_module.py
def f1():
pass
def f2():
pass
def f3():
pass
И используйте их следующим образом:
import my_module
my_module.f1()
my_module.f2()
my_module.f3()
или
from my_module import f1
from my_module import f2
from my_module import f3
f1()
f2()
f3()
Этого должно быть достаточно для стартеров.
Ответ 7
def p1( ):
print("in p1")
def p2():
print("in p2")
myDict={
"P1": p1,
"P2": p2
}
name=input("enter P1 or P2")
myDictname