最佳实践:python中的动态方法执行

时间:2012-12-19 20:32:38

标签: python

我刚刚开始使用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的哪个区域可以做到这一点。

3 个答案:

答案 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")