allow-redefinition-new for enum results in incompatible type of Literal[members]
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Followup to the advice at https://github.com/python/mypy/issues/19280#issuecomment-2971970574 :)
from enum import Enum
import typing as T
class DependencyMethods(Enum):
# Auto means to use whatever dependency checking mechanisms in whatever order meson thinks is best.
AUTO = 'auto'
PKGCONFIG = 'pkg-config'
CMAKE = 'cmake'
# The dependency is provided by the standard library and does not need to be linked
BUILTIN = 'builtin'
# Just specify the standard link arguments, assuming the operating system provides the library.
SYSTEM = 'system'
# This is only supported on OSX - search the frameworks directory by name.
EXTRAFRAMEWORK = 'extraframework'
# Detect using the sysconfig module.
SYSCONFIG = 'sysconfig'
# Specify using a "program"-config style tool
CONFIG_TOOL = 'config-tool'
# For backwards compatibility
SDLCONFIG = 'sdlconfig'
CUPSCONFIG = 'cups-config'
PCAPCONFIG = 'pcap-config'
LIBWMFCONFIG = 'libwmf-config'
QMAKE = 'qmake'
# Misc
DUB = 'dub'
def process_method_kw(possible: T.Iterable[DependencyMethods], kwargs: T.Dict[str, T.Any]) -> T.List[DependencyMethods]:
method: T.Union[DependencyMethods, str] = kwargs.get('method', 'auto')
method = DependencyMethods(method)
# handle renames...
# Set the detection method. If the method is set to auto, use any available method.
# If method is set to a specific string, allow only that detection method.
if method == DependencyMethods.AUTO:
methods = list(possible)
elif method in possible:
methods = [method]
else:
raise Exception('argh')
return methods
Expected Behavior
Passes type checking.
Actual Behavior
$ mypy --local-partial-types --allow-redefinition-new foo.py
foo.py:43: error: Incompatible return value type (got "list[DependencyMethods] | list[Literal[DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.BUILTIN, DependencyMethods.SYSTEM, DependencyMethods.EXTRAFRAMEWORK, DependencyMethods.SYSCONFIG, DependencyMethods.CONFIG_TOOL, DependencyMethods.SDLCONFIG, DependencyMethods.CUPSCONFIG, DependencyMethods.PCAPCONFIG, DependencyMethods.LIBWMFCONFIG, DependencyMethods.QMAKE, DependencyMethods.DUB]]", expected "list[DependencyMethods]") [return-value]
Found 1 error in 1 file (checked 1 source file)
It is being redefined as "Literal for every possible enum value". If I annotate the first assignment as T.List[DependencyMethods] then it works (the second assignment fits into the first!), but I feel like I ought not need this.
Your Environment
- Mypy version used: mypy 1.18.2 (compiled: yes)
- Mypy command-line flags: --local-partial-types --allow-redefinition-new
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit dem reduzierten Beispiel in foo.py und führe mypy 1.18.2 mit --local-partial-types und --allow-redefinition-new aus, um den Fehler beim Rückgabetyp zu reproduzieren. Verfolge, wie die neu definierte enum-Variable inferiert wird, und prüfe die entsprechenden Type-Checking-Tests oder Einstiegspunkte der Implementierung. Als erledigt gilt die Aufgabe, wenn das Beispiel die Typprüfung ohne Annotation der ersten Zuweisung besteht.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 45/100