feat request/suggestion: fuse results from multiple results into the args of one target function
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
Rechercherichtung
Beginne mit der Durchsicht der bestehenden Result-, Success- und Failure-APIs und ihrer aktuellen Tests; das Issue nennt keine Dateien oder einen Einstiegspunkt. Vergleiche das vorgeschlagene fuse-Verhalten mit den Typisierungs- und Fehlerbehandlungskonventionen des Projekts. Als abgeschlossen gilt die Arbeit, wenn eine abgestimmte API integriert, dokumentiert und durch Tests für Erfolge, Fehler, ungültige Eingaben, Argumentanzahlen und Zielausnahmen abgedeckt ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
A way to join the results from multiple stages to a single function fusing the results into the positional args of the target function.
Thinking something like this could work, let me know if you think it's worth cleaning up/documenting and writing all the tests for:
from typing import Iterable, Callable
import inspect
from returns.result import Success, Failure, Result
def fuse(results: Iterable[Result], target: Callable) -> Result:
"""Fuse the results from multiple containers into the args for a target function.
Args:
results (Iterable[Result]): The results from multiple container functions.
target (Callable): The target function that receives the arguments.
"""
successes, failures, invalid = [], [], []
for res in results:
match res:
case Success(value):
successes.append(value)
case Failure(error):
failures.append(error)
case _:
invalid.append(res)
if invalid:
return Failure(ValueError(f"Input args are not all Result types: {invalid}"))
if failures:
return Failure(ValueError(f"Not all results are Success: {failures}"))
expected_args = len(inspect.signature(target).parameters)
if len(successes) != expected_args:
return Failure(
ValueError(
f"Expected {expected_args} args for `{target.__name__}`, but got {len(successes)}"
)
)
try:
return target(*successes)
except Exception as e:
return Failure(e)
Using this basic case function here:
def add(a, b) -> Result[int, str]:
if a > 0:
return Success(a + b)
return Failure(f"Err: expected `a` > 0. Got `a`= {a}.")
Usage:
Happy path all args are expected
fuse([Success(1), Success(3)], add)
output:
<Success: 4>
Returns failure if some exist
fuse([Success(3), Failure("Err: expected `a` > 0. Got `a`= -2.")], add)
output:
<Failure: Not all results are Success: ['Err: expected `a` > 0. Got `a`= -2.']>
Catch all the failures and report them all (avoiding solving one issue then finding another)
fuse([Failure("Err: expected `a` > 0. Got `a`= -2."), Failure("Err: expected `a` > 0. Got `a`= -2.")], add)
output:
<Failure: Not all results are Success: ['Err: expected `a` > 0. Got `a`= -2.', 'Err: expected `a` > 0. Got `a`= -2.']>
Catch when someone is passing in a non Result type:
fuse([1, Failure("Err: expected `a` > 0. Got `a`= -2.")], add)
output:
<Failure: Input args are not all Result types: [1]>
catch if not given the right number of args:
fuse([Success(1)], add)
output:
<Failure: Expected 2 args for `add`, but got 1>
catch overall exceptions just in case:
fuse([Success(1), Success("1")], add)
output
<Failure: unsupported operand type(s) for +: 'int' and 'str'>
- Vorherrschende Sprache
- Python
- Sterne
- 4.4k
- Forks
- 156
- Ø Merge
- 3 Std. 44 Min.
- Gemergte PRs (30 T.)
- 22
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus dry-python/returns
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
dry-python/returns#2394 · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
dry-python/returns#2365 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
dry-python/returns#2355 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
dry-python/returns#2295 · 4 Kommentare · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
dry-python/returns#2253 · 2 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in dry-python/returns
Ähnliche Issues
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 83/100
PedestrianDynamics/pyFDS-Evac#766 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 91/100
alchaincyf/nuwa-skill#86 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 2 Tagen
-
Docs Needs Triage
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
pandas-dev/pandas#71055 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Bug]: graphify reads files that git's global ignore file hidesEvtl. vergeben @smngvlkz hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
Graphify-Labs/graphify#4335 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag