使用datetime的python默认参数值

mit*_*mcc 7 python datetime

我有一个简单的Python脚本,它使用Ctl-C的信号处理程序.如果程序正常完成,则结束时间将传递到"print_results"函数中.我希望print_results函数有一个可选参数,如果没有传递,只需获取当前"现在"时间.但是当我从信号处理程序调用它时,它没有得到正确的时间.

这是我简化但可重复的程序:

import sys
import signal
import urllib2
import urllib
import datetime
import time
import getopt,sys

def signal_handler(signal, frame):
    print_results()
    sys.exit(0)

def print_results(ended=datetime.datetime.now()):
    print "\nEnded at ",ended
    print "Total time: ",(ended - startTime)
    print "Finished ",numIterations," iterations, received ",totalRecords," records"

    numIterations = 0
    maxIterations = 8
    delaySecs = 3
    totalRecords = 0

    # set up signal handler
    signal.signal(signal.SIGINT, signal_handler)

    startTime = datetime.datetime.now()

    print "Starting at ",time.asctime(time.localtime())

    while (numIterations < maxIterations):

        iterStartTime = datetime.datetime.now()

        numIterations += 1

        print "Iteration: ",numIterations

        # sleep if necessary

        if delaySecs > 0:
            time.sleep(delaySecs)

        iterEndTime = datetime.datetime.now()

        print "Iteration time: ",(iterEndTime - iterStartTime)

    endTime = datetime.datetime.now()

    print "Ended at ",time.asctime(time.localtime())
    print "Total test time: ",(endTime - startTime)

    print_results(endTime)
Run Code Online (Sandbox Code Playgroud)

这是我键入Ctl-C时发生的情况

$ python test.py                                                           
Starting at  Fri Jun 15 08:28:15 2012
Iteration:  1
Iteration time:  0:00:03.003101
Iteration:  2
Iteration time:  0:00:03.003105
Iteration:  3
^C
Ended at  2012-06-15 08:28:15.766496
Total time:  -1 day, 23:59:59.999964
Finished  3  iterations, received  0  records
Run Code Online (Sandbox Code Playgroud)

看起来在没有参数的情况下调用print_results时,'finished'值没有被正确解释为datetime对象.但是由于Python没有一种方法可以投射(据我所知),我无法分辨出什么是错的.

提前致谢,

米奇

San*_*dri 33

您遇到的问题是您正在评估参数中的函数.这意味着ended=datetime.datetime.now()获取解析它的时间值,而不是它被调用时的值.你应该做的是这样的事情:

def print_results(ended=None):
    if ended is None:
        ended = datetime.datetime.now()
    ...
Run Code Online (Sandbox Code Playgroud)

这里有一个非常好的解释为什么会发生这种情况:Python中的"最小惊讶":Mutable Default Argument

  • [这出现了很多](http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument). (4认同)