dry-python / dry-python/returns

Pyright type checker won't let me pattern match just `Success` and `Failure` for a function returning `Result`

Đang mở
#2,295 4 bình luận 1 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

## What's wrong

```python
from returns.result import Failure, Success, safe

@safe
def div(first_number: int, second_number: int) -> int:
return first_number // second_number

def test_div() -> str:
match div(1, 0):
# Matches if the result stored inside `Success` is `10`
case Success(10):
return 'Result is "10"'

# Matches any `Success` instance and binds its value to the `value` variable
case Success(value):
return f'Result is "{value}"'

# Matches if the result stored inside `Failure` is `ZeroDivisionError`
case Failure(ZeroDivisionError()):
return '"ZeroDivisionError" was raised'

# Matches any `Failure` instance
case Failure(_):
return 'The division was a failure'

```

Given this code, taken directly from the documentation, but wrapped in a function with str return type instead of prints, I get the following error from pyright:

```
➜ divtest git:(main) ✗ uv run pyright .
/Users/Shared/Development/divtest/divtest.py
/Users/Shared/Development/divtest/divtest.py:9:19 - error: Function with declared return type "str" must return value on all code paths
  "None" is not assignable to "str" (reportReturnType)
1 error, 0 warnings, 0 informations
```

I can fix this error by adding a catch-all branch `_`, but this kinda defeats the purpose of using a result and ruins type safety.

## How is that should be

The type checker should know that Result and Success are the only possible return types for this function. The type checker shouldn't be asking for the `_` branch.

## System information

```
➜ divtest git:(main) ✗ uv tree
Resolved 5 packages in 1ms
divtest v0.1.0
├── pyright v1.1.407
│ ├── nodeenv v1.9.1
│ └── typing-extensions v4.15.0
└── returns v0.26.0
└── typing-extensions v4.15.0
➜ divtest git:(main) ✗ uv run python --version
Python 3.12.11
```

## Comment

Please advise whether this is a `returns` issue or should I report it to pyright. I'm also open to creating a plugin for pyright if needed or otherwise investing some effort into resolving this. Also, I tried to join the telegram community and despite solving the numeric challenge I got kicked out a minute after entering.

Thanks

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.