Skip to content

Mypy infers x.get("a") or x.get("b", "c") to str | None, even when x is dict[str, str] #15534

Closed
@hfcredidio

Description

@hfcredidio

Bug Report

Mypy wrongly infers the type of the expression x.get("a") or x.get("b", "c") to be str | None, even when x is explicitly a dict[str, str].

To Reproduce

def works(x: dict[str, str]) -> str:
    a = x.get("a")
    b = x.get("b", "c")
    return a or b

def also_works(x: dict[str, str]) -> str: return x.get("a", x.get("b", "c"))
def also_fine(x: dict[str, str]) -> str: return x.get("a") or x.get("b") or "c"
def breaks(x: dict[str, str]) -> str: return x.get("a") or x.get("b", "c")

https://mypy-play.net/?mypy=latest&python=3.11&gist=33335d3d1d19e5858beb76ed65ce8470

I realise the examples are not logically equivalent, but they should all evaluate to strings

Expected Behavior

No errors.

Actual Behavior

Mypy returns main.py:8: error: Incompatible return value type (got "str | None", expected "str") [return-value]

Your Environment

  • Mypy version used: 1.4.0
  • Mypy command-line flags: N/A
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.11

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrong

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions