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  
现在,我已经看到用于在模块中查找已定义函数的代码,我需要执行以下操作:
    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
是我必须保护代码,因为我使用它来提供我的应用程序中的脚本功能.
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]()
这就是你所需要的.
dict.get如果name引用无效函数,您可以考虑使用可调用默认值 -
def myMain(name):
    myDict.get(name, lambda: 'Invalid')()
(从Martijn Pieters那里得到了这个巧妙的技巧)
Oha*_*had 21
不为此感到自豪,但是:
def myMain(key):
    def ExecP1():
        pass
    def ExecP2():
        pass
    def ExecP3():
        pass
    def ExecPn():
        pass 
    locals()['Exec' + key]()
但是我建议你把它们放在模块/类中,这真的太可怕了.
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]()
小智 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
你可以只使用
myDict = {
    "P1": (lambda x: function1()),
    "P2": (lambda x: function2()),
    ...,
    "Pn": (lambda x: functionn())}
myItems = ["P1", "P2", ..., "Pn"]
for item in myItems:
    myDict[item]()
| 归档时间: | 
 | 
| 查看次数: | 75913 次 | 
| 最近记录: |