python switch语句不起作用

时间:2012-05-07 06:07:53

标签: python file-io switch-statement

我找到了一个实现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 

我打印时的字符串值是Head,但是switch语句总是转到最后一种情况..函数显然工作正常,因为当我用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

3 个答案:

答案 0 :(得分:5)

请不要写这样的代码。以适当的Python风格做到这一点。它的很多更容易阅读。任何人都会使用#34;切换"一团糟可能会痛苦地诅咒你。

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'

答案 1 :(得分:0)

.readline()返回整行,包括换行符。

您需要.strip()字符串,或与'Head\n'等进行比较。

另外,关于样式,大写变量名称在python中并不是真的。

答案 2 :(得分:0)

编辑:我知道这不是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"