私は関数型プログラミングを使用して、実行するキーと関数を含む辞書を作成しようとしています:
_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
_
アプリケーション内でスクリプト機能を提供するために使用しているコードを保護する必要があるということです。
それを誇りに思っていませんが、:
def myMain(key):
def ExecP1():
pass
def ExecP2():
pass
def ExecP3():
pass
def ExecPn():
pass
locals()['Exec' + key]()
ただし、これらをモジュール/クラスに入れることをお勧めします。これは本当に恐ろしいことです。
単純化、単純化、単純化:
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からこのきちんとしたトリックを選んだ)
単純化、単純化、単純化 + DRY:
tasks = {}
task = lambda f: tasks.setdefault(f.__name__, f)
@task
def p1():
whatever
@task
def p2():
whatever
def my_main(key):
tasks[key]()
# 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
#!/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()
def p1( ):
print("in p1")
def p2():
print("in p2")
myDict={
"P1": p1,
"P2": p2
}
name=input("enter P1 or P2")
myDictname
これは辞書からメソッドを呼び出します
これは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
あなたは時間を無駄にしている:
P1
の名前を知っている必要があります。すべての関数を.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()
これは初心者に十分なはずです。
あなただけを使用することができます
myDict = {
"P1": (lambda x: function1()),
"P2": (lambda x: function2()),
...,
"Pn": (lambda x: functionn())}
myItems = ["P1", "P2", ..., "Pn"]
for item in myItems:
myDict[item]()