我正在编写一个脚本,它将使用dom4j从HTML中获取某些信息.
由于Python/Jython没有本机switch语句,所以我决定使用一大堆调用适当方法的if语句,如下所示:
if type == 'extractTitle': extractTitle(dom) if type == 'extractMetaTags': extractMetaTags(dom)
我将添加更多内容,具体取决于我想从HTML中提取哪些信息,并考虑采用我在本网站其他地方找到的字典方法,例如:
{ 'extractTitle': extractTitle, 'extractMetaTags': extractMetaTags }[type](dom)
我知道每次运行脚本时都会构建字典,但同时如果我要使用if语句,脚本必须检查所有这些字段,直到找到正确的字符.我真的很想知道哪一个表现更好或者通常更好的做法?
更新: @Brian - 感谢您的回复.我有一个问题,如果任何提取方法需要多个对象,例如
handle_extractTag(self, dom, anotherObject) # Do something
您如何对handle方法进行适当的更改来实现它?希望你知道我的意思:)
干杯
为了避免在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)
用法:
handler = MyHandler() handler.handle('extractTitle', dom)
更新:
如果有多个参数,只需更改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)