dry-python / dry-python/returns

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

Đang mở
#2,253 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
Python
Star
4.4k
Fork
155
Merge trung bình
2 giờ 27 phút
Pull request đã merge (30 ngày)
22

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.