dry-python / dry-python/returns

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

Offen
#2,253 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug
Vorherrschende Sprache
Python
Sterne
4.4k
Forks
155
Ø Merge
2 Std. 27 Min.
Gemergte PRs (30 T.)
22

Beschreibung

# Bug report

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

## What's wrong

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.