From 403b044d533fa42c871aac802fc1afd68569251b Mon Sep 17 00:00:00 2001 From: InAnYan Date: Wed, 25 Jun 2025 22:43:00 +0300 Subject: [PATCH 1/9] feat(maybe): add conversion to bool --- returns/maybe.py | 11 ++++++++++ tests/test_maybe/test_maybe_conversions.py | 25 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 tests/test_maybe/test_maybe_conversions.py diff --git a/returns/maybe.py b/returns/maybe.py index 1e04a3e20..8f825dfb1 100644 --- a/returns/maybe.py +++ b/returns/maybe.py @@ -303,6 +303,9 @@ def from_optional( return _Nothing(inner_value) return Some(inner_value) + def __bool__(self) -> bool: + """Convert (or treat) an instance of ``Maybe`` as a boolean.""" + @final class _Nothing(Maybe[Any]): @@ -378,6 +381,10 @@ def failure(self) -> None: """Returns failed value.""" return self._inner_value + def __bool__(self): + """Returns ``False``.""" + return False + @final class Some(Maybe[_ValueType_co]): @@ -435,6 +442,10 @@ def failure(self): """Raises exception for successful container.""" raise UnwrapFailedError(self) + def __bool__(self): + """Returns ``True```. Any instance of ``Something`` is treated as ``True``, even ``Something(None)``""" + return True + #: Public unit value of protected :class:`~_Nothing` type. Nothing: Maybe[Never] = _Nothing() diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py new file mode 100644 index 000000000..4180d8de4 --- /dev/null +++ b/tests/test_maybe/test_maybe_conversions.py @@ -0,0 +1,25 @@ +from returns.maybe import Nothing, Some + + +def test_some_is_true(): + """Ensures that ``Something(...)`` is ``True`` when treated as a boolean.""" + + assert bool(Some(123)) + assert bool(Some("abc")) + + +def test_nothing_is_false(): + """Ensures that ``Nothing`` is ``False`` when treated as a boolean.""" + + assert not bool(Nothing) + + +def test_some_none_is_true(): + """Ensures that ``Something(None)`` is ``True`` when treated as a boolean. + + See for the discussion of this design choice. + """ + + assert bool(Some(None)) + assert bool(Some(Nothing)) + From 9912489c7ff828c0b376fb072ef85e1d09413277 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 19:47:44 +0000 Subject: [PATCH 2/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- tests/test_maybe/test_maybe_conversions.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py index 4180d8de4..5076a5849 100644 --- a/tests/test_maybe/test_maybe_conversions.py +++ b/tests/test_maybe/test_maybe_conversions.py @@ -3,14 +3,12 @@ def test_some_is_true(): """Ensures that ``Something(...)`` is ``True`` when treated as a boolean.""" - assert bool(Some(123)) - assert bool(Some("abc")) + assert bool(Some('abc')) def test_nothing_is_false(): """Ensures that ``Nothing`` is ``False`` when treated as a boolean.""" - assert not bool(Nothing) @@ -19,7 +17,5 @@ def test_some_none_is_true(): See for the discussion of this design choice. """ - assert bool(Some(None)) assert bool(Some(Nothing)) - From 650d9d75c363ec1783606320f27ce110cb4d2839 Mon Sep 17 00:00:00 2001 From: InAnYan Date: Wed, 25 Jun 2025 22:51:17 +0300 Subject: [PATCH 3/9] fix(maybe): format code according to style --- returns/maybe.py | 3 ++- tests/test_maybe/test_maybe_conversions.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/returns/maybe.py b/returns/maybe.py index 8f825dfb1..81df97688 100644 --- a/returns/maybe.py +++ b/returns/maybe.py @@ -443,7 +443,8 @@ def failure(self): raise UnwrapFailedError(self) def __bool__(self): - """Returns ``True```. Any instance of ``Something`` is treated as ``True``, even ``Something(None)``""" + """Returns ``True```. Any instance of ``Something`` is treated + as ``True``, even ``Something(None)``.""" return True diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py index 5076a5849..488b586b3 100644 --- a/tests/test_maybe/test_maybe_conversions.py +++ b/tests/test_maybe/test_maybe_conversions.py @@ -15,7 +15,8 @@ def test_nothing_is_false(): def test_some_none_is_true(): """Ensures that ``Something(None)`` is ``True`` when treated as a boolean. - See for the discussion of this design choice. + See for the discussion + of this design choice. """ assert bool(Some(None)) assert bool(Some(Nothing)) From 30aa760e90534a2243e4305bb01de21b809982e7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 25 Jun 2025 19:52:12 +0000 Subject: [PATCH 4/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- returns/maybe.py | 5 +++-- tests/test_maybe/test_maybe_conversions.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/returns/maybe.py b/returns/maybe.py index 81df97688..cc94e0a6a 100644 --- a/returns/maybe.py +++ b/returns/maybe.py @@ -443,8 +443,9 @@ def failure(self): raise UnwrapFailedError(self) def __bool__(self): - """Returns ``True```. Any instance of ``Something`` is treated - as ``True``, even ``Something(None)``.""" + """Returns ``True```. Any instance of ``Something`` is treated + as ``True``, even ``Something(None)``. + """ return True diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py index 488b586b3..e1b823783 100644 --- a/tests/test_maybe/test_maybe_conversions.py +++ b/tests/test_maybe/test_maybe_conversions.py @@ -15,7 +15,7 @@ def test_nothing_is_false(): def test_some_none_is_true(): """Ensures that ``Something(None)`` is ``True`` when treated as a boolean. - See for the discussion + See for the discussion of this design choice. """ assert bool(Some(None)) From 4e1dc0e38a316ee1ca76d1cea39c8ebb22ecb91e Mon Sep 17 00:00:00 2001 From: Ruslan Date: Thu, 26 Jun 2025 23:32:56 +0300 Subject: [PATCH 5/9] Update returns/maybe.py Co-authored-by: sobolevn --- returns/maybe.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/returns/maybe.py b/returns/maybe.py index cc94e0a6a..37a3531eb 100644 --- a/returns/maybe.py +++ b/returns/maybe.py @@ -443,7 +443,10 @@ def failure(self): raise UnwrapFailedError(self) def __bool__(self): - """Returns ``True```. Any instance of ``Something`` is treated + """ + Returns ``True```. + + Any instance of ``Something`` is treated as ``True``, even ``Something(None)``. """ return True From bb53ab49c67f377fb28ea73c4741a99e0afba3d5 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Thu, 26 Jun 2025 23:33:03 +0300 Subject: [PATCH 6/9] Update tests/test_maybe/test_maybe_conversions.py Co-authored-by: sobolevn --- tests/test_maybe/test_maybe_conversions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py index e1b823783..d03831052 100644 --- a/tests/test_maybe/test_maybe_conversions.py +++ b/tests/test_maybe/test_maybe_conversions.py @@ -1,7 +1,7 @@ from returns.maybe import Nothing, Some -def test_some_is_true(): +def test_some_is_true() -> None: """Ensures that ``Something(...)`` is ``True`` when treated as a boolean.""" assert bool(Some(123)) assert bool(Some('abc')) From 650002435e4a0c3934a4b24857df503856a548ca Mon Sep 17 00:00:00 2001 From: Ruslan Date: Thu, 26 Jun 2025 23:33:09 +0300 Subject: [PATCH 7/9] Update tests/test_maybe/test_maybe_conversions.py Co-authored-by: sobolevn --- tests/test_maybe/test_maybe_conversions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py index d03831052..79173e38d 100644 --- a/tests/test_maybe/test_maybe_conversions.py +++ b/tests/test_maybe/test_maybe_conversions.py @@ -7,7 +7,7 @@ def test_some_is_true() -> None: assert bool(Some('abc')) -def test_nothing_is_false(): +def test_nothing_is_false() -> None: """Ensures that ``Nothing`` is ``False`` when treated as a boolean.""" assert not bool(Nothing) From 7df4ca1c64ce37207cd85331669862b50378a5f5 Mon Sep 17 00:00:00 2001 From: Ruslan Date: Thu, 26 Jun 2025 23:33:16 +0300 Subject: [PATCH 8/9] Update tests/test_maybe/test_maybe_conversions.py Co-authored-by: sobolevn --- tests/test_maybe/test_maybe_conversions.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_maybe/test_maybe_conversions.py b/tests/test_maybe/test_maybe_conversions.py index 79173e38d..3173a4764 100644 --- a/tests/test_maybe/test_maybe_conversions.py +++ b/tests/test_maybe/test_maybe_conversions.py @@ -12,8 +12,9 @@ def test_nothing_is_false() -> None: assert not bool(Nothing) -def test_some_none_is_true(): - """Ensures that ``Something(None)`` is ``True`` when treated as a boolean. +def test_some_none_is_true() -> None: + """ + Ensures that ``Something(None)`` is ``True`` when treated as a boolean. See for the discussion of this design choice. From 9cb06fa626a94dac306d6dc8a25a3029e56abc74 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 26 Jun 2025 20:33:16 +0000 Subject: [PATCH 9/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- returns/maybe.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/returns/maybe.py b/returns/maybe.py index 37a3531eb..938f8ff25 100644 --- a/returns/maybe.py +++ b/returns/maybe.py @@ -444,8 +444,8 @@ def failure(self): def __bool__(self): """ - Returns ``True```. - + Returns ``True```. + Any instance of ``Something`` is treated as ``True``, even ``Something(None)``. """