From 8d85844d33b834ce09fcda1e8117bb2521d7bf1d Mon Sep 17 00:00:00 2001 From: "stewart.hutchins" Date: Fri, 6 Jun 2025 21:58:04 +0100 Subject: [PATCH] Feat: Add new advanced variadic generics challenge, inspired by scala's 'tupled' function --- .../advanced-variadic-generics2/hints.md | 1 + .../advanced-variadic-generics2/question.py | 45 ++++++++++++++++++ .../advanced-variadic-generics2/solution.py | 46 +++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 challenges/advanced-variadic-generics2/hints.md create mode 100644 challenges/advanced-variadic-generics2/question.py create mode 100644 challenges/advanced-variadic-generics2/solution.py diff --git a/challenges/advanced-variadic-generics2/hints.md b/challenges/advanced-variadic-generics2/hints.md new file mode 100644 index 0000000..b37e414 --- /dev/null +++ b/challenges/advanced-variadic-generics2/hints.md @@ -0,0 +1 @@ +Check out [TypeVarTuple](https://docs.python.org/3/library/typing.html#typing.TypeVarTuple). diff --git a/challenges/advanced-variadic-generics2/question.py b/challenges/advanced-variadic-generics2/question.py new file mode 100644 index 0000000..a58bc8f --- /dev/null +++ b/challenges/advanced-variadic-generics2/question.py @@ -0,0 +1,45 @@ +""" +TODO: + +Define an "tupled" function that accepts a function and returns a function with some arguments in the form of a tuple. +The return type should remain unchanged. +(if you're familiar with scala, this is effectively the "tupled" function) +""" + + +def tupled(func): + def impl(args): + return func(*args) + + return impl + + +## End of your code ## +from typing import Any + + +def func0() -> Any: + ... + + +def func1(s: str) -> Any: + ... + + +def func2(s: str, i: int) -> Any: + ... + + +func0_tupled = tupled(func0) +func0_tupled(()) +func0_tupled() # expect-type-error + +func1_tupled = tupled(func1) +func1_tupled(("a",)) +func1_tupled("a") # expect-type-error +func1_tupled(1) # expect-type-error + +func2_tupled = tupled(func2) +func2_tupled(("a", 1)) +func2_tupled(("a", "b")) # expect-type-error +func2_tupled("a", 1) # expect-type-error diff --git a/challenges/advanced-variadic-generics2/solution.py b/challenges/advanced-variadic-generics2/solution.py new file mode 100644 index 0000000..810675f --- /dev/null +++ b/challenges/advanced-variadic-generics2/solution.py @@ -0,0 +1,46 @@ +""" +TODO: + +Define an "tupled" function that accepts a function and returns a function with some arguments in the form of a tuple. +The return type should remain unchanged. +(if you're familiar with scala, this is effectively the "tupled" function) +""" +from typing import Callable + + +def tupled[*Ts, R](func: Callable[[*Ts], R]) -> Callable[[tuple[*Ts]], R]: + def impl(args: tuple[*Ts]) -> R: + return func(*args) + + return impl + + +## End of your code ## +from typing import Any + + +def func0() -> Any: + ... + + +def func1(s: str) -> Any: + ... + + +def func2(s: str, i: int) -> Any: + ... + + +func0_tupled = tupled(func0) +func0_tupled(()) +func0_tupled() # expect-type-error + +func1_tupled = tupled(func1) +func1_tupled(("a",)) +func1_tupled("a") # expect-type-error +func1_tupled(1) # expect-type-error + +func2_tupled = tupled(func2) +func2_tupled(("a", 1)) +func2_tupled(("a", "b")) # expect-type-error +func2_tupled("a", 1) # expect-type-error