Skip to content

False not-an-iterable on subclasses of functools.cached_property #10377

Open
pylint-dev/astroid
#2735
@mharding-hpe

Description

@mharding-hpe

Bug description

# pylint: disable=missing-module-docstring,missing-class-docstring,invalid-name,too-few-public-methods,missing-function-docstring

from typing import reveal_type, NoReturn
from functools import cached_property

class cached_property_readonly[T](cached_property[T]):
    def __set__(self, instance: object, val: T) -> NoReturn:
        raise AttributeError("BAD")


class ice_weasels:
    @cached_property
    def harf(self) -> list[int]:
        return [1, 2, 3]

    @cached_property_readonly
    def blah(self) -> list[int]:
        return [1, 2, 3]


d = ice_weasels()
reveal_type(d.harf) # mypy reports list[int]
reveal_type(d.blah) # mypy reports list[int]
for _ in d.harf: # No complaints from mypy or pylint
    pass
for _ in d.blah: # No complaints from mypy, but pylint gives not-an-iterable
    pass

# If the cached_property_readonly class is not Generic over T and inheriting from
# cached_property[T], then mypy reports the revealed type of blah as Any.

Configuration

Command used

pylint test.py

Pylint output

************* Module test
test.py:26:9: E1133: Non-iterable value d.blah is used in an iterating context (not-an-iterable)

Expected behavior

No errors

Pylint version

pylint 3.3.7
astroid 3.3.10
Python 3.12.9 (main, Mar 18 2025, 03:28:39) [GCC 12.2.0]

(but I have reproduced on Python 3.10 and 3.13 as well)

OS / Environment

docker.io/python:3.12 x86_64 image

https://mypy-play.net/?mypy=latest&python=3.12&gist=00a0d22bec726e12655bc2ea85c8de5d

Additional dependencies

Metadata

Metadata

Assignees

No one assigned

    Labels

    False Positive 🦟A message is emitted but nothing is wrong with the codeNeeds astroid updateNeeds an astroid update (probably a release too) before being mergable

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions