dry-python / dry-python/returns

mypy plugin allows false positive error when exhaustively pattern matching on Result

Abierto
#1,361 18 comentarios 2 reacciones 0 asignados Ver en GitHub
bug
Lenguaje dominante
Python
Estrellas
4.4k
Forks
155
Merge medio
2 h 27 min
PR fusionados (30 d)
22

Descripción

# Bug report

## What's wrong

> Again, this is a **really** cool project ❤️

Consider the following code:

```py
from enum import Enum, auto
import math
from typing import TypeAlias

from returns.result import Failure, Result, Success

class MathError(Enum):
DivisionByZero = auto()
NonPositiveLogarithm = auto()

MathResult: TypeAlias = Result[float, MathError]

def div(x: float, y: float) -> MathResult:
if y == 0.0:
return Failure(MathError.DivisionByZero)

return Success(x / y)

def ln(x: float) -> MathResult:
if x <= 0.0:
return Failure(MathError.NonPositiveLogarithm)

return Success(math.log(x))

def op_(x: float, y: float) -> MathResult:
z = div(x, y)
match z:
case Success(ratio):
return ln(ratio)
case Failure(_):
return z
```

`mypy` configuration in `pyproject.toml`

```toml
[tool.mypy]
ignore_missing_imports = true
strict = true
plugins = [
"returns.contrib.mypy.returns_plugin",
]
```

Running:

```
$ mypy pattern_div.py
pattern_div.py:32: error: Missing return statement
```

Related to #1090

## How is that should be

As far as I can tell (new to `returns`), I'm matching exhaustively here, so I would not expect a `mypy` error.

`mypy` seems to understand exhaustive matching in general. `mypy` does not throw a type checking error in the following snippet.

```py
def test(err: MathError) -> int:
match err:
case MathError.DivisionByZero:
return 0
case MathError.NonPositiveLogarithm:
return 1
```

## System information

- `python` version: 3.10.2
- `returns` version: 0.19.0
- `mypy` version: 0.942

```
$ pip list
Package Version
----------------- -------
black 22.3.0
click 8.1.2
distlib 0.3.4
filelock 3.6.0
isort 5.10.1
mypy 0.942
mypy-extensions 0.4.3
packaging 21.3
pathspec 0.9.0
pep517 0.12.0
pip 22.0.4
pip-tools 6.6.0
platformdirs 2.5.1
pluggy 1.0.0
py 1.11.0
pyparsing 3.0.8
returns 0.19.0
setuptools 62.1.0
six 1.16.0
toml 0.10.2
tomli 2.0.1
tox 3.25.0
typing_extensions 4.1.1
virtualenv 20.14.1
wheel 0.37.1
```

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.