2017-12-18 1 views
0

나는 total_seconds() 메서드를 사용해야하는 시나리오가 있지만 파이썬 2.7에서도 같은 옵션을 실행할 수있는 옵션이 없습니다. 파이썬 2.6 total_seconds() 메서드가 존재하지 않습니다.파이썬 2.6에서 total_seconds 함수 사용

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10**6 

아무도 내가 다음 코드 여기 사용할 수있는 방법을 여기에 저를 도울 수 사용하는 것이 좋습니다. 또는 다른 대안이 우수 할 것입니다.

final = self.stats['FINAL'] 
    self.stats['START'] = start = final[0][1] 
    self.stats['END'] = end = final[-1][2] 
    self.stats['DELTA'] = delta = end - start 
    self.stats['IS_AVAILABLE'] = is_available = final[-1][0] 

    self.stats['AVAILABLE'] = {} 
    self.stats['AVAILABLE'][True] = {} 
    self.stats['AVAILABLE'][False] = {} 

    for entry in final: 
     is_available = entry[0] 
     dstart = entry[1] 
     dend = entry[2] 
     edelta = dend - dstart 
     etotsec = int(edelta.total_seconds()) 
     availability[is_available]['last'] = dend 
     try: 
      # Number of seconds in this status 
      seconds = availability[is_available]['seconds'] 
      seconds = seconds + etotsec 
      availability[is_available]['seconds'] = seconds 
      self.stats['AVAILABLE'][is_available]['SECONDS'] = seconds 

      # Update count 
      count = availability[is_available]['count'] 
      count = count + 1 
      availability[is_available]['count'] = count 
      self.stats['AVAILABLE'][is_available]['COUNT'] = count 
     except: 
      availability[is_available]['seconds'] = etotsec 
      availability[is_available]['count'] = 1 
      self.stats['AVAILABLE'][is_available]['SECONDS'] = etotsec 
      self.stats['AVAILABLE'][is_available]['COUNT'] = 1 

     try: 
      # Register entry 
      registry = availability[is_available]['registry'] 
      registry.append(entry) 
      availability[is_available]['registry'] = registry 
      self.stats['AVAILABLE'][is_available]['REGISTRY'] = registry 
     except: 
      availability[is_available]['registry'] = [] 
      self.stats['AVAILABLE'][is_available]['REGISTRY'] = [] 

    self.stats['LAST_UP'] = lastup = availability[True]['last'] 
    self.stats['DOWN_COUNT'] = numdowntime = availability[False]['count'] 
    self.stats['DOWN_SECONDS'] = totdowntime = availability[False]['seconds'] 
    self.stats['UP_COUNT'] = numuptime = availability[True]['count'] 
    self.stats['UP_SECONDS'] = totuptime = availability[True]['seconds'] 

    self.stats['DOWN_PERCENTAJE'] = ptotdowntime = totdowntime * 100/delta.total_seconds() 
    self.stats['UP_PERCENTAJE'] = ptotuptime = totuptime * 100/delta.total_seconds() 
    self.stats['DOWN_LIST'] = downtimes = availability[False]['registry'] 
    downtimes.reverse() 

    REPORT += "First entry recorded: %s\n" % start 
    REPORT += " Last entry recorded: %s\n" % end 
    REPORT += "  Is Available: %s\n" % is_available 
    if not is_available: 
     REPORT += "  Last time up: %s\n" % lastup 
    REPORT += "  SAP Lifetime: %s\n" % delta 
    REPORT += "   Unavailable: %s, %d times down, %.02f%% of lifetime\n" % (str(timedelta(seconds=availability[False]['seconds'])), numdowntime, ptotdowntime) 
    REPORT += "   Available: %s, %.02f%% of lifetime\n\n" % (str(timedelta(seconds=availability[True]['seconds'])), ptotuptime) 
    REPORT += "Last %d/%d downtimes:\n" % (self.props['SHOW_MAX_DOWNTIMES'], len(downtimes)) 

    for n in range(len(downtimes)): 
     if n < self.props['SHOW_MAX_DOWNTIMES']: 
      start = downtimes[n][1] 
      end = downtimes[n][2] 
      delta = end - start 
      duration = str(timedelta(seconds=delta.total_seconds())) 
      REPORT += "\t%2d - Down from: %s\t\tto: %s\tDuration: %s\n" % (n + 1, downtimes[n][1], downtimes[n][2], duration) 

답변

0

함수 단지 그 수식 대신에있어서의 기능을 사용

def td_total_seconds(td): 
    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10**6 

이 직접 상당 : 다음

>>> timedelta(days=1, seconds=255423, microseconds=12345).total_seconds() 
341823.
>>> td_total_seconds(timedelta(days=1, seconds=255423, microseconds=12345)) 
341823.

object.total_seconds() 사용 대신 td_total_seconds(object)을 사용합니다. 게시 한 코드의 몇 가지 예;

self.stats['DOWN_PERCENTAJE'] = ptotdowntime = totdowntime * 100/td_total_seconds(delta) 
self.stats['UP_PERCENTAJE'] = ptotuptime = totuptime * 100/td_total_seconds(delta) 

마지막 예처럼 보이는 왼쪽 오버 아마도 리팩토링에서 : 원래 라인

etotsec = int(edelta.total_seconds()) 

는 다른 라인이 될

etotsec = int(td_total_seconds(edelta)) 

이됩니까? 많은 의미를 가지지 않고, timedelta 개체의 복사본을 만들어 그 개체를 문자열로 변환합니다. 객체를 문자열로 직접 변환 할 수 있으며 복사 할 필요가 없습니다. 혹시 다음 줄에 서식의 printf 스타일의 문자열로 문자열 변환을 남길 수 있습니다 :

REPORT += "\t%2d - Down from: %s\t\tto: %s\tDuration: %s\n" % (n + 1, downtimes[n][1], downtimes[n][2], (end - start)) 

이는 앞의 delta =duration = 라인에 대한 필요성을 제거합니다.

관련 문제