Unk*_*wn 4 python design-patterns
我需要一个代码的帮助,我想在python中实现switch case模式,所以就像一些教程所说,我可以使用字典,但这是我的问题:
# type can be either create or update or ..
message = { 'create':msg(some_data),
'update':msg(other_data)
# can have more
}
return message(type)
Run Code Online (Sandbox Code Playgroud)
但它不适合我,因为some_data或other_data可以是None(如果没有则会引发错误)并且msg函数需要很简单(我不想在其中加入一些条件).
这里的问题是每次执行函数msg()以填充dict,这与开关案例模式不同,后者通常在其他编程语言中不执行代码,case除非它是匹配的.
还有另一种方法可以做到这一点,或者我只需要做,如果elif ...
更新: 感谢您的所有回复,但实际上它更像是这样
message = { 'create': "blabla %s" % msg(some_data),
'update': "blabla %s" % msg(other_data)
'delete': "blabla %s" % diff(other_data, some_data)
}
Run Code Online (Sandbox Code Playgroud)
所以lambda在这里不起作用而且没有调用相同的函数,所以它更像是我需要的真正的开关案例,也许我必须考虑其他模式.
message = { 'create':msg(some_data or ''),
'update':msg(other_data or '')
# can have more
}
Run Code Online (Sandbox Code Playgroud)
更好的是,为了防止msg被执行只是为了填补字典:
message = { 'create':(msg,some_data),
'update':(msg,other_data),
# can have more
}
func,data=message[msg_type]
func(data)
Run Code Online (Sandbox Code Playgroud)
现在你可以自由地定义一个更合理的msg函数,它可以处理一个等于的参数None:
def msg(data):
if data is None: data=''
...
Run Code Online (Sandbox Code Playgroud)
听起来你比你需要的更复杂.你想要简单吗?
if mytype == 'create':
return msg(some_data)
elif mytype == 'update':
return msg(other_data)
else:
return msg(default_data)
Run Code Online (Sandbox Code Playgroud)
你不具备使用类型的字典和函数引用,只是因为你可以.有时一个无聊的显式if/else块正是你需要的.即使是团队中最新的程序员也很清楚,并且不会不必要地调用msg().我也愿意打赌,这将比你正在处理的其他解决方案更快,除非案例数量增长并且msg()快速闪电.