3

Java、C、c++ などを何年も使用した後、Python を使い始めたばかりです。動的に呼び出したい主要なメソッドが 1 つ含まれているファイル/モジュールの長いリストがあります。キーワードごとに、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 のどの領域がこれを行うのかさえ本当に知りません。

4

3 に答える 3

5

importlibモジュールを使用して動的にインポートし、getattr()関数を見つけます。

import importlib

def call_command(cmd):
    mod = importlib.import_module('get_' + cmd)
    func = getattr(mod, cmd)
    return func()

または、すべてのモジュールをインポートし、それらを dict に追加して、コマンドを 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]()
于 2012-12-19T20:39:09.753 に答える
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
于 2012-12-19T20:35:46.610 に答える
3

モジュールから関数を呼び出す関数を持つことができます:

def call_function(func):
    module = __import__("get_" + func)
    return getattr(module, func)()

次に、この関数を次のように呼び出します。

call_function("claim")
于 2012-12-19T20:41:31.987 に答える