重複の可能性:
Pythonのswitchステートメントの置換?
Pythonにリストがあるとします。
リスト=('ADD'、'SUB'、'PUSH'、'POP')
入力に応じて関数を実行したいのですが、その入力はリスト内の任意の値にすることができます。
の各要素に対してswitchcaseステートメントを記述する代わりにlist
、よりコンパクトな記述方法はありますか?
私の推論は、リストが将来成長する場合のためです。
重複の可能性:
Pythonのswitchステートメントの置換?
Pythonにリストがあるとします。
リスト=('ADD'、'SUB'、'PUSH'、'POP')
入力に応じて関数を実行したいのですが、その入力はリスト内の任意の値にすることができます。
の各要素に対してswitchcaseステートメントを記述する代わりにlist
、よりコンパクトな記述方法はありますか?
私の推論は、リストが将来成長する場合のためです。
ええと、Pythonにはswitch/caseステートメントはありません。
小さい場合は、 /list
を使用します:if
elif
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
が、マップを使用してどのように行うのですか?デフォルトの関数をブロックに入れることでそれを行うことができますが、もっと簡単な方法があります。次の方法を使用するだけです。elif
else
dict
except
dict.get
def do_stuff(x, *args):
return func_map.get(x, do_default)(*args)
次のようなパターンを使用することもできます(急いでいるため、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