From 5c87350f9d1b55e747e19ae11467964023f41e98 Mon Sep 17 00:00:00 2001 From: "F.N. Claessen" Date: Thu, 25 Feb 2021 16:15:36 +0100 Subject: Allow control over return type of parse_duration. --- src/isodate/isoduration.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/isodate/isoduration.py b/src/isodate/isoduration.py index 88829f7..2de4981 100644 --- a/src/isodate/isoduration.py +++ b/src/isodate/isoduration.py @@ -51,10 +51,10 @@ ISO8601_PERIOD_REGEX = re.compile( r"((?PT)(?P[0-9]+([,.][0-9]+)?H)?" r"(?P[0-9]+([,.][0-9]+)?M)?" r"(?P[0-9]+([,.][0-9]+)?S)?)?$") -# regular expression to parse ISO duartion strings. +# regular expression to parse ISO duration strings. -def parse_duration(datestring): +def parse_duration(datestring, as_timedelta_if_possible: bool = True): """ Parses an ISO 8601 durations into datetime.timedelta or Duration objects. @@ -89,17 +89,18 @@ def parse_duration(datestring): # try alternative format: if datestring.startswith("P"): durdt = parse_datetime(datestring[1:]) - if durdt.year != 0 or durdt.month != 0: + if as_timedelta_if_possible and durdt.year == 0 and durdt.month == 0: + # FIXME: currently not possible in alternative format + # create timedelta + ret = timedelta(days=durdt.day, seconds=durdt.second, + microseconds=durdt.microsecond, + minutes=durdt.minute, hours=durdt.hour) + else: # create Duration ret = Duration(days=durdt.day, seconds=durdt.second, microseconds=durdt.microsecond, minutes=durdt.minute, hours=durdt.hour, months=durdt.month, years=durdt.year) - else: # FIXME: currently not possible in alternative format - # create timedelta - ret = timedelta(days=durdt.day, seconds=durdt.second, - microseconds=durdt.microsecond, - minutes=durdt.minute, hours=durdt.hour) return ret raise ISO8601Error("Unable to parse duration string %r" % datestring) groups = match.groupdict() @@ -114,7 +115,7 @@ def parse_duration(datestring): # these values are passed into a timedelta object, # which works with floats. groups[key] = float(groups[key][:-1].replace(',', '.')) - if groups["years"] == 0 and groups["months"] == 0: + if as_timedelta_if_possible and groups["years"] == 0 and groups["months"] == 0: ret = timedelta(days=groups["days"], hours=groups["hours"], minutes=groups["minutes"], seconds=groups["seconds"], weeks=groups["weeks"]) -- cgit v1.2.1