-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 

我打印它时的字符串值是 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
4

3 回答 3

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'.

于 2012-05-07T06:31:32.190 回答
0

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

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

此外,关于样式,大写变量名在 python 中并不是真正的东西。

于 2012-05-07T06:26:25.593 回答
0

编辑:我知道这不是 Pythonic,但这是一个有趣的练习。

这是在 OP 添加实现之前 - 这是我的看法。它

  • raises 在没有定义大小写时出现有意义的错误 - 或者如果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"
于 2012-05-07T06:27:15.593 回答