2017-02-14 12 views
0

私が必要とするのは変数を取得するもので、変数が関数の名前であれば関数が呼び出されます。 私は、プログラム自体内のモジュールからではなく、から機能を取得しようとしていない午前Pythonで格納された文字列から関数を呼び出す

例:

if callfunction == "Foo" 
    Foo() 
else: 
    print("No function with that name") 
:私は多くの機能を持っているので、私はこのような何かをしたくない

def foo(): 
    print("Foo") 
callfunction = input("What function do you want to call? ") 

callfunction() ## Not sure what to put here but but lets say callfunction is foo. 

私の質問はthisのようなものですが、私はPythonの構文を尋ねます。私はPython 3.5.1を使用しています

答えて

1

あなたがこれを行うことができます:

eval(input("What function do you want to call? ") + '()') 
+0

これは、それを使っている人が任意のpythonコードを実行できるようにします(呼び出し可能で終了するものであればどんなものでも可能です)。例えば、彼らはあなたのすべてのファイルを消去することを選ぶかもしれません。 – Duncan

+0

私は2.7ではなくPython 3.5.1を使用しています。しかし、これは一番簡単な解決策だと思われます – Fonky44

+0

関数名を格納するために余分な変数を使用しないので、あなたの問題を解決した場合、答えを受け入れたものとしてマークします。 @KalkidanTadesseZewdieBeyene – Jarvis

5

dictマッピングの名前を関数に使用します。

call_dict = { 
    'foo': foo, 
    'bar': bar 
} 
call_dict[callfunction]() 
1

コマンドパターンを使用することは、Pythonではかなり一般的です。まずすべての関数をクラスに移動し、入力に使用されていない接頭辞を持つ名前を付けます。次に、getattr()を使用して、正しい関数を見つけて呼び出します。

class Commands(): 
    def cmd_foo(self): 
     print("Foo") 

    def callFunction(self, name): 
     fn = getattr(self, 'cmd_'+name, None) 
     if fn is not None: 
      fn() 

これはダニエルのcall_dictを上回る利点のカップルを持っている:あなたは、関数の名前二度目の一覧を表示する必要はありません、あなたはどちらかの呼び出し可能な関数をもう一度リストする必要はありません。

接頭辞'cmd_'は、クラス内に他のメソッドを持つことができますが、どのクラスが直接呼び出し可能であるかを確実に制御するためのものです。

0

これはそれを

import inspect 
import your_module 

list_of_functions = inspect.getmembers(your_module, inspect.isfunction) 

を行う必要があります今list_of_functionsは位置0での各機能の名称と位置1での機能自体にタプルのリストです

関連する問題