2013-04-01 21 views
1

这是我的秒表类
不寻常的结果测量时间的蟒蛇

import time 

class StopWatch: 

    def __init__(self, tag="", startTime=time.time(), elapsedTime=-1): 
     self._tag=tag 
     self._elapsedTime=elapsedTime 
     self._startTime=startTime 

    # other codes here............# 

    def stop(self, tag=None): 
     if tag is not None: 
      self._tag = tag 
     self._elapsedTime = time.time() - self._startTime 
     return self 

    def getStartTime(self): 
     return self._startTime 

和秒表测试文件是:

import unittest 
import time 
from metric.StopWatch import StopWatch 

class StopWatchTest(unittest.TestCase): 

    def test_stopwatch(self): 
     now=time.time() 
     print "now:%f" % now 

     stopwatch=StopWatch("firstHook") 
     print "start time:%r" % stopwatch.getStartTime() 
     self.assertTrue(stopwatch.getStartTime()>now, "start time is wrong") 

我得到的是错误有:

now:1364791630.047630 
start time:1364791629.158797 

..

AssertionError: start time is wrong 

稍后要执行的代码显示的时间较早。这背后的原因是什么?

回答

3

默认参数仅计算一次。

def __init__(self, tag="", startTime=time.time(), elapsedTime=-1): 
    self._tag=tag 
    self._elapsedTime = elapsedTime 
    self._startTime = startTime 

要解决,我们需要明确检查的默认值,并评估它们在函数体:

def __init__(self, tag="", startTime=None, elapsedTime=-1): 
    self._tag=tag 
    self._elapsedTime = elapsedTime 
    if startTime is None: 
     startTime = time.time() 
    self._startTime = startTime 
+0

感谢您的回答。 – thinley

3

的原因是,这条线:

def __init__(self, tag="", startTime=time.time(), elapsedTime=-1): 

是(因为尽管它实际上编译的代码,虽然成字节码的名称)时由Python解释器达到其评估。所以startTime在类定义时设置,而不是在调用__init__时设置。

将其更改为:

def __init__(self, tag="", start_time=None, elapsed_time=-1): 
    if start_time is None: 
     start_time = time.time() 
    self._tag=tag 
    self._elapsed_time=elapsed_Time 
    self._start_time=start_time 
+0

感谢您的回答 – thinley