0

重複の可能性:
Pythonのswitchステートメントの置換?

Pythonにリストがあるとします。

リスト=('ADD'、'SUB'、'PUSH'、'POP')

入力に応じて関数を実行したいのですが、その入力はリスト内の任意の値にすることができます。

の各要素に対してswitchcaseステートメントを記述する代わりにlist、よりコンパクトな記述方法はありますか?

私の推論は、リストが将来成長する場合のためです。

4

2 に答える 2

5

ええと、Pythonにswitch/caseステートメントはありません。

小さい場合は、 /listを使用します:ifelif

def do_stuff(x, *args):
    if x == 'ADD':
        return do_add(*args)
    elif x == 'SUB':
        return do_sub(*args)
    # …
    else:
        raise RuntimeError('Never heard of {}'.format(x))

より大きなlist場合は、それぞれのケースが関数であることを確認し(上記で既に想定していますがreturn args[0] + args[1]、のようなコードがある場合は、それを関数に変更する必要がありdo_addます)、関数へのdictマッピング名を作成します。

func_map = {'ADD': do_add, 'SUB': do_sub, … }

def do_stuff(x, *args):
    try:
        return func_map[x](*args)
    except KeyError:
        raise RuntimeError('Never heard of {}'.format(x))

Pythonでは、関数は他のオブジェクトと同じように渡すことができる通常のオブジェクトであるため、これは機能します。したがって、それらをに格納し、dictから取得してdict、それでも呼び出すことができます。

ちなみに、これはすべてFAQで説明されており、少し凝ったものもあります。

エラーを発生させる代わりに呼び出したいデフォルトの関数がある場合、//チェーンを使用してそれを行う方法は明らかですifが、マップを使用してどのように行うのですか?デフォルトの関数をブロックに入れることでそれを行うことができますが、もっと簡単な方法があります。次の方法を使用するだけです。elifelsedictexceptdict.get

def do_stuff(x, *args):
    return func_map.get(x, do_default)(*args)
于 2013-02-05T01:49:22.727 に答える
0

次のようなパターンを使用することもできます(急いでいるため、ATMをクリーンアップできません)。

>>> class Test(object):
...     def test_FOO(self):
...             print 'foo'
...     
...     def test_BAR(self):
...             print 'bar'
... 
>>> def run_on(cls, name):
...     getattr(cls, 'test_%s' % name)()
... 
>>> run_on(Test(), 'FOO')
foo
于 2013-02-05T02:02:15.640 に答える