web-dev-qa-db-ja.com

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

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

_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")を呼び出すだけで済むことです。

私は検査モジュールを使用すると思いますが、どうやってそれを行うのかよくわかりません。

避けるべき私の理由:

_def ExecPn():
    pass
myDict["Pn"]=ExecPn
_

アプリケーション内でスクリプト機能を提供するために使用しているコードを保護する必要があるということです。

37
JohnnyDH

それを誇りに思っていませんが、:

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

ただし、これらをモジュール/クラスに入れることをお勧めします。これは本当に恐ろしいことです。

19
Ohad

単純化、単純化、単純化:

def p1(args):
    whatever

def p2(more args):
    whatever

myDict = {
    "P1": p1,
    "P2": p2,
    ...
    "Pn": pn
}

def myMain(name):
    myDict[name]()

必要なのはそれだけです。


nameが無効な関数を参照している場合、呼び出し可能なデフォルトでdict.getの使用を検討できます。

def myMain(name):
    myDict.get(name, lambda: 'Invalid')()

(Martijn Pietersからこのきちんとしたトリックを選んだ)

83
S.Lott

単純化、単純化、単純化 + DRY:

tasks = {}
task = lambda f: tasks.setdefault(f.__name__, f)

@task
def p1():
    whatever

@task
def p2():
    whatever

def my_main(key):
    tasks[key]()
19
Joe
# index dictionary by list of key names

def fn1():
    print "One"

def fn2():
    print "Two"

def fn3():
    print "Three"

fndict = {"A": fn1, "B": fn2, "C": fn3}

keynames = ["A", "B", "C"]

fndict[keynames[1]]()

# keynames[1] = "B", so output of this code is

# Two
5
jwc3119
#!/usr/bin/python

def thing_a(arg=None):
    print 'thing_a', arg

def thing_b(arg=None):
    print 'thing_b', arg

ghetto_switch_statement = {
    'do_thing_a': thing_a,
    'do_thing_b': thing_b
}

ghetto_switch_statement['do_thing_a']("It's lovely being an A")
ghetto_switch_statement['do_thing_b']("Being a B isn't too shabby either")

print "Available methods are: ", ghetto_switch_statement.keys()
2
def p1( ):
    print("in p1")

def p2():
    print("in p2")

myDict={
    "P1": p1,
    "P2": p2

}

name=input("enter P1 or P2")

myDictname

1
Gokhale

これは辞書からメソッドを呼び出します

これはpython関数呼び出しを伴うswitchステートメント

要件に応じていくつかのモジュールを作成します。引数を渡したい場合は渡します。

要件に従ってこれらのモジュールを呼び出す辞書を作成します。

    def function_1(arg):
        print("In function_1")

    def function_2(arg):
        print("In function_2")

    def function_3(fileName):
        print("In function_3")
        f_title,f_course1,f_course2 = fileName.split('_')
        return(f_title,f_course1,f_course2)


    def createDictionary():

        dict = {

            1 : function_1,
            2 : function_2,
            3 : function_3,

        }    
        return dict

    dictionary = createDictionary()
    dictionary[3](Argument)#pass any key value to call the method
0
akD

あなたは時間を無駄にしている:

  1. 無駄なコードをたくさん書き、新しいバグを導入しようとしています。
  2. 関数を実行するには、ユーザーはP1の名前を知っている必要があります。
  3. 等など.

すべての関数を.pyファイルに入れるだけです:

# my_module.py

def f1():
    pass

def f2():
    pass

def f3():
    pass

そして、これらを次のように使用します。

import my_module

my_module.f1()
my_module.f2()
my_module.f3()

または:

from my_module import f1
from my_module import f2
from my_module import f3

f1()
f2()
f3()

これは初心者に十分なはずです。

0

あなただけを使用することができます

myDict = {
    "P1": (lambda x: function1()),
    "P2": (lambda x: function2()),
    ...,
    "Pn": (lambda x: functionn())}
myItems = ["P1", "P2", ..., "Pn"]

for item in myItems:
    myDict[item]()
0