ruff/crates/ty_python_semantic/resources/mdtest/subscript/assignment_diagnostics.md

2.1 KiB

Subscript assignment diagnostics

Invalid value type

config: dict[str, int] = {}
config["retries"] = "three"  # error: [invalid-assignment]

Invalid key type

config: dict[str, int] = {}
config[0] = 3  # error: [invalid-assignment]

Invalid value type for TypedDict

from typing import TypedDict

class Config(TypedDict):
    retries: int

def _(config: Config) -> None:
    config["retries"] = "three"  # error: [invalid-assignment]

Invalid key type for TypedDict

from typing import TypedDict

class Config(TypedDict):
    retries: int

def _(config: Config) -> None:
    config[0] = 3  # error: [invalid-key]

Misspelled key for TypedDict

from typing import TypedDict

class Config(TypedDict):
    retries: int

def _(config: Config) -> None:
    config["Retries"] = 30.0  # error: [invalid-key]

No __setitem__ method

class ReadOnlyDict:
    def __getitem__(self, key: str) -> int:
        return 42

config = ReadOnlyDict()
config["retries"] = 3  # error: [invalid-assignment]

Possibly missing __setitem__ method

def _(config: dict[str, int] | None) -> None:
    config["retries"] = 3  # error: [possibly-missing-implicit-call]

Unknown key for one element of a union

from typing import TypedDict

class Person(TypedDict):
    name: str

class Animal(TypedDict):
    name: str
    legs: int

def _(being: Person | Animal) -> None:
    being["legs"] = 4  # error: [invalid-assignment]

Unknown key for all elemens of a union

from typing import TypedDict

class Person(TypedDict):
    name: str

class Animal(TypedDict):
    name: str
    legs: int

def _(being: Person | Animal) -> None:
    being["surname"] = "unknown"  # error: [invalid-assignment]

Wrong value type for one element of a union

def _(config: dict[str, int] | dict[str, str]) -> None:
    config["retries"] = 3  # error: [invalid-assignment]

Wrong value type for all elements of a union

def _(config: dict[str, int] | dict[str, str]) -> None:
    config["retries"] = 3.0  # error: [invalid-assignment]