字典或If语句,Jython

2024-10-01 15:42:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在正在编写一个脚本,它将使用dom4j从HTML获取某些信息

由于Python/Jython没有本机的开关语句,我决定使用一大堆调用适当方法的if语句,如下所示:

if type == 'extractTitle':
    extractTitle(dom)
if type == 'extractMetaTags':
    extractMetaTags(dom)

我会根据我想从HTML中提取的信息添加更多信息,并考虑采用我在本网站其他地方找到的字典方法,示例如下:

^{pr2}$

我知道每次运行脚本时都会构建字典,但同时如果我要使用if语句,脚本必须检查所有语句,直到找到正确的语句为止。我真正想知道的是,哪一种方法表现更好,或者更适合使用?在

更新:@Brian-谢谢你的回复。我有一个问题,如果任何提取方法需要多个对象,例如

handle_extractTag(self, dom, anotherObject)
# Do something

如何对句柄方法进行适当的更改以实现这一点?希望你明白我的意思:)

干杯


Tags: 方法脚本信息if字典网站htmltype
3条回答

为了避免在类中使用dict和指定的方法,可以使用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)

用法:

^{pr2}$

更新:

当有多个参数时,只需更改handle函数以获取这些参数并将它们传递给函数。如果希望使其更通用(这样在更改参数签名时不必同时更改处理程序函数和句柄方法),则可以使用*args和**kwargs语法来传递所有接收到的参数。然后,handle方法变为:

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)

用你的代码,你运行的函数都会被调用。在

handlers = {
'extractTitle': extractTitle, 
'extractMetaTags': extractMetaTags
}

handlers[type](dom)

会像您原来的if代码一样工作。在

这取决于我们谈论的if语句的数量;如果它是一个非常小的数字,那么它将比使用字典更有效。在

然而,和往常一样,我强烈建议您做任何使代码看起来更干净的事情,直到经验和评测告诉您需要优化特定的代码块。在

相关问题 更多 >

    热门问题