15

ユーザーの入力に基づいて関数を呼び出すPythonスクリプトを作成しました。今まで私は単に口述を通して引数のない関数を呼んでいました

options = { 0 : func0,
            1 : func1,
            2 : func2,
           }
options[choice]()

今、私は引数を使っていくつかの関数を呼び出す必要がある状況にあります。私はPythonを初めて使用し、次のようなことを試しました

options = { 0 : (func0,None),
            1 : (func1,None),
            2 : (func2,foo1),
            3 : (func3,foo2),
          }
options[choice][0](options[choice][1])

私はなぜNoneここで機能しないのかを知っており、関数が引数を取らないことを象徴するためだけにそれを書いています。あらゆる種類の関数で機能するように、コードにどのような変更を加える必要がありますか?

開梱してみempty dictましたが、うまくいきません。

4

4 に答える 4

26

Noneはまだ値であり、引数を期待していない関数にそれを渡すことは機能しません。代わりに、partialここでの使用を検討してください

from functools import partial

options = { 0: func0,
            1: func1,
            2: partial(func2, foo1),
            3: partial(func3, foo2),
          }

options[choice]()
于 2012-08-05T11:46:06.393 に答える
18

引数のリストを使用します。

options = { 0 : (func0, []),
            1 : (func1, []),
            2 : (func2, [foo1]),
            3 : (func3, [foo2]),
          }
options[choice][0](*options[choice][1])
# or
func, args = options[choice]
func(*args)

名前付き引数も指定できるようにする場合は、次のように拡張できます。

options = { 0 : (func0, [], {}),
            1 : (func1, [], {param_name: value}),
            2 : (print_name, [], {name: "nims"}),
            3 : (func3, [foo2], {}),
          }
func, args, kwargs = options[choice]
func(*args, **kwargs)
于 2012-08-05T11:45:08.290 に答える
4

引数を使用して関数にラムダ式を使用できます(そして、現在の関数をそのままにしておくことができます)。

options = { 0 : func0,
            1 : func1,
            2 : lambda: func2(foo1),
            3 : lambda: func3(foo2),
          }
于 2012-08-05T11:49:04.170 に答える
1

このようなものを試してください:

関数ヘッダーで使用する*と、すべての引数がタプルに収集されます。

def func0(*a):
    print list(a)
def func1(*a):
    print list(a)
def func2(*a):
    print list(a)
def func3(*a):
    print list(a)
foo1=1
foo2=2
options = { 0 : (func0,None),
            1 : (func1,None),
            2 : (func2,foo1),
            3 : (func3,foo2),
          }
choice=2
options[choice][0](options[choice][1:])  #prints [(1,)]

choice=1
options[choice][0](options[choice][1:])  #prints [(None,)]
于 2012-08-05T11:51:15.853 に答える