Подтвердить что ты не робот

Использование словаря для выбора функции для выполнения

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

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

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

4b9b3361

Ответ 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]()

Это все, что вам нужно.

Ответ 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