字典或 If 语句、Jython

2023-12-09

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

由于 Python/Jython 没有原生的switch声明我决定使用一大堆if调用适当方法的语句,如下所示:

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

我将添加更多内容,具体取决于我想从 HTML 中提取哪些信息,并考虑采用我在本网站其他地方找到的字典方法,示例如下:

{
    'extractTitle':    extractTitle,
    'extractMetaTags': extractMetaTags
}[type](dom)

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

Update:@Brian - 感谢您的精彩回复。我有一个问题,是否有任何提取方法需要多个对象,例如

handle_extractTag(self, dom, anotherObject)
# Do something

您将如何对handle方法来实现这个?希望你明白我的意思:)

Cheers


为了避免在字典中指定标签和处理程序,您可以只使用处理程序类,其方法命名为与类型匹配。例如

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)

Usage:

 handler = MyHandler()
 handler.handle('extractTitle', dom)

Update:

当您有多个参数时,只需更改句柄函数以获取这些参数并将它们传递给函数即可。如果你想让它更通用(这样你就不必在更改参数签名时同时更改处理函数和句柄方法),可以使用 *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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字典或 If 语句、Jython 的相关文章