我刚刚开始使用Java,C,c ++等多年的python。 我有一长串文件/模块,每个文件/模块包含一个我想动态调用的主要方法。对于每个关键字,我有一个名为get_foo的.py文件,并且在每个get_foo.py中都有一个foo方法。所以我想传递命令名“foo”并执行方法get_foo.foo()
我真的不想用丑陋的if / then / else块
来做这件事sections = [ "abstract", "claim", "drawing", "examiner"]
command = "claim"
我想要的是什么
exec("get_" + command + "." + command)
但我真的不知道exec / eval / etc的哪个区域可以做到这一点。
答案 0 :(得分:5)
使用importlib
module动态导入,getattr()
查找您的功能:
import importlib
def call_command(cmd):
mod = importlib.import_module('get_' + cmd)
func = getattr(mod, cmd)
return func()
或者,只需导入所有模块并将它们添加到dict to map命令到callable:
import get_foo, get_bar, get_baz
commands = dict(foo=get_foo.foo, bar=get_bar.bar, baz=get_baz.baz)
def call_command(cmd):
return commands[cmd]()
答案 1 :(得分:4)
解决方案1
from get_foo1 import foo1 # get_foo1.py in directory
from get_foo2 import foo2 # get_foo2.py in directory
foo1()
foo2()
也可以通过其他方式完成
import get_foo1
import get_foo2
get_foo1.foo1()
get_foo2_foo2()
以恐怖的方式打电话给他们你也有很多方法
commands = {"foo1":foo1, "foo2":foo2}
# notice foo1 and foo2 have no "()" because we're referencing function and not calling it
#and then call them
commands["foo1"]() # notice (), this means we're calling function now
答案 2 :(得分:3)
您可以拥有一个从模块调用函数的函数:
def call_function(func):
module = __import__("get_" + func)
return getattr(module, func)()
然后像这样调用这个函数:
call_function("claim")