2013-04-01 1 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

Смежные вопросы