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

fis*_*rds 3 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"
Run Code Online (Sandbox Code Playgroud)

我想要什么样的东西

exec("get_" + command + "." + command)
Run Code Online (Sandbox Code Playgroud)

但我真的不知道exec/eval/etc的哪个区域可以做到这一点.

Mar*_*ers 5

使用该importlib模块动态导入,并getattr()找到您的功能:

import importlib

def call_command(cmd):
    mod = importlib.import_module('get_' + cmd)
    func = getattr(mod, cmd)
    return func()
Run Code Online (Sandbox Code Playgroud)

或者,只需导入所有模块并将它们添加到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]()
Run Code Online (Sandbox Code Playgroud)