[Python] Stampare oggetti timedelta

Marco Giusti marco.giusti a posteo.de
Ven 18 Feb 2022 09:22:39 CET


On 17.02.2022 16:40, Gabriele Battaglia wrote:
> Ciao.
> 
> Per stampare a video un oggetto ottenuto da un'operazione fra date, a
> parte la manipolazione manuale che posso fare con i suoi valori,
> esiste un metodo già pronto per personalizzarne la visualizzazione?
> 
> Cioè print o str, danno già qualcosa di leggibile ma se volessi
> personalizzare la formattazione come si fa con strptime, è possibile?


Non sembra che gli oggetti di tipo timedelta supportino il la sintassi
per la formattazione di stringhe[1]. E' possibile comunque di create una
classe ad-hoc per questo. Spero che quanto segue sia leggibile:

     $ python
     Python 3.10.2 (main, Feb 15 2022, 12:33:54) [GCC 10.2.1 20210110] on 
linux
     Type "help", "copyright", "credits" or "license" for more 
information.
     >>> import datetime
     >>> yesterday_now = datetime.datetime.now() - 
datetime.timedelta(days=1)
     >>> now = datetime.datetime.now()
     >>> now - yesterday_now
     datetime.timedelta(days=1, seconds=4, microseconds=951695)
     >>> (now - yesterday_now).total_seconds()
     86404.951695
     >>> delta = (now - yesterday_now)
     >>> format(delta, 'S')
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     TypeError: unsupported format string passed to 
datetime.timedelta.__format__
     >>> class TimeDeltaFormat:
     ...  def __init__(self, timedelta):
     ...   self.delta = timedelta
     ...  def __format__(self, format_spec):
     ...   if format_spec == '':
     ...    return str(self.delta)
     ...   elif format_spec == 'd':
     ...    return str(self.delta.days)
     ...   elif format_spec == 's':
     ...    return str(self.delta.seconds)
     ...   elif format_spec == 'm':
     ...    return str(self.delta.microseconds)
     ...   elif format_spec == 'S':
     ...    return str(self.delta.total_seconds())
     ...   else:
     ...    raise TypeError("unsupported format string")
     ...
     >>> delta_f = TimeDeltaFormat(delta)
     >>> format(delta_f, 's')
     '4'
     >>> format(delta_f, 'S')
     '86404.951695'
     >>> print(f"{delta_f:s}.{delta_f:m}")
     4.951695
     >>> delta.microseconds
     951695
     >>>

[1] https://docs.python.org/3/library/string.html#format-string-syntax



Maggiori informazioni sulla lista Python