Я пытаюсь использовать функциональное программирование для создания словаря, содержащего ключ и функцию для выполнения:
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
в том, что я должен защищать код, поскольку я использую его для обеспечения функции сценариев в моем приложении.
Это вызовет методы из словаря
Это вызовет методы из словаря
Создайте несколько модулей в соответствии с вашими требованиями. Если вы хотите передать аргументы, то передайте.
Создайте словарь, который будет вызывать эти модули согласно требованию.
def function_1(arg):
print("In function_1")
def function_2(arg):
print("In function_2")
def function_3(fileName):
print("In function_3")
f_title,f_course1,f_course2 = fileName.split('_')
return(f_title,f_course1,f_course2)
def createDictionary():
dict = {
1 : function_1,
2 : function_2,
3 : function_3,
}
return dict
dictionary = createDictionary()
dictionary[3](Argument)#pass any key value to call the method
Упростите, упростите, упростите:
def p1(args):
whatever
def p2(more args):
whatever
myDict = {
"P1": p1,
"P2": p2,
...
"Pn": pn
}
def myMain(name):
myDict[name]()
Это все, что вам нужно.
Вы можете рассмотреть возможность использования dict.get с вызываемым по умолчанию, если name ссылается на недопустимую функцию -
def myMain(name):
myDict.get(name, lambda: 'Invalid')()
(выбрал этот опрятный трюк у Martijn Pieters)
Упростить, упростить, упростить + DRY:
tasks = {}
task = lambda f: tasks.setdefault(f.__name__, f)
@task
def p1():
whatever
@task
def p2():
whatever
def my_main(key):
tasks[key]()
Вы можете просто использовать
myDict = {
"P1": (lambda x: function1()),
"P2": (lambda x: function2()),
...,
"Pn": (lambda x: functionn())}
myItems = ["P1", "P2", ..., "Pn"]
for item in myItems:
myDict[item]()
Вы зря теряете время:
Вы собираетесь написать много бесполезного кода и ввести новые ошибки. Чтобы выполнить функцию, ваш пользователь должен знать имя 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()
Этого должно быть достаточно для стартеров.
def p1( ):
print("in p1")
def p2():
print("in p2")
myDict={
"P1": p1,
"P2": p2
}
name=input("enter P1 or P2")
myDictname