如何夫妇“的原因”有返回值,优雅
经常发生的代码我写的我有检查的条件取决于许多其他条件的函数,例如: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
版本。
我的问题是:有没有更优雅的方式来做到这一点?
这是一个非常好的方式来做到这一点。只有我可能改变的是嵌套is_foo_reason
在is_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]
这样,该功能在默认情况下不会给出理由,但如果您想要一个,您可以要求一个。
我想你不应该改变你的函数的语义,如果它只是关于调试。使用例如一个记录器。看看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")
...
然后,你可以定义你的日志处理程序要么日志消息记录到文件,或打印在屏幕上,等
但是,如果您想向用户展示它,就像OP所说的那样,日志记录不起作用。 – rafalotufo
为什么不呢?您可以使用StreamHandler并提供sys.stdout作为流,或者我错过了什么? – jena
如果我想弹出一个对话框来显示它,或者将原因发送到数据库,或者发送到网页或者其他东西。需要字符串值。这可能是记录日志的最佳答案 – Claudiu
为了将来的扩展您的当进行验证,有时在那里我只是想知道,如果事情是有效的,而其他时间我想了错误显示给用户类似
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
+1我已经做了一些,:返回值,使用namedtuple 。 – Davy8
嗯有趣。我担心有不同的返回类型,但如果它完全依赖于参数,那么这会产生很大的意义 – Claudiu