我有一个简单的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)
以下是我输入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
似乎在调用print_results时没有参数'结束' value未正确解释为datetime对象。但是自从Python 没有办法施展(据我所知),我不知道出了什么问题。
提前致谢,
米奇
答案 0 :(得分:29)
您遇到的问题是您正在评估参数中的函数。这意味着ended=datetime.datetime.now()
获取解析它时的值,而不是它被调用时的值。你应该做的是这样的事情:
def print_results(ended=None):
if ended is None:
ended = datetime.datetime.now()
...
这里有一个非常好的解释为什么会发生这种情况:“Least Astonishment” in Python: The Mutable Default Argument