2017-10-24 2 views
4

파이썬에서 스위치 로직을 구현하려고합니다. 나는 다음과 같은 코드를 빌드 Replacements for switch statement in Python?을 바탕으로Pythonic switch within class

:

I am case 2 

이 사전인가 출력이 될

I am case 1 
I am case 2 
I am case 3 
default 

내가 기대 :

def func(string): 
    print(string) 

class Switch: 
    def __init__(self): 
     pass 

    def first_switch(self, case): 
     return { 
      '1': func('I am case 1'), 
      '2': func('I am case 2'), 
      '3': func('I am case 3'), 
      }.get(case, func('default')) 


switch = Switch() 
switch.first_switch('2') 

이 나에게 출력을 줄 것이다 -case-logic은 클래스 정의 외부에서만 사용 가능하거나 추가 코드가 누락 되었습니까? 모든 사전 키 - 값 쌍이 함수 호출에서 평가되는 것처럼 보입니다.

+0

값은 함수를 호출 한 * 결과 *입니다. 왜 그냥 문자열을 저장하지 말고, 사전에서 빠져 나오면 무엇이든'func'을 호출하십시오. 또한'print '일 때'func'을 사용하는 것이 왜 싫은가요? – jonrsharpe

+0

값을 저장하려면 func이 인수를 반환해야합니다. 지금 당신의 사전은 모두 Nones입니다. –

답변

7

사전을 작성하는 동안 항상 모든 기능을 호출합니다. 그것은 수업과는 아무런 관련이 없습니다.

d = {'foo': bar()} 

bar

여기에 호출되고 그 반환 값은 d['foo']에 할당. 이것은 switch 문이 아니라는 것을 기억하십시오. switch 문을 에뮬레이트하는 데 사용되는 사전 리터럴입니다. 귀하의 경우에는

는, 함수는 그렇게 전혀 포함하지 않고, 변수되지 않습니다 : 함수가 변수뿐만 아니라입니다

arg = { 
    '1': 'I am case 1', 
    '2': 'I am case 2', 
    '3': 'I am case 3', 
}.get(case, 'default') 
func(arg) 

경우 사전 값 callables을하고 싶은를 호출 할 때 함수 를 호출합니다 : 아마도

{'1': lambda: func('I am case 1'), ...}.get(...)() 
        # call the function you got ^^ 

또는를 :

from functools import partial 

{'1': partial(func, 'I am case 1'), ...}.get(...)() 
+0

부적절한 예제로 미안합니다. 호출하고자하는 함수가 실제로 가변적이어서'lambda' 표현식이 핵심입니다! 당신의 설명에 감사드립니다! – heiiRa

0

다른 솔루션은 다음과 같습니다.

def func(string): 
    print(string) 

class Switch: 
    def __init__(self): 
     pass 

    def first_switch(self, case): 
     param = { 
      '1': (func, 'I am case 1'), 
      '2': (func, 'I am case 2'), 
      '3': (func, 'I am case 3'), 
      }.get(case, (func, 'default')) 
     return param[0](*param[1:]) 

switch = Switch() 
switch.first_switch('2') 
+0

확실하게'param [0] (* param [1 :])'도 역시 ...? – deceze

+0

고마워요, –

+0

아니요. "func_wrapper"가 필요 없다는 뜻입니다. – deceze