我尝试使用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
我不知道如何解决这个问题或者如何通过其他方式解决这个问题。 知道如何解决这个问题吗?
答案 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
这意味着无论何时扩展文件格式,都必须在两个不同的位置更改代码。但这是一个关于你想要的防御性,规则扩展的频率以及你需要多大的灵活性的问题。