Skip to content

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

@hoschi

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):

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