利用Python getattr函数构建动态分发模式
本文详解如何利用Python内置函数getattr实现动态分发模式。通过拼接字符串动态获取模块函数,实现灵活的输出格式扩展。同时指出松耦合带来的潜在Bug,并介绍使用getattr第三个参数设置默认返回值以增强代码健壮性的最佳实践。
本文主要探讨如何利用Python内置函数getattr来实现分发模式,具体介绍如下。
getattr常被用作一种分发机制。例如,若程序需以不同格式输出数据,可为每种格式定义独立的输出函数,并通过一个统一的调度函数来调用对应的格式输出函数。
假设有一个程序需以HTML、XML和普通文本格式打印站点统计信息,输出格式由命令行指定或保存在配置文件中。statsout模块定义了三个函数:output_html、output_xml 和 output_text。主程序定义的唯一输出函数如下所示:
import statsout def output(data, format="text"): output_function = getattr(statsout, "output_%s" % format) return output_function(data)
output函数接收一个必需参数data和一个可选参数format。若未指定format参数,其默认值为text,并调用普通文本输出函数。
将format参数值与"output_"拼接,可构造出函数名作为参数,进而从statsout模块中获取该函数。这种方式便于未来扩展以支持其他输出格式,且无需修改分发函数。只需向statsout中添加新函数(如output_pdf),并将“pdf”作为format参数值传递给output函数即可。
现在,你可以像调用其他函数一样简单调用输出函数。output_function变量指向statsout模块中相应的函数引用。
前例存在一个Bug:字符串与函数间耦合松散,且缺乏错误检查。若用户传入的格式参数在statsout中未定义相应函数,getattr将返回None,该值被赋值给output_function,随后调用函数的语句将失败并抛出异常。这种处理方式不佳。幸运的是,getattr支持可选的第三个参数,即默认返回值。
总结
以上为关于利用Python内置函数getattr实现分发模式的完整内容,希望对大家有所帮助。感兴趣的朋友可继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









