用 python-message 为程序库和日志模块解耦

之前我说过 python-message 与常见的 signal/slot 不同,处理函数不需要知道谁会发出一条信息,而发出信息的对象也不必知道是否有人处理它。这个与众不同的特性,显然有更宽广的适用范围,下面就是其中一个例子。

假定你在编写一个非常牛X的程序库,姑且为它取名为 foo,里面有一个函数叫 bar,你就想啊,这么牛X的一个函数,肯定要写一下 log 啊,所以你就写了以下代码:

def bar():  
  print 'Haha, Calling bar().'  
  do_sth()  

你高高兴兴发了版本,大家都过得很好。过了几天,公司的另一个项目组听闻牛人您写了个库叫 foo,非常好用,就拿去用了。当天,快下班的时候,你被拖去救火,因为出 Bug 了呀。你查看了很久日志,都没有发现他们调用 bar() 的痕迹,一问,原来他们是用 logging 的,标准输出在做 Daemon 的时候被重定向到 /dev/null 去了……。

好吧,你忍。但没法忍啊,你们原来的项目又不用 logging,你在程序库里引入 logging 谁来初始化它呢?就算你引入了 logging,你们项目获取 logger 可能是用 logging.getLogger('prjA'),另一个项目可能是用 logging.getLogger('prjB'),日后还有新项目呢,想到这个你就蛋疼了。忍痛割爱,把 print 语句给删除掉?你又怕日后出了问题你自己都找不到 Bug 那还不是自己加班自己苦……。

这个时候,不妨让 python-message 来帮你手,轻松改一下 bar() 函数

import message 
LOG_MSG = ('log', 'foo') 
def bar(): 
  messeage.pub(LOG_MSG, 'Haha, Calling bar().') 
  do_sth() 

而在你的项目中,只需要在项目开始处加上这样的代码:

import message 
import foo 
def handle_foo_log_msg(txt): 
  print txt 
message.sub(foo.LOG_MSG, handle_foo_log_msg) 

而很类似地,在另一个项目 prjA 里,你可以把 handle_foo_log_msg() 稍作修改:

def handle_foo_log_msg(txt): 
  import logging 
  logging.debug(txt) 

在另一个 prjB 里则可能是这样:

import logging 
logger = logging.getLogger("prjB") 
def handle_foo_log_msg(txt): 
  logger.debug(txt) 

如果还有另一个 prjC 使用了其它的 log,相信此时你也可以轻松应对了,:)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。