Skip to content

No type error detected when function with wrong type is used in the middle of a pipe #2253

Description

@hoschi

Bug report

Thank you for this project! I'm new to Python, so I apologize if I've overlooked something.

What's wrong

from collections.abc import Callable

from returns.pipeline import flow, pipe
from returns.pointfree import map_
from returns.result import Success


def get_data(data: str) -> str:
    return "200" + data


def do_more(data: int) -> int:
    return data - 300


def transform(s: str) -> str:
    return f"transformed: {s}"


my_pipe: Callable[[str], str] = pipe(get_data, do_more, transform)

print(flow(Success("500"), map_(my_pipe)))

Gives following runtime error while mypy doesn't complain:

(py-starter) python-boilerplate > python working.py
Traceback (most recent call last):
  File "/Users/hoschi/repos/python-boilerplate/working.py", line 22, in <module>
    print(flow(Success("500"), map_(my_pipe)))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/_internal/pipeline/flow.py", line 50, in flow
    return reduce(  # type: ignore
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/_internal/pipeline/flow.py", line 51, in <lambda>
    lambda composed, function: function(composed),  # type: ignore
                               ^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/pointfree/map.py", line 55, in factory
    return container.map(function)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/result.py", line 426, in map
    return Success(function(self._inner_value))
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/_internal/pipeline/pipe.py", line 34, in <lambda>
    return lambda instance: flow(instance, *functions)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/_internal/pipeline/flow.py", line 50, in flow
    return reduce(  # type: ignore
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Caskroom/miniconda/base/envs/py-starter/lib/python3.12/site-packages/returns/_internal/pipeline/flow.py", line 51, in <lambda>
    lambda composed, function: function(composed),  # type: ignore
                               ^^^^^^^^^^^^^^^^^^
  File "/Users/hoschi/repos/python-boilerplate/working.py", line 13, in do_more
    return data - 300
           ~~~~~^~~~~
TypeError: unsupported operand type(s) for -: 'str' and 'int'

How is that should be

Mypy should detect the error. It can detect the error when the problem function is used at first arg: pipe(do_more, get_data, transform)

System information

  • python version: 3.12

  • returns version: returns = {extras = ["compatible-mypy"], version = "^0.26.0"}

  • mypy version: mypy = "^1.17.1"

  • hypothesis version (if any):

  • pytest version (if any):

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions