2012-05-07 67 views
-2

我發現它們實現switch語句的功能 - >蟒蛇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 

字符串值時,我打印出來是頭,但switch語句總是轉到最後一種情況..該函數顯然工作正常,因爲當我改變字符串與V =「頭」它工作!

任何想法出了什麼問題?

開關功能 - >

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

你從哪裏開始使用'switch'功能?你能指出它的來源嗎? –

+0

我添加了函數的實現 – user573014

回答

5

請不要這樣寫代碼。以適當的Python風格進行操作。這是更容易閱讀。任何遇到使用這種「切換」混亂的人都可能會詛咒你。

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 

至於爲什麼它的失敗,將調用readline()將很可能被包括尾部的換行符,和'Head' != 'Head\n'

+0

謝謝,我會使用(線= fp.readline()。rstrip('\ n'))與switch語句,我需要的功能打破,並發現第一次比較時,因爲在我的代碼我比較大量數據之間的情況下..我認爲如果else語句通過if(s)的整個列表並且不適用於我的需要...再次感謝您 – user573014

+0

@ user573014:*它不*。 'if','elif','elif','elif','else' ......它的處理效率很高。哪個「開關」的東西不是 - 它會非常低效。 –

+0

使用fp.readline()。rstrip(),因爲換行符可能是「\ r \ n」,因此剝離\ n將離開\ r –

0

.readline()返回整個系列,包括換行字符。

你需要或者.strip()你的字符串,或比較'Head\n'

此外,關於風格,大寫變量名是不是真的在蟒蛇的事情。

+0

謝謝,這就是我正在尋找 – user573014

0

編輯:我知道這不是Pythonic,但它是一個有趣的練習。

這是在OP添加實現之前 - 這是我的看法。 它

  • raise s的一個有意義的錯誤時,有沒有明確的情況下 - 或者,如果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