Python:sys.stderr上的一些新手问题,并使用函数作为参数

时间:2010-04-14 00:16:36

标签: python function-pointers stderr

我刚刚开始使用Python,也许我太担心太多了,但无论如何......

log = "/tmp/trefnoc.log"

def logThis (text, display=""):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    if display != None:
        print msg + display
    logfile = open(log, "a")
    logfile.write(msg + "\n")
    logfile.close()
    return msg

def logThisAndExit (text, display=""):
    msg = logThis(text, display=None)
    sys.exit(msg + display)

这是有效的,但我不喜欢它的样子。有没有更好的方法来写这个(可能只有1个函数)并且any other thing 我应该关注退出吗?


现在有些背景(但不是关于trefnoc)......

有时我会调用logThis来记录和显示。其他时候我想打电话然后退出。最初我这样做:

logThis ("ERROR. EXITING")
sys.exit()

然后我认为不能正确设置stderr,因此当前代码显示在顶部。

我的第一个想法实际上是将“sys.exit”作为参数传递,并将logThis ("ERROR. EXITING", call=sys.exit)定义为以下定义(仅显示相关的差异部分):

def logThis (text, display="", call=print):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    call msg + display

但这显然不起作用。我认为Python不会将函数存储在变量中。如果Python可以使用变量获取函数,我就无法(快速)找到任何地方!也许使用eval函数?我真的总是尽量避免它们,所以。我当然想过使用if代替另一个def,但这不会更好或更差。

无论如何,有什么想法吗?

5 个答案:

答案 0 :(得分:2)

“logThisAndExit”没有理由,它不会为你节省太多打字

sys.exit(logThis(text)+display)

(比较logThisAndExit(text, display)

sys.exit(logThis(text))

(比较logThisAndExit(text)

并非我完全确定您为什么喜欢将格式化为日志行的退出邮件。

回答原来的问题:你遗漏了括号:call(msg+display)工作正常。但是我认为这对于记录/退出事物来说是过度的过度工作。维护代码的任何人都必须了解您的功能,以了解它何时退出以及何时退出。

答案 1 :(得分:2)

对于日志记录,使用logging模块可能更容易。

要退出,如果您有任何错误,请使用:

sys.exit(1)

如果没有错误,只要让脚本用完语句或:

sys.exit(0)

答案 2 :(得分:1)

您可以修改logThis以获取名为shouldExit的最终参数,默认为None,然后作为该方法的最后一步,如果值为true,则调用{{1} }}

答案 3 :(得分:1)

print是python<中的关键字,而不是函数。试试这个:

def do_print(x):
    print x

def logThis (text, display="", call=do_print):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    call(msg + display)

你有没有理由不使用logging模块? (见http://onlamp.com/pub/a/python/2005/06/02/logging.html

答案 4 :(得分:0)

就像参考一样,这是我从David和moshez那里吸收暗示之后的最终代码。最后我决定现在只想要一个功能。谢谢大家!

log = "/tmp/trefnoc.log"

def logThis (text, display=""):
    msg = str(now.strftime("%Y-%m-%d %H:%M")) + " TREfNOC: " + text
    if display != None:
        print msg + display
    logfile = open(log, "a")
    logfile.write(msg + "\n")
    logfile.close()
    return msg

# how to call it on exit:
sys.exit(logThis("ERROR, EXITING", display=None))