>  기사  >  백엔드 개발  >  Python에서 스위치/케이스 문을 구현하는 방법

Python에서 스위치/케이스 문을 구현하는 방법

不言
不言원래의
2018-09-18 15:21:168673검색

이 기사의 내용은 Python에서 switch/case 문을 구현하는 방법에 대한 것입니다. 특정 참고 가치가 있으므로 도움이 필요한 친구에게 도움이 되길 바랍니다.

Python에는 Switch/Case 문이 없습니다. 많은 사람들은 이 문이 충분히 우아하지 않고 유연하지 않다고 생각합니다. Python 플레이어에서는 특정 경험이 있는 다중 조건 일치 문제를 처리하는 것이 더 간단하고 효율적입니다. 인정해야 해, 정말.

하지만 오늘은 Python을 사용해야 하는 경우 Switch/Case를 플레이하는 방법을 살펴보겠습니다.

Grammar Constraints

먼저 Switch/Case를 어떻게 표현해야 하는지 정의해 보겠습니다.

def cn():
    print('cn')

def us():
    print('us')

switch(lang).case('cn',cn)
            .case('us',us)
               .default(us)

클래스 구현 1

위의 제약 조건을 사용하여 스위치를 클래스로 구현할 수 있습니다. 들어오는 매개 변수는 생성자에서 처리된 다음 케이스와 기본 메서드가 각각 구현됩니다.

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_path와 실행 상태 _invoked를 기억합니다. case()에서 현재 키가 switch_to와 일치하고 함수가 실행되지 않은 경우 _invoked를 업데이트하고 해당 메서드를 실행합니다. default()에서 _invoked를 확인하세요. 실행된 적이 없다면 default 분기의 함수를 호출하세요. case_path 和执行状态_invoked,在case()里如果当前的keyswitch_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

让我们来看几个奇葩一点的case。

# 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>

发现了没有,上面的实现不会处理重复的case,当然你可以加强一下case方法,最好是抛出异常,其他编程语言通常都这样做。

第二个问题,你希望从case里拿到返回值,像上面的写法是没希望了,因为扔掉了。我们可以考虑在switch类里加一个result的变量来保存执行结果。

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

몇 가지 이상한 사례를 살펴보겠습니다.

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!")
알고 계셨나요? 위의 구현은 반복되는 사례를 처리하지 않습니다. 물론 예외를 발생시켜 사례 방법을 강화할 수 있습니다.

두 번째 질문은 케이스에서 반환 값을 가져오려는 경우이므로 위와 같이 작성하면 희망이 없습니다. 실행 결과를 저장하기 위해 스위치 클래스에 결과 변수를 추가하는 것을 고려할 수 있습니다.

MAPPING = {
    'cn': cn,
    'us': us
}

lang = 'cn'
result = MAPPING.get(lang, default=us)

통화가 완료된 후 result를 통해 결과를 받아보실 수 있습니다.

rrreee

클래스 구현 2

아마 인터넷에서 검색했을 텐데 브라이언 벡을 참고해서 Swich/Case를 클래스를 통해 구현해보셔도 됩니다. 🎜rrreee🎜이런 종류의 구현은 상대적으로 복잡하고 사용하기가 그리 편하지 않습니다. for와 if가 모두 필요합니다(직접적인 if/else만큼 만족스럽지는 않습니다). 물론, 같은 결과의 케이스를 하나로 묶을 수 있고, 그 케이스에 단순히 메소드 이름뿐만 아니라 더 많은 것을 쓸 수 있다는 장점도 있습니다. 🎜🎜마지막에 작성됨🎜🎜마지막으로 스위치/대소문자 문제를 처리하기 위해 Python에서 권장하는 방법으로 돌아가야 합니다. 일반적으로 예를 들어 이 다중 분기 문제를 처리하려면 사전을 사용할 수 있습니다. 🎜rrreee🎜 한눈에 봐도 읽기 쉬울 뿐 아니라 관리하기도 쉽죠? 키는 사전에서 고유하며 값은 클래스나 메소드 등 모든 유형의 데이터일 수 있으므로 충분히 유연합니다. 🎜

위 내용은 Python에서 스위치/케이스 문을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.