Korzystanie ze słownika, aby wybrać funkcję do wykonania

Próbuję użyć programowania funkcyjnego do stworzenia słownika zawierającego klucz i funkcję do wykonania:

myDict={}
myItems=("P1","P2","P3",...."Pn")
def myMain(key):
    def ExecP1():
        pass
    def ExecP2():
        pass
    def ExecP3():
        pass
        ...
    def ExecPn():
        pass  

Teraz widziałem kod używany do znalezienia zdefiniowanych funkcji w module, i muszę zrobić coś takiego:

    for myitem in myItems:
        myDict[myitem] = ??? #to dynamically find the corresponding function

Więc moje pytanie brzmi, jak zrobić listę wszystkich funkcji Exec, a następnie przypisać je do żądanego elementu za pomocą słownika a? więc na koniec będę miał myDict["P1"]() #this will call ExecP1()

Moim prawdziwym problemem jest to, że mam mnóstwo tych przedmiotów i tworzenie biblioteki, która będzie je obsługiwać, więc użytkownik końcowy musi tylko wywołać myMain("P1")

Myślę, że używając modułu inspect, ale nie jestem pewien, jak to zrobić.

Mój powód do unikania:

def ExecPn():
    pass
myDict["Pn"]=ExecPn

Jest to, że muszę chronić Kod, ponieważ używam go do zapewnienia funkcji skryptowej w mojej aplikacji.

Author: jonrsharpe, 2012-02-07

9 answers

Nie jestem z tego dumny, ale:

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

Polecam jednak umieścić je w module/klasie cokolwiek, to jest naprawdę straszne.

 16
Author: Ohad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 22:47:37

Uprościć, uprościć, uprościć:

def p1(args):
    whatever

def p2(more args):
    whatever

myDict = {
    "P1": p1,
    "P2": p2,
    ...
    "Pn": pn
}

def myMain(name):
    myDict[name]()
To wszystko, czego potrzebujesz.

Można rozważyć użycie dict.get z domyślnym wywołaniem, jeśli name odnosi się do nieprawidłowej funkcji -

def myMain(name):
    myDict.get(name, lambda: 'Invalid')()

(podniósł tę zgrabną sztuczkę od Martijn Pieters)

 55
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-18 18:20:58

Simplify, simplify, simplify + DRY:

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

@task
def p1():
    whatever

@task
def p2():
    whatever

def my_main(key):
    tasks[key]()
 16
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-30 18:34:16
# 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
 3
Author: jwc3119,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 18:44:10
#!/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
Author: synthesizerpatel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 22:37:33

Marnujesz swój czas:

  1. masz zamiar napisać dużo bezużytecznego kodu i wprowadzić nowe błędy.
  2. aby uruchomić funkcję, użytkownik musi znać nazwę P1.
  3. itd., itd., itd.

Wystarczy umieścić wszystkie funkcje w pliku .py:

# my_module.py

def f1():
    pass

def f2():
    pass

def f3():
    pass

I używaj ich w ten sposób:

import my_module

my_module.f1()
my_module.f2()
my_module.f3()

Lub:

from my_module import f1
from my_module import f2
from my_module import f3

f1()
f2()
f3()
To powinno wystarczyć na początek.
 0
Author: Misha Akovantsev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-06 22:49:29

Możesz po prostu użyć

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

for item in myItems:
    myDict[item]()
 0
Author: Jonas De Schouwer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 17:28:40

Spowoduje to wywołanie metod ze słownika

Jest to Instrukcja Pythona switch z wywołaniem funkcji

Utwórz kilka modułów zgodnie z wymaganiami. Jeśli chcesz przekazać argumenty, to podaj.

Utwórz słownik, który wywoła te moduły zgodnie z wymaganiami.

    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
Author: akD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 08:52:36
def p1( ):
    print("in p1")

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

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

}

name=input("enter P1 or P2")

MyDictname

 -1
Author: Gokhale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 18:34:09