2017-03-01 11 views
0

私は1つの引数を持つ関数を持っています。関数内には、外部関数に渡すことのできる引数を持つ内部関数があります。外部関数に渡された引数に基づいて内部関数を呼び出す

def delete_alphabet(del_apha): 
    def del_a(): 
     # code to delete a 
    def del_b(): 
     # code to delete b 
    def del_c(): 
     # code to delete c 
    def del_d(): 
     # code to delete d 

は、私は、 delete_alphabet(a)del_d()私が合格したときにb delete_alphabet(b)へ 通話機能del_a()del_c()、 通話機能del_a()del_b()del_d()aを渡す際に、機能del_b()del_c()del_d()を呼び出したいです私はcdelete_alphabet(c), コールファンクションdel_a()del_b()del_c()私はd

delete_alphabet(d) にを渡す誰かが私にこれを解決する方法を提案することはできますか?

+0

「b」とは何ですか? 'a'とは何ですか? 「削除」とはどういう意味ですか?うまくいけば「del」ではない...しかし、なぜこれらの機能は閉鎖状態にあるのだろうか?彼らは外で定義することはできませんでしたか?より詳しくは、 –

+0

と入力してください。 'a'と' b'は、いくつかのファイルから削除したい文字列です。 「デル」ではない。 –

+0

'delete_string(x)'はなぜ 'x'は' a'や 'b'でもかまいませんか? –

答えて

0

Pythonでは、関数は単なるオブジェクトです。あなたのアプローチは、このほど簡単になりますので、

In [22]: def del_a(): print('deleting a') 

In [23]: def del_b(): print('deleting b') 

In [24]: def del_c(): print('deleting c') 

In [25]: def del_d(): print('deleting d') 

In [26]: funcs = {'a':(del_a, del_c, del_d), 'b': (del_a, del_b, del_d)} 

In [27]: def delete_alphabet(del_alpha, funcs=funcs): 
    ...:  for f in funcs[del_alpha]: 
    ...:   f() 
    ...: 

In [28]: delete_alphabet('a') 
deleting a 
deleting c 
deleting d 

In [29]: delete_alphabet('b') 
deleting a 
deleting b 
deleting d 

EDIT 、コメントで明確化を考えると、私のアプローチは、次のようになります。

In [30]: funcs = [('a', del_a), ('b', del_b), ('c', del_c), ('d', del_d)] 

In [31]: def delete_alphabet(del_alpha, funcs=funcs): 
    ...:  for c, f in funcs: 
    ...:   if c != del_alpha: 
    ...:    f() 
    ...: 

In [32]: delete_alphabet('a') 
deleting b 
deleting c 
deleting d 

In [33]: delete_alphabet('b') 
deleting a 
deleting c 
deleting d 

In [34]: delete_alphabet('c') 
deleting a 
deleting b 
deleting d 

In [35]: delete_alphabet('d') 
deleting a 
deleting b 
deleting c 

いくつかを維持するために多くのクリーナーです一部のevalハックを使用するのではなく、文字列から関数へのマッピングの並べ替え。

+0

20以上の有効な引数を渡すと、コード内の行数が増えますが、これは見栄えが悪いため、呼び出し関数の繰り返しを避けるために代替アプローチをとる必要があります。 'funcs = {'a' :(del_a、del_c、del_d)、 'b':(del_a、del_b、del_d)}'これは20個以上のすべての引数に対して書く必要があります。 –

+0

@Sweetyまあ、あなたの引数を指定して呼び出す関数を列挙する以外の方法は他にありますか? Pythonはあなたの心を読むことができません...プログラムで得ることができる関数に '' a ''という意味があるのでしょうか?もしそうなら、あなたはあなたの質問にそれを指定していません。 –

+0

@Sweety AH。私は今あなたが欲しいものを見ます。私は「del_a」が「a」のために呼び出されていないことを理解していませんでした。私はパターンを参照してください... –

関連する問題