Rai*_*Son 4 python jython switch-statement
我正在编写一个脚本,它将使用dom4j从HTML中获取某些信息.
由于Python/Jython没有本机switch语句,所以我决定使用一大堆调用适当方法的if语句,如下所示:
if type == 'extractTitle':
extractTitle(dom)
if type == 'extractMetaTags':
extractMetaTags(dom)
Run Code Online (Sandbox Code Playgroud)
我将添加更多内容,具体取决于我想从HTML中提取哪些信息,并考虑采用我在本网站其他地方找到的字典方法,例如:
{
'extractTitle': extractTitle,
'extractMetaTags': extractMetaTags
}[type](dom)
Run Code Online (Sandbox Code Playgroud)
我知道每次运行脚本时都会构建字典,但同时如果我要使用if语句,脚本必须检查所有这些字段,直到找到正确的字符.我真的很想知道哪一个表现更好或者通常更好的做法?
更新: @Brian - 感谢您的回复.我有一个问题,如果任何提取方法需要多个对象,例如
handle_extractTag(self, dom, anotherObject)
# Do something
Run Code Online (Sandbox Code Playgroud)
您如何对handle方法进行适当的更改来实现它?希望你知道我的意思:)
干杯
Bri*_*ian 14
为了避免在dict中指定标记和处理程序,您可以使用一个处理程序类,其方法名称与该类型匹配.例如
class MyHandler(object):
def handle_extractTitle(self, dom):
# do something
def handle_extractMetaTags(self, dom):
# do something
def handle(self, type, dom):
func = getattr(self, 'handle_%s' % type, None)
if func is None:
raise Exception("No handler for type %r" % type)
return func(dom)
Run Code Online (Sandbox Code Playgroud)
用法:
handler = MyHandler()
handler.handle('extractTitle', dom)
Run Code Online (Sandbox Code Playgroud)
更新:
如果有多个参数,只需更改handle函数以获取这些参数并将它们传递给函数.如果你想让它更通用(所以你不必在更改参数签名时更改处理函数和handle方法),你可以使用*args和**kwargs语法来传递所有收到的参数.然后句柄方法变为:
def handle(self, type, *args, **kwargs):
func = getattr(self, 'handle_%s' % type, None)
if func is None:
raise Exception("No handler for type %r" % type)
return func(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)