python / python/mypy

False positives when redefining property in subclass

Offen
#5,936 5 Kommentare 16 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

false-positive feature priority-1-normal topic-descriptors
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

I'm running mypy on the following code: (no additional arguments)

class Base:
	def __init__(self, value):
		self._value = value

	@property
	def value(self):
		return self._value

class Sub(Base):
	@Base.value.setter
	def value(self, value):
		self._value = value

And it reports:

inherited_property.py:10: error: "Callable[[Any], Any]" has no attribute "setter"

Line 10 is @Base.value.setter, so it seems to have a problem with referring to a property defined in a different class. Python itself has no problem with this though.

If the property has a setter in the base class, a slightly different error is reported:

class Base:
	def __init__(self, value):
		self._value = value

	@property
	def value(self):
		return self._value

	@value.setter
	def value(self, value):
		self._value = value

class Sub(Base):
	@Base.value.setter
	def value(self, value):
		self._value = value

This results in mypy reporting:

inherited_property.py:14: error: overloaded function has no attribute "setter"

Again the error is reported on the @Base.value.setter line.

I'm using a mypy dev snapshot (0.650+) on Python 3.6.5.

I found the existing issue #220, but that is so generic that I figured it would make sense to open a new separate issue for tracking this specific use case.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere die gemeldeten Diagnosemeldungen mit den beiden Python-Beispielen und beginne dabei mit der Behandlung von @property und geerbten Attributreferenzen in mypy. Verfolge, warum Base.value als aufrufbares oder überladenes Funktion behandelt wird, und ergänze Testabdeckung, die zeigt, dass Setter in Subklassen mit @Base.value.setter ohne Fehler akzeptiert werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.