2012-05-07 5 views
-2

작동하지 않습니다 - 나는 그것이 머리 인쇄 할 때>파이썬 switch 문은 내가 스위치 문 구현 함수 발견

File = open('/file.txt','r') 

    String = File.readline() 
    String = str(String) 
    print String 

    for case in switch(String): 
     if case("Head"): 
      print "test successed" 
      break 
     if case("Small"): 
      print String 
      break 
     if case("Big"): 
      print String 
      break 
     if case(): 
      print String 
      break 

문자열 값을하지만, 스위치 문은 항상 마지막 경우로 이동 .. 함수가 잘 작동합니다. 왜냐하면 내가 v = "Head"로 문자열을 변경했기 때문입니다!

어떤 아이디어가 잘못 되었나요?

스위치 기능 ->

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: # changed for v1.5, see below 
     self.fall = True 
     return True 
    else: 
     return False 
+0

당신은'case'와'switch' 객체/함수의 구현을 연결해야합니다. 그렇지 않으면 누구도 대답 할 수없는 질문을하고 있습니다. – ninjagecko

+0

이 '스위치'기능을 어디에서 가져 보았습니까? 그 근원을 가리킬 수 있습니까? –

+0

함수의 구현을 추가했습니다 – user573014

답변

5

다음과 같은 코드를 작성하지 마십시오. 적절한 파이썬 스타일로하십시오. 그것은 많이 읽기 쉽습니다. 그 "스위치"엉망의 사용을 가로 질러 오는 누군가는 아마 당신을 진심으로 저주 할 것입니다. 그것이 실패 왜에 따라, readline() 호출이 매우 가능성이 후행 개행 문자를 포함됩니다


with open('/file.txt', 'r') as fp: 
    line = fp.readline().rstrip('\n') 
    print line 

if line == 'Head': 
    print "test successed" 
elif line == 'Small': 
    print line 
elif line == 'Big': 
    print line 
else: 
    print line 

'Head' != 'Head\n'.

+0

고마워, 나는 (줄 = fp.readline() 사용합니다.rstrip ('\ n')) switch 문과 함께, 나는 휴식을 취할 함수가 필요하고 내 코드에서 나는 많은 데이터를 비교하고 있기 때문에 그것이 첫 번째 비교를 찾을 때 밖으로 나가 .. else if statement if (s)의 전체 목록을 살펴보고 내 필요에 적용되지 않을 것입니다. 다시 고맙습니다. – user573014

+0

@ user573014 : * does not *. 'if','elif','elif','elif','else' ... 효율적으로 처리됩니다. 그게 '전환'되지 않는 것이지 - 매우 비효율적 일 것입니다. –

+0

fp.readline(). rstrip() 줄 바꿈이 "\ r \ n"이 될 수 있으므로 \ n을 벗겨 내면됩니다. \ –

0

.readline()는 개행 문자를 포함한 전체 라인을 반환합니다.

당신은, 대문자 변수 이름은 정말 파이썬에있는 것이 아니다 스타일에 관한에 하나 .strip() 당신의 문자열이 필요하거나 등 'Head\n' 또한

비교.

+0

감사합니다, 그게 내가 무엇을 찾고 있었는지 – user573014

0

EDIT : 나는 Pythonic이 아니라는 것을 알고 있지만 흥미로운 연습이었다.

이것은 OP가 구현을 추가하기 전이었습니다. 의미있는 오류와 그것은

  • raise의이 정의 된 경우가 없습니다 - 또는 allow_fallthrough가 설정되어있는 경우, 기본 케이스 for:else:
  • 으로 처리 할 수는 발생하는 기본 케이스를 할 수 있습니다 어디든지 "switch" 스위트
  • 에서

.

def switch(arg, allow_fallthrough = False): 
    fail = False 
    def switcher(*args): 
     return (arg in args) 
    def default_switcher(*args): 
     return (not args) 
    def fallthrough(*args): 
     if not allow_fallthrough: 
      raise ValueError("switch(%r) fell through" % arg) 
    yield switcher 
    yield default_switcher 
    yield fallthrough 

def test(): 
    String = "Smallish" 

    for case in switch(String): 
     if case(): 
      print "default", String 
      break 
     if case("Head"): 
      print "Head GET" 
      break 
     if case("Small", "Smallish"): 
      print "Small:", String 
      break 
     if case("Big"): 
      print "Big:", String 
      break 
    else: # Only ever reached with `allow_fallthrough` 
     print "No case matched" 
+0

당신의 도움에 감사합니다 – user573014