python – 字典或If语句,Jython

我正在编写一个脚本,它将使用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)

转载注明原文:python – 字典或If语句,Jython - 代码日志