1. ホーム
  2. python

辞書を使って実行する機能を選択する

2023-09-15 15:07:39

質問

関数型プログラミングを使用して、キーと実行する関数を含む辞書を作成しようとしています。

myDict={}
myItems=("P1","P2","P3",...."Pn")
def myMain(key):
    def ExecP1():
        pass
    def ExecP2():
        pass
    def ExecP3():
        pass
        ...
    def ExecPn():
        pass  

さて、モジュール内で定義された関数を見つけるために使われるコードを見ましたが、私はこのようなことをする必要があります。

    for myitem in myItems:
        myDict[myitem] = ??? #to dynamically find the corresponding function

そこで質問ですが、どのようにすればすべての Exec 関数のリストを作成し、それを辞書を使って目的のアイテムに割り当てるにはどうしたらよいでしょうか。 myDict["P1"]() #this will call ExecP1()

私の本当の問題は、これらの項目が大量にあることで、それらを処理するライブラリを作って、最終的なユーザが myMain("P1")

私はinspectモジュールを使用すると思いますが、私はそれを行う方法があまりよくわかりません。

私の避けるべき理由。

def ExecPn():
    pass
myDict["Pn"]=ExecPn

は、アプリケーション内でスクリプト機能を提供するために使用しているため、コードを保護しなければならないことです。

どのように解決するのですか?

自慢にはなりませんが

def myMain(key):
    def ExecP1():
        pass
    def ExecP2():
        pass
    def ExecP3():
        pass
    def ExecPn():
        pass 
    locals()['Exec' + key]()

しかし、私はそれらをモジュールやクラスの何かに入れることをお勧めします。これは本当に恐ろしいことです。


もし、関数ごとにデコレータを追加してもいいのであれば、各関数を辞書に追加するデコレータを定義すればいいのです。

def myMain(key):
    tasks = {}
    
    def task(task_fn):
        tasks[task_fn.__name__] = task_fn
    
    @task
    def ExecP1():
        print(1)
    @task
    def ExecP2():
        print(2)
    @task
    def ExecP3():
        print(3)
    @task
    def ExecPn():
        print(4)
    
    tasks['Exec' + key]()


もう一つの方法は、すべての関数をクラスの下に(あるいは別のモジュールの中に)置き、その中で getattr :

def myMain(key):
    class Tasks:
        def ExecP1():
            print(1)
        def ExecP2():
            print(2)
        def ExecP3():
            print(3)
        def ExecPn():
            print(4)
    
    task = getattr(Tasks, 'Exec' + key)
    task()