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.
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.
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)
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]()
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
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()
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:
- masz zamiar napisać dużo bezużytecznego kodu i wprowadzić nowe błędy.
- aby uruchomić funkcję, użytkownik musi znać nazwę
P1
. - 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.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]()
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
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
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