Использование словаря для выбора функции для выполнения - PullRequest
37 голосов
/ 07 февраля 2012

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

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

, что я должен защищать код, как яЯ использую его для обеспечения возможности скриптинга в моем приложении.

Ответы [ 9 ]

81 голосов
/ 07 февраля 2012

Упростите, упростите, упростите:

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')()

(Подобрал этот аккуратный трюк от Мартина Питера)

19 голосов
/ 09 сентября 2016

Упростить, упростить, упростить + СУХОЙ:

tasks = {}
task = lambda f: tasks.setdefault(f.__name__, f)

@task
def p1():
    whatever

@task
def p2():
    whatever

def my_main(key):
    tasks[key]()
19 голосов
/ 07 февраля 2012

Не горжусь этим, но:

def myMain(key):
    def ExecP1():
        pass
    def ExecP2():
        pass
    def ExecP3():
        pass
    def ExecPn():
        pass 
    locals()['Exec' + key]()

Тем не менее, я рекомендую вам поместить их в модуль / класс, это действительно ужасно.

4 голосов
/ 08 мая 2017
# 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
2 голосов
/ 07 февраля 2012
#!/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's 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()
1 голос
/ 20 февраля 2017
def p1( ):
    print("in p1")

def p2():
    print("in p2")

myDict={
    "P1": p1,
    "P2": p2

}

name=input("enter P1 or P2")

myDictname

0 голосов
/ 27 апреля 2018

Это вызовет методы из словаря

Это оператор переключения python с вызовом функции

Создайте несколько модулей согласно вашему требованию.Если хотите передать аргументы, передайте.

Создайте словарь, который будет вызывать эти модули согласно требованию.

    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
0 голосов
/ 19 апреля 2018

Вы можете просто использовать

myDict = {
    "P1": (lambda x: function1()),
    "P2": (lambda x: function2()),
    ...,
    "Pn": (lambda x: functionn())}
myItems = ["P1", "P2", ..., "Pn"]

for item in myItems:
    myDict[item]()
0 голосов
/ 07 февраля 2012

Вы напрасно тратите время:

  1. Вы собираетесь написать много бесполезного кода и внести новые ошибки.
  2. Чтобы выполнить функцию, ваш пользователь должен знатьимя P1 в любом случае.
  3. и т. д. и т. д. и т. п.

Просто поместите все свои функции в файл .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()

Этого должно быть достаточно для начинающих.

...