ホームページ >バックエンド開発 >Python チュートリアル >Pythonでswitch/case文を実装する方法
この記事の内容は、Python での switch/case 文の実装方法に関するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。
Python には Switch/Case ステートメントがありません。多くの人は、このステートメントは洗練されておらず、十分な柔軟性がないと考えています。Python で複数条件の一致の問題を処理するには、辞書を使用する方が簡単で効率的です。 Python Player の経験がある人は、これが実際に当てはまることを認めなければなりません。
しかし、今日は Python を使用する必要がある場合に Switch/Case をプレイする方法を見ていきます。
まず、Switch/Case の表現方法を定義しましょう。簡単にするために、次のようになります。
def cn(): print('cn') def us(): print('us') switch(lang).case('cn',cn) .case('us',us) .default(us)
上記の制約により、switch をクラスとして実装できます。受信パラメータはコンストラクターで処理され、その後、case メソッドと default メソッドがそれぞれ実装されます。
class switch(object): def __init__(self, case_path): self.switch_to = case_path self._invoked = False def case(self, key, method): if self.switch_to == key and not self._invoked: self._invoked = True method() return self def default(self, method): if not self._invoked: self._invoked = True method()
コンストラクターでは、現在の キー
の場合、case()
で case_path
と実行ステータス _invoked
を記憶します。 switch_to
と一致し、関数がまだ実行されていない場合は、_invoked
を更新して、対応するメソッドを実行します。 default()
の _invoked
を確認します。まだ実行されていない場合は、default
ブランチの関数を呼び出します。
なかなか良さそうなので、試してみましょう。
switch('cn').case('cn',cn).case('us',us).default(fail) >>> cn switch('us').case('cn',cn).case('us',us).default(fail) >>> cn switch('jp').case('cn',cn).case('us',us).default(fail) >>> fail switch('cn').case('cn',cn).case('us',us) >>> cn
いくつかの奇妙なケースを見てみましょう。
# duplicate case switch('us').case('us',cn).case('us',us).default(fail) >>> cn def cn() return 'cn' def us() return 'us' # return value result = switch('cn').case('cn',cn).case('us',us) result >>> <python_switch_case.switch object at 0x11034fb70>
わかりましたか? 上記の実装では、繰り返し発生するケースは処理されません。もちろん、できれば例外をスローすることで、ケース メソッドを強化できます。これは通常、他のプログラミング言語で行われます。
2つ目の質問は、ケースの戻り値を取得したいのですが、上記のように書いても捨てられてしまうので仕方ありません。実行結果を保存するために、switch クラスに結果変数を追加することを検討できます。
class switch(object): def __init__(self, case_path): ... self.result = None def case(self, key, method): ... self.result = method() ...
通話が完了すると、result
を通じて結果を取得できます。
_ = switch('cn').case('cn',cn).case('us',us) _.result >>> cn
おそらくインターネットで検索したと思います。クラスを介して Swich/Case を実装する方法については、Brian Beck を参照することもできます。
class switch(object): def __init__(self, value): self.value = value self.fall = False def __iter__(self): """Return the match method once, then stop""" yield self.match raise StopIteration def match(self, *args): """Indicate whether or not to enter a case suite""" if self.fall or not args: return True elif self.value in args: self.fall = True return True else: return False c = 'z' for case in switch(c): if case('a'): pass # only necessary if the rest of the suite is empty if case('c'): pass # ... if case('y'): pass if case('z'): print("c is lowercase!") break if case('A'): pass # ... if case('Z'): print("c is uppercase!") break if case(): # default print("I dunno what c was!")
この種の実装は比較的複雑で、for と if の両方が必要であるため、あまり快適に使用できません (直接の if/else ほど快適ではありません)。もちろん、同じ結果のケースをまとめられる、ケース内にメソッド名だけでなく、より多くの内容を記述できるなどのメリットもあります。
最後に、switch/case 問題に対処するために Python が推奨する方法に戻る必要があります。一般に、このマルチブランチ問題は次の方法で対処できます。例として辞書。
MAPPING = { 'cn': cn, 'us': us } lang = 'cn' result = MAPPING.get(lang, default=us)
一目で分かりやすく、読みやすいだけでなく保守も容易ですか。キーはディクショナリ内で一意であり、値はクラスまたはメソッドのいずれかのタイプのデータであるため、十分な柔軟性があります。
以上がPythonでswitch/case文を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。