Python在switch语句中设置变量

时间:2018-02-18 00:48:06

标签: python switch-statement getter-setter

我尝试使用switch case语句设置依赖于类型的变量。

我有一个类规则,其外观如下:

class rule:

    def __init__(self):
        name = ""
        src = ""

    def setName(self, name):
        self.__name = name

    def getName(self):
        return self.__name
    name = property(getName, setName)

    def setSrc(self, src):
        self.__src = src

    def getSrc(self):
        return self.__src
    src = property(getSrc, setSrc)

和文本文件如下

option <type> <value>
option name myname
option src anysrc

我搜索字符串选项并获取secound和第三个字符串。至于好。 例如(qick and dirty):

with open("file") as f:
    for line in f:
        if line.find('option') != -1:
            type(line.split(' ')[1], line.split(' ')[2])

现在我已经编写了一个switch case语句来设置对象规则中的变量。

def type(option, value):
    switcher = {
        "name": rule.name = value,
        "src": rule.src = value,
    }
    switcher.get(option, lambda: "Invalid Option")

但这不起作用,我面对以下:

  File "./read.py", line 112
    "name": rule.name = value,
                      ^
SyntaxError: invalid syntax

我不知道如何解决这个问题或者如何通过其他方式解决这个问题。 知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

Python没有switch语句。正如您已经知道的那样,常见的替代方法是使用字典来分派不同的行为。但是,在这种情况下,您尝试使用的语法根本不允许用于词典。字典键值应为表达式。您可以使用匿名函数和setattr解决此问题。这是一个独立的例子:

>>> class Dummy:
        pass

>>> dummy = Dummy()
>>> dic = {
    'a': lambda: setattr(dummy, 'a', 0),
    'b': lambda: setattr(dummy, 'b', 0)
}
>>> dic.get('a', lambda: print("Invalid Option"))()
>>> dummy.a
0
>>> dic.get('b', lambda: print("Invalid Option"))()
>>> dummy.b
0
>>> dic.get('x', lambda: print("Invalid Option"))()
Invalid Option
>>> 

答案 1 :(得分:0)

你实际上并没有在那里定义一个switch语句:

switcher = {
    "name": rule.name = value,
    "src": rule.src = value,
}

这是一本字典,解释器抱怨这些语句是值。

您可以像这样引用您的方法:

def type(option, value):
    switcher = {
        "name": rule.setName,
        "src": rule.setSrc
    } 

    method = switcher.get(option, lambda: "Invalid Option")
    method(rule, value)

另一个想法

这是另一个方法。也许这样的事情很有帮助:

def type(rule, option, value):
    if hasattr(rule, option):
        setattr(rule, option, value)
    else:
        print("Invalid Option") # Some error handling

明确检查选项名称

@PaulPanzer指出,这可能是你打算明确检查天气选项是否正确。所以这是type函数的更安全版本:

def type(rule, option, value):
    if option in ["name", "src"]:
        setattr(rule, option, value)
    else:
        print("Invalid Option") # Some error handling

这意味着无论何时扩展文件格式,都必须在两个不同的位置更改代码。但这是一个关于你想要的防御性,规则扩展的频率以及你需要多大的灵活性的问题。