2011-06-22 22 views
2

经常发生的代码我写的我有检查的条件取决于许多其他条件的函数,例如:What:如何夫妇“的原因”有返回值,优雅

def is_foo(bar): 
    if X: return True 
    if Y: return False 
    if Z: return True 
    return False 

然后,我会想我的调试代码或记录它,所以我会改变上面:

def is_foo_reason(bar): 
    if X: return True, "cause of X you fool" 
    if Y: return False, "no X but Y" 
    if Z: return True, "Z Z Z Z Z Z" 
    return False, "default" 
#for backwards compatibility: 
def is_foo(bar): return is_foo_reason(bar)[0] 

然后想要的原因代码(这样它可以记录它/它展示给用户,W/e)调用_reason版本。

我的问题是:有没有更优雅的方式来做到这一点?

回答

8

这是一个非常好的方式来做到这一点。只有我可能改变的是嵌套is_foo_reasonis_foo(这样只有一个简单的接口)并且向is_foo()添加默认参数,例如,

#for backwards compatibility: 
def is_foo(bar, reason=False): 
    def is_foo_reason(bar): 
     if X: return True, "cause of X you fool" 
     if Y: return False, "no X but Y" 
     if Z: return True, "Z Z Z Z Z Z" 
     return False, "default" 
    if reason: 
     return is_foo_reason(bar) 
    else: 
     return is_foo_reason(bar)[0] 

这样,该功能在默认情况下不会给出理由,但如果您想要一个,您可以要求一个。

+0

+1我已经做了一些,:返回值,使用namedtuple 。 – Davy8

+0

嗯有趣。我担心有不同的返回类型,但如果它完全依赖于参数,那么这会产生很大的意义 – Claudiu

4

我想你不应该改变你的函数的语义,如果它只是关于调试。使用例如一个记录器。看看Python的日志记录模块:http://docs.python.org/library/logging.html

import logging 

def is_foo(bar): 
    logger = logging.getLogger() 
    if X: 
     logger.debug("msg1") 
     return True 
    if Y: 
     logger.debug("msg2") 
     ... 

然后,你可以定义你的日志处理程序要么日志消息记录到文件,或打印在屏幕上,等

+0

但是,如果您想向用户展示它,就像OP所说的那样,日志记录不起作用。 – rafalotufo

+0

为什么不呢?您可以使用StreamHandler并提供sys.stdout作为流,或者我错过了什么? – jena

+0

如果我想弹出一个对话框来显示它,或者将原因发送到数据库,或者发送到网页或者其他东西。需要字符串值。这可能是记录日志的最佳答案 – Claudiu

1

为了将来的扩展您的当进行验证,有时在那里我只是想知道,如果事情是有效的,而其他时间我想了错误显示给用户类似

from collections import namedtuple 
ExplainedValue = namedtuple('ExplainedValue', 'value explanation') 

def is_foo_reason(bar): 
    if X: return ExplainedValue(True, "cause of X you fool") 
    if Y: return ExplainedValue(False, "no X but Y") 
    if Z: return ExplainedValue(True, "Z Z Z Z Z Z") 
    return ExplainedValue(False, "default") 

def is_foo(bar): return is_foo_reason(bar).value