수색…


비고

Python에는 언어 디자인 선택 항목으로 switch 문이 없습니다 . 거부 된 주제를 다루는 PEP ( PEP-3103 )가 있습니다.

파이썬에서 자신 만의 switch 문을 수행하는 방법에 대한 많은 레서피 목록을 찾을 수 있습니다. 여기서는 가장 현명한 옵션을 제안하려고합니다. 다음은 확인할 수있는 장소입니다.

언어가 제공하는 것을 사용하십시오 : if / else 구조.

글쎄, switch / case 구조를 원한다면 갈 수있는 가장 직접적인 방법은 좋은 old if / else 구조를 사용하는 것입니다.

def switch(value):
    if value == 1:
        return "one"
    if value == 2:
        return "two"
    if value == 42:
        return "the answer to the question about life, the universe and everything"
    raise Exception("No case found!")

그것은 중복되어 보일 수도 있고 언제나 예쁘지는 않을 수도 있습니다.하지만 이것은 가장 효율적인 방법입니다.

>>> switch(1)
one
>>> switch(2)
two
>>> switch(3)
…
Exception: No case found!
>>> switch(42)
the answer to the question about life the universe and everything

함수의 사용

앞으로 나아갈 수있는 또 다른 방법은 함수 사전을 만드는 것입니다.

switch = {
    1: lambda: 'one',
    2: lambda: 'two',
    42: lambda: 'the answer of life the universe and everything',
}

기본 함수를 추가합니다.

def default_case():
    raise Exception('No case found!')

사전의 get 메소드를 사용하여 값을 확인하고 실행하는 함수를 가져옵니다. 값이 사전에 없으면 default_case 가 실행됩니다.

>>> switch.get(1, default_case)()
one
>>> switch.get(2, default_case)()
two
>>> switch.get(3, default_case)()
…
Exception: No case found!
>>> switch.get(42, default_case)()
the answer of life the universe and everything

스위치가 더 멋지게 보이도록 통사론을 만들 수도 있습니다.

def run_switch(value):
    return switch.get(value, default_case)()

>>> run_switch(1)
one

클래스 인트로 스펙 션 사용

클래스를 사용하여 스위치 / 사례 구조를 모방 할 수 있습니다. 다음은 "case"부분을 해결하기 위해 문자열을 인스턴스의 바운드 메소드로 확인하는 getattr() 함수를 사용하여 클래스의 내부 검사를 사용하는 것입니다.

그런 다음 introspecting 메서드는 __call__ 메서드에 별칭을 지정하여 () 연산자를 오버로드합니다.

class SwitchBase:
    def switch(self, case):
        m = getattr(self, 'case_{}'.format(case), None)
        if not m:
            return self.default
        return m

    __call__ = switch

그다음 멋지게 보이게하기 위해 SwitchBase 클래스를 서브 클래 싱합니다 (하지만 한 클래스에서 수행 할 수 있음). 모든 case 를 메소드로 정의합니다.

class CustomSwitcher:
    def case_1(self):
        return 'one'

    def case_2(self):
        return 'two'

    def case_42(self):
        return 'the answer of life, the universe and everything!'

    def default(self):
        raise Exception('Not a case!')

그래서 우리는 마침내 그것을 사용할 수 있습니다 :

>>> switch = CustomSwitcher()
>>> print(switch(1))
one
>>> print(switch(2))
two
>>> print(switch(3))
…
Exception: Not a case!
>>> print(switch(42))
the answer of life, the universe and everything!

컨텍스트 관리자 사용

매우 읽기 쉽고 우아하지만 if / else 구조보다 훨씬 효율적인 또 다른 방법은 다음과 같은 클래스를 작성하여 비교할 값을 읽고 저장하고 컨텍스트 내에서 호출 가능 객체로 노출시키는 것입니다 저장된 값과 일치하면 true를 반환합니다.

class Switch:
    def __init__(self, value): 
        self._val = value
    def __enter__(self):
        return self
    def __exit__(self, type, value, traceback):
        return False # Allows traceback to occur
    def __call__(self, cond, *mconds): 
        return self._val in (cond,)+mconds

케이스를 정의하는 것은 실제 switch / case 구조 (아래 함수에서 노출하기 쉽도록하기 위해 노출)와 거의 일치합니다.

def run_switch(value):
    with Switch(value) as case:
        if case(1):
            return 'one'
        if case(2):
            return 'two'
        if case(3):
            return 'the answer to the question about life, the universe and everything'
        # default
        raise Exception('Not a case!')

따라서 실행은 다음과 같습니다.

>>> run_switch(1)
one
>>> run_switch(2)
two
>>> run_switch(3)
…
Exception: Not a case!
>>> run_switch(42)
the answer to the question about life, the universe and everything

노트 베네 :



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow