2016-05-17 20 views
0

変数を関数名として使用すると、関数のリストを持つことができ、ループで初期化できます。私はstrオブジェクトが呼び出すことができないと予想されるエラーを取得しています。しかし、私はそれを修正する方法を知らない。ありがとう。Pythonで関数名として変数を使用するにはどうすればいいですか?

#Open protocol configuration file 
config = configparser.ConfigParser() 
config.read("protocol.config") 

# Create new threads for each protocol that is configured 
protocols = ["ISO", "CMT", "ASCII"] 
threads = [] 
threadID = 0 

for protocol in protocols: 
     if (config.getboolean(protocol, "configured") == True): 
       threadID = threadID + 1 
       function_name = config.get(protocol, "protocol_func") 
       threads.append(function_name(threadID, config.get(protocol, "port"))) 

# Start new threads 
for thread in threads: 
     thread.start() 

print ("Exiting Main Protocol Manager Thread") 
+0

** **は**これらの機能ですか?特定のモジュールですか?現在のモジュールは?多くの場合、関数を辞書のキーにしてルックアップを行うのが最もクリーンです。例えば、その辞書に配置されるべき公開された関数のためのデコレータを使用します。そのような方法では、はるかに少ないメタプログラミングのハッカーです。 –

答えて

1

関数はPythonの第一級の市民であるため、関数を通常の変数として扱うことができます。関数を繰り返し実行してリストを作成するだけです。

>>> for f in [int, str, float]: 
...  for e in [10, "10", 10.0]: 
...   print(f(e)) 
...   
10 
10 
10 
10 
10 
10.0 
10.0 
10.0 
10.0 
1

あなたが特定のモジュールに有効なprotocol_func秒のあなたのセットを置く場合は、そのモジュールから取得するためにgetattr()を使用することができます。

import protocol_funcs 

protocol_func = getattr(protocol_funcs, function_name) 
threads.append(protocol_func(threadID, config.get(protocol, "port"))) 

別のアプローチは、オプションを登録するデコレータです。

protocol_funcs = {} 

def protocol_func(f): 
    protocol_funcs[f.__name__] = f 
    return f 

...その後:

@protocol_func 
def some_protocol_func(id, port): 
    pass # TODO: provide a protocol function here 

このように、@protocol_funcで装飾された機能だけを設定ファイルで使用することができ、その辞書の内容を簡単に繰り返すことができます。

0

機能は後に呼ばれるように、リストに入れることができる:あなたが取得します

def a(): 
    print("a") 
def b(): 
    print("b") 
def c(): 
    print("c") 
func = [a, b, c] 
for function in func: 
    function() 

出力は、すべての機能からです:

a 
b 
c 

はあなたのコードを取得するために同じロジックを使用します

関連する問題