Skip to content

Commit ffcc36d

Browse files
committed
Dataclass instead of tuple
1 parent b441e98 commit ffcc36d

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

mikeio/generic.py

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Generic functions for working with all types of dfs files."""
22

33
from __future__ import annotations
4+
from dataclasses import dataclass
45
import math
56
import os
67
import pathlib
@@ -597,10 +598,7 @@ def extract(
597598

598599
is_layered_dfsu = dfs_i.ItemInfo[0].Name == "Z coordinate"
599600

600-
file_start_new, start_step, start_sec, end_step, end_sec = _parse_start_end(
601-
dfs_i.FileInfo.TimeAxis, start, end
602-
)
603-
timestep = _parse_step(dfs_i.FileInfo.TimeAxis, step)
601+
time = _parse_time(dfs_i.FileInfo.TimeAxis, start, end, step)
604602
item_numbers = _valid_item_numbers(
605603
dfs_i.ItemInfo, items, ignore_first=is_layered_dfsu
606604
)
@@ -612,28 +610,28 @@ def extract(
612610
dfs_o = _clone(
613611
str(infilename),
614612
str(outfilename),
615-
start_time=file_start_new,
616-
timestep=timestep,
613+
start_time=time.file_start_new,
614+
timestep=time.timestep,
617615
items=item_numbers,
618616
)
619617

620618
file_start_shift = 0
621-
if file_start_new is not None:
619+
if time.file_start_new is not None:
622620
file_start_orig = dfs_i.FileInfo.TimeAxis.StartDateTime
623-
file_start_shift = (file_start_new - file_start_orig).total_seconds()
621+
file_start_shift = (time.file_start_new - file_start_orig).total_seconds()
624622

625623
timestep_out = -1
626-
for timestep in range(start_step, end_step, step):
624+
for timestep in range(time.start_step, time.end_step, step):
627625
for item_out, item in enumerate(item_numbers):
628626
itemdata = dfs_i.ReadItemTimeStep((item + 1), timestep)
629627
time_sec = itemdata.Time
630628

631-
if time_sec > end_sec:
629+
if time_sec > time.end_sec:
632630
dfs_i.Close()
633631
dfs_o.Close()
634632
return
635633

636-
if time_sec >= start_sec:
634+
if time_sec >= time.start_sec:
637635
if item == item_numbers[0]:
638636
timestep_out = timestep_out + 1
639637
time_sec_out = time_sec - file_start_shift
@@ -647,11 +645,24 @@ def extract(
647645
dfs_o.Close()
648646

649647

650-
def _parse_start_end(
648+
@dataclass
649+
class TimeInfo:
650+
"Parsed time information."
651+
652+
file_start_new: datetime | None
653+
start_step: int
654+
start_sec: float
655+
end_step: int
656+
end_sec: float
657+
timestep: float | None
658+
659+
660+
def _parse_time(
651661
time_axis: TimeAxis,
652662
start: int | float | str | datetime,
653663
end: int | float | str | datetime,
654-
) -> tuple[datetime | None, int, float, int, float]: # TODO better return type
664+
step: int,
665+
) -> TimeInfo:
655666
"""Helper function for parsing start and end arguments."""
656667
n_time_steps = time_axis.NumberOfTimeSteps
657668
file_start_datetime = time_axis.StartDateTime
@@ -727,7 +738,9 @@ def _parse_start_end(
727738
if start_sec > file_start_sec:
728739
file_start_new = file_start_datetime + timedelta(seconds=start_sec)
729740

730-
return file_start_new, start_step, start_sec, end_step, end_sec
741+
timestep = _parse_step(time_axis, step)
742+
743+
return TimeInfo(file_start_new, start_step, start_sec, end_step, end_sec, timestep)
731744

732745

733746
def _parse_step(time_axis: TimeAxis, step: int) -> float | None:

0 commit comments

Comments
 (0)