Joh*_*yDH 40 python dictionary function inspect
我正在尝试使用函数式编程来创建包含键和要执行的函数的字典:
myDict={}
myItems=("P1","P2","P3",...."Pn")
def myMain(key):
def ExecP1():
pass
def ExecP2():
pass
def ExecP3():
pass
...
def ExecPn():
pass
Run Code Online (Sandbox Code Playgroud)
现在,我已经看到用于在模块中查找已定义函数的代码,我需要执行以下操作:
for myitem in myItems:
myDict[myitem] = ??? #to dynamically find the corresponding function
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何列出所有Exec函数,然后使用字典将它们分配给所需的项目?所以最后我会myDict["P1"]() #this will call ExecP1()
我真正的问题是我有大量的这些项目,我创建了一个库来处理它们,所以最终用户只需要调用 myMain("P1")
我认为使用检查模块,但我不确定如何做到这一点.
我有理由避免:
def ExecPn():
pass
myDict["Pn"]=ExecPn
Run Code Online (Sandbox Code Playgroud)
是我必须保护代码,因为我使用它来提供我的应用程序中的脚本功能.
S.L*_*ott 90
简化,简化和简化:
def p1(args):
whatever
def p2(more args):
whatever
myDict = {
"P1": p1,
"P2": p2,
...
"Pn": pn
}
def myMain(name):
myDict[name]()
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的.
dict.get如果name引用无效函数,您可以考虑使用可调用默认值 -
def myMain(name):
myDict.get(name, lambda: 'Invalid')()
Run Code Online (Sandbox Code Playgroud)
(从Martijn Pieters那里得到了这个巧妙的技巧)
Oha*_*had 21
不为此感到自豪,但是:
def myMain(key):
def ExecP1():
pass
def ExecP2():
pass
def ExecP3():
pass
def ExecPn():
pass
locals()['Exec' + key]()
Run Code Online (Sandbox Code Playgroud)
但是我建议你把它们放在模块/类中,这真的太可怕了.
Joe*_*Joe 20
简化,简化,简化 + DRY:
tasks = {}
task = lambda f: tasks.setdefault(f.__name__, f)
@task
def p1():
whatever
@task
def p2():
whatever
def my_main(key):
tasks[key]()
Run Code Online (Sandbox Code Playgroud)
小智 6
# 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
Run Code Online (Sandbox Code Playgroud)
你可以只使用
myDict = {
"P1": (lambda x: function1()),
"P2": (lambda x: function2()),
...,
"Pn": (lambda x: functionn())}
myItems = ["P1", "P2", ..., "Pn"]
for item in myItems:
myDict[item]()
Run Code Online (Sandbox Code Playgroud)