2017-12-18 3 views
0

Ich habe ein Szenario, in dem ich total_seconds() Methode verwenden muss, aber es gibt keine Option, das gleiche in Python 2.7 auszuführen. In Python 2.6 total_seconds() Methode existiert nicht.using total_seconds Funktion in Python 2.6

Es wird vorgeschlagen,

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10**6 
verwenden könnte jemand mir helfen hier, wie kann ich es hier im folgenden Code verwenden. oder irgendeine Alternative wird groß sein.

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) 

Antwort

0

Gerade diese Formel in einer Funktion und die Funktion anstelle einer Methode:

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

Dies ist das direkte Äquivalent:

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

Dann wo immer object.total_seconds() verwendet wird , verwenden Sie stattdessen td_total_seconds(object). Einige Beispiele aus dem von Ihnen geposteten Code; die ursprüngliche Linie

etotsec = int(edelta.total_seconds()) 

wird

etotsec = int(td_total_seconds(edelta)) 

Die anderen Linien werden:

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

Das letzte Beispiel sieht aus wie ein übriggebliebene von vielleicht Refactoring? Es macht nicht viel Sinn, es erstellt nur dann eine Kopie eines timedelta Objekts, um dieses Objekt in eine Zeichenfolge zu konvertieren. Sie können das Objekt einfach direkt in eine Zeichenfolge konvertieren, ohne dass ein Kopieren erforderlich ist. Sie können immer die Zeichenfolge Umwandlung in dem in der nächsten Zeile Formatierung printf-String verlassen:

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

Dies beseitigt die Notwendigkeit, dass die delta = und duration = Linien vorangeht.