python / python/mypy

`overloaded function has no attribute "fset"` error when attempting to assign to base class's setter

Open
#16,426 0 comments 8 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug
Dominant language
Python
Stars
20.6k
Forks
3.3k
PR merge metrics
PR metrics pending

Description

class Foo:
    def __init__(self) -> None:
        self._value = 1

    @property
    def value(self) -> int:
        return self._value

    @value.setter
    def value(self, new_value: int) -> None:
        self._value = new_value


class Bar(Foo):
    @property
    def value(self) -> int:
        return super().value

    @value.setter
    def value(self, new_value: int) -> None:
        Foo.value.fset(self, new_value) # error: overloaded function has no attribute "fset"  [attr-defined]

playground

this is working around the fact that assigning to super().value doesn't work at runtime:

super().value = new_value  # error: Invalid assignment target [misc]

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the provided Foo and Bar reproduction in the linked mypy-play playground, comparing the diagnostic for Foo.value.fset with the invalid super().value assignment. Trace the checker path for overloaded attributes and property setters. Done means the valid base-class setter usage is handled without the reported attr-defined error, with appropriate coverage added for this reproduction.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.