diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2022-07-04 08:39:02 +0200 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2022-07-04 08:39:02 +0200 |
| commit | 27e9535d73a586930552661ffedee540004011f0 (patch) | |
| tree | 55c5d82c2046a9b524b0adccb3708a62129e8a37 | |
| parent | fd3559556d819d431317e5dd763ae6b3e432d029 (diff) | |
| download | geldschieberbot-27e9535d73a586930552661ffedee540004011f0.tar.gz geldschieberbot-27e9535d73a586930552661ffedee540004011f0.zip | |
tanken: cleanup code
* Add type annotations
* Use meaningfull variable names
* Add doc-strings
* Remove she-bang line from non-executable file
| -rw-r--r-- | geldschieberbot.py | 2 | ||||
| -rw-r--r-- | tanken.py | 48 |
2 files changed, 31 insertions, 19 deletions
diff --git a/geldschieberbot.py b/geldschieberbot.py index ff285db..f21b7d6 100644 --- a/geldschieberbot.py +++ b/geldschieberbot.py @@ -620,6 +620,8 @@ def _tanken(sender, args, msg) -> dict[str, str]: if err: return {'err': err} + assert parts + output = "" change = [args] for pname, values in parts.items(): @@ -1,47 +1,57 @@ -#!/bin/env python3 +"""Utilities to support splitting fuel and car maintainance costs""" + +import typing as T + +PassengerResult = dict[str, int] +Results = dict[str, PassengerResult] +TankenFailure = T.Tuple[None, str] +TankenSuccess = T.Tuple[Results, None] +TankenResult = T.Union[TankenSuccess, TankenFailure] # cost should be given in cents -def tanken(drives, cost, service_charge=0): +def tanken(_drives: list[str], cost: int, service_charge=0) -> TankenResult: + """calculate costs per passange for one tank load""" passengers = {} distance = 0. - drives = [d.split(' ') for d in drives] + drives = [d.split(' ') for d in _drives] - for d in drives: + for drive in drives: try: - d[0] = int(d[0]) + drive_distance = int(drive[0]) except (IndexError, ValueError): return None, "Lines have to start with the driven distance!" # calculate overall distance - distance += d[0] + distance += drive_distance # collect distances per passenger - for p in d[1:]: - if p not in passengers: - passengers[p] = { - "distance": d[0], + for passenger in drive[1:]: + if passenger not in passengers: + passengers[passenger] = { + "distance": drive_distance, "cost": 0, "service_charge": 0 } else: - passengers[p]["distance"] += d[0] + passengers[passenger]["distance"] += drive_distance # calculate cost per kilometer if distance <= 0: return None, "Driven distance must be greater than 0!" - c = cost / distance + c_km = cost / distance - for d in drives: + for drive in drives: + drive_distance = int(drive[0]) # calculate cost per drive split among passengers - c_d = int(c * d[0] / (len(d) - 1)) - for p in d[1:]: - passengers[p]["cost"] += c_d + c_d = int(c_km * drive_distance / (len(drive) - 1)) + for passenger in drive[1:]: + passengers[passenger]["cost"] += c_d # calculate service charge per drive split among passengers - sc_d = int(service_charge * d[0] / (len(d) - 1)) - for p in d[1:]: - passengers[p]["service_charge"] += sc_d + sc_d = int(service_charge * drive_distance / (len(drive) - 1)) + for passenger in drive[1:]: + passengers[passenger]["service_charge"] += sc_d return passengers, None |
