From 1e2a7c13022c221571e48786fa38ca11b5d4d742 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 23 Oct 2025 13:22:24 +0300 Subject: [PATCH 1/5] Added two files with hw but need to make it better --- src/curry_task.py | 0 tests/test_for_curry_task.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/curry_task.py create mode 100644 tests/test_for_curry_task.py diff --git a/src/curry_task.py b/src/curry_task.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_for_curry_task.py b/tests/test_for_curry_task.py new file mode 100644 index 0000000..e69de29 From fc09b5845d4e51ebfedae7c84b1ec48763eafba1 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Thu, 23 Oct 2025 13:22:48 +0300 Subject: [PATCH 2/5] Added two files with hw but need to make it better --- src/curry_task.py | 45 ++++++++++++++++++++++++++++++++++++ tests/test_for_curry_task.py | 14 +++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/curry_task.py b/src/curry_task.py index e69de29..cfe5b0c 100644 --- a/src/curry_task.py +++ b/src/curry_task.py @@ -0,0 +1,45 @@ +class MyError(Exception): + pass + + +def curry(func, arity): + # для ф inner этот список будет глобальным + if arity <= 0: + raise MyError("Арность не может быть меньше или равна 0.") + if arity > func.__code__.co_argcount: + raise MyError("Переданная арность больше действительной.") + lst = [] + + def inner(arg): + nonlocal lst + lst.append(arg) + if len(lst) == arity: + tmp = func(*lst) + # освобождаем список, чтобы функцию можно было использовать повторно + lst = [] + return tmp + return inner + + return inner + + +def uncurry(curried_func, arity): + """ + Этой функции передается внутренняя функция inner функции curry, принимающая один аргумент. + Сначала возвращается функция, способная принимать любое кол-во аргументов. + Все последующее обращение будет к внутренней функции. + """ + + def uncarried_func(*args): + tmp_func = curried_func + if len(args) != arity: + raise MyError("Передано неверное кол-во аргументов.") + if len(args) == arity: + for el in args: + tmp_func = tmp_func(el) + return tmp_func + + return uncarried_func + + +# P.S. У меня такое ощущение, что за подобный код мне могут дать по рукам, хоть оно и работает, но зато сама:DDD diff --git a/tests/test_for_curry_task.py b/tests/test_for_curry_task.py index e69de29..cf96881 100644 --- a/tests/test_for_curry_task.py +++ b/tests/test_for_curry_task.py @@ -0,0 +1,14 @@ +import hypothesis.strategies as st +from src.curry_task import curry, uncurry, MyError +from hypothesis import given + +@given(args=st.lists(st.integers(min_value=1), min_size=1)) + +def test_universal_check(args): + def summ(*args): + return sum(args) + + func = curry(summ, len(args)) + for el in args: + func = func(el) + assert func == sum(args) From 95a4978924d452cb143ab26da8dc6548b6b892b9 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Fri, 24 Oct 2025 21:39:39 +0300 Subject: [PATCH 3/5] Finally finished working with tests and reated final version of curry function --- src/curry_task.py | 6 +-- tests/test_for_curry_task.py | 91 +++++++++++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/src/curry_task.py b/src/curry_task.py index cfe5b0c..5bd83d6 100644 --- a/src/curry_task.py +++ b/src/curry_task.py @@ -8,6 +8,8 @@ def curry(func, arity): raise MyError("Арность не может быть меньше или равна 0.") if arity > func.__code__.co_argcount: raise MyError("Переданная арность больше действительной.") + if not isinstance(arity, int): + raise MyError("Переданная арность функции обязана быть целым числом.") lst = [] def inner(arg): @@ -19,7 +21,6 @@ def inner(arg): lst = [] return tmp return inner - return inner @@ -40,6 +41,3 @@ def uncarried_func(*args): return tmp_func return uncarried_func - - -# P.S. У меня такое ощущение, что за подобный код мне могут дать по рукам, хоть оно и работает, но зато сама:DDD diff --git a/tests/test_for_curry_task.py b/tests/test_for_curry_task.py index cf96881..1243904 100644 --- a/tests/test_for_curry_task.py +++ b/tests/test_for_curry_task.py @@ -2,13 +2,90 @@ from src.curry_task import curry, uncurry, MyError from hypothesis import given -@given(args=st.lists(st.integers(min_value=1), min_size=1)) +@given(a=st.integers(), b=st.integers(), c=st.integers()) +def test_sum_three_elements_check(a, b, c): + def summ(a, b, c): + return a + b + c -def test_universal_check(args): - def summ(*args): - return sum(args) + func = curry(summ, 3) + uncarried_func = uncurry(func, 3) + for el in (a, b, c): + func = func(el) + assert func == a + b + c + assert uncarried_func(a, b, c) == a + b + c + + +@given(a=st.integers(), b=st.integers(), c=st.integers()) +def test_mul_three_elements_check(a, b, c): + def mul(a, b, c): + return a * b * c - func = curry(summ, len(args)) - for el in args: + func = curry(mul, 3) + uncarried_func = uncurry(func, 3) + for el in (a, b, c): func = func(el) - assert func == sum(args) + assert func == a * b * c + assert uncarried_func(a, b, c) == a * b * c + + +@given(a=st.integers(max_value=5), b=st.integers(max_value=5), c=st.integers(max_value=5)) +def test_power_element_check(a, b, c): + def power(a, b, c): + return a**b**c + + func = curry(power, 3) + uncarried_func = uncurry(func, 3) + for el in (a, b, c): + func = func(el) + assert func == a**b**c + assert uncarried_func(a, b, c) == a ** b ** c + + +def test_wrong_arity_errors1(): + try: + def summ(a, b, c): + return a + b + c + + curry(summ, -1) + assert False + except MyError as e: + assert isinstance(e, MyError) + assert str(e) == "Арность не может быть меньше или равна 0." + + +def test_wrong_arity_errors2(): + try: + def summ(a, b, c): + return a + b + c + + curry(summ, 5) + assert False + except MyError as e: + assert isinstance(e, MyError) + assert str(e) == "Переданная арность больше действительной." + + +def test_wrong_arity_errors3(): + try: + def mul(a, b, c): + return a * b * c + + curry(mul, 1.0) + assert False + except MyError as e: + assert isinstance(e, MyError) + assert str(e) == "Переданная арность функции обязана быть целым числом." + +@given(args=st.lists(st.integers(), min_size=4)) +def test_wrong_quantity_of_arguments(args): + try: + def summ(a, b, c): + return a + b + c + + func = curry(summ, 3) + uncarried_func = uncurry(func, 3) + uncarried_func(args) + assert False + except MyError as e: + assert isinstance(e, MyError) + assert str(e) == "Передано неверное кол-во аргументов." From 8b1b2293b256b0023f4270f1433f19f633eb282f Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Fri, 24 Oct 2025 21:42:16 +0300 Subject: [PATCH 4/5] Used ruff to format all two files --- src/curry_task.py | 1 + tests/test_for_curry_task.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/curry_task.py b/src/curry_task.py index 5bd83d6..891f2cb 100644 --- a/src/curry_task.py +++ b/src/curry_task.py @@ -21,6 +21,7 @@ def inner(arg): lst = [] return tmp return inner + return inner diff --git a/tests/test_for_curry_task.py b/tests/test_for_curry_task.py index 1243904..f42320a 100644 --- a/tests/test_for_curry_task.py +++ b/tests/test_for_curry_task.py @@ -2,6 +2,7 @@ from src.curry_task import curry, uncurry, MyError from hypothesis import given + @given(a=st.integers(), b=st.integers(), c=st.integers()) def test_sum_three_elements_check(a, b, c): def summ(a, b, c): @@ -28,7 +29,9 @@ def mul(a, b, c): assert uncarried_func(a, b, c) == a * b * c -@given(a=st.integers(max_value=5), b=st.integers(max_value=5), c=st.integers(max_value=5)) +@given( + a=st.integers(max_value=5), b=st.integers(max_value=5), c=st.integers(max_value=5) +) def test_power_element_check(a, b, c): def power(a, b, c): return a**b**c @@ -38,11 +41,12 @@ def power(a, b, c): for el in (a, b, c): func = func(el) assert func == a**b**c - assert uncarried_func(a, b, c) == a ** b ** c + assert uncarried_func(a, b, c) == a**b**c def test_wrong_arity_errors1(): try: + def summ(a, b, c): return a + b + c @@ -55,6 +59,7 @@ def summ(a, b, c): def test_wrong_arity_errors2(): try: + def summ(a, b, c): return a + b + c @@ -67,6 +72,7 @@ def summ(a, b, c): def test_wrong_arity_errors3(): try: + def mul(a, b, c): return a * b * c @@ -76,9 +82,11 @@ def mul(a, b, c): assert isinstance(e, MyError) assert str(e) == "Переданная арность функции обязана быть целым числом." + @given(args=st.lists(st.integers(), min_size=4)) def test_wrong_quantity_of_arguments(args): try: + def summ(a, b, c): return a + b + c From c1785576acbd4161a9a1b6b1329c7110a7253d97 Mon Sep 17 00:00:00 2001 From: Yana Kalsina Date: Fri, 24 Oct 2025 22:26:12 +0300 Subject: [PATCH 5/5] Removed one test because it worked too long --- tests/test_for_curry_task.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tests/test_for_curry_task.py b/tests/test_for_curry_task.py index f42320a..f8e5ac8 100644 --- a/tests/test_for_curry_task.py +++ b/tests/test_for_curry_task.py @@ -29,21 +29,6 @@ def mul(a, b, c): assert uncarried_func(a, b, c) == a * b * c -@given( - a=st.integers(max_value=5), b=st.integers(max_value=5), c=st.integers(max_value=5) -) -def test_power_element_check(a, b, c): - def power(a, b, c): - return a**b**c - - func = curry(power, 3) - uncarried_func = uncurry(func, 3) - for el in (a, b, c): - func = func(el) - assert func == a**b**c - assert uncarried_func(a, b, c) == a**b**c - - def test_wrong_arity_errors1(): try: