Statische Typisierung des regulären Python-AusdrucksPython

Python-Programme
Anonymous
 Statische Typisierung des regulären Python-Ausdrucks

Post by Anonymous »

Ich habe ein Problem mit der statischen Typisierung eines regulären Python-Ausdrucks.
Um es klarzustellen: Diese Frage hat nichts mit dem regulären Ausdruck selbst zu tun und mein Code läuft trotzdem einwandfrei Es besteht die strenge mypy-Prüfung nicht.
Beginnen wir mit dem Grundlegenden: Ich habe eine Klasse wie folgt definiert:
from __future__ import annotations

import re
from typing import AnyStr

class MyClass:
def __init__(self, regexp: AnyStr | re.Pattern[AnyStr]) -> None:

if not isinstance(regexp, re.Pattern):
regexp = re.compile(regexp)
self._regexp: re.Pattern[str] | re.Pattern[bytes]= regexp

Der Benutzer kann die Klasse erstellen, indem er entweder ein kompiliertes Re-Muster oder AnyStr übergibt.
Ich möchte, dass die Klasse den kompilierten Wert im privaten _regexp-Attribut speichert. Also überprüfe ich, ob der Benutzer kein kompiliertes Muster bereitgestellt hat, dann kompiliere ich es und weise es dem privaten Attribut zu.
Soweit so gut, obwohl ich das von self._regexp erwartet hätte sei der Typ re.Pattern[AnyStr] anstelle der Vereinigung der Typmustertypen. Wie auch immer, bis hierher ist mit mypy alles in Ordnung.
In einigen (oder den meisten) Fällen stellt der Benutzer nun die Regexp-Zeichenfolge über eine Konfigurations-TOML-Datei bereit, die eingelesen wird , analysiert in einem Wörterbuch. Für diesen Fall habe ich einen Klassenmethodenkonstruktor wie folgt definiert:
@classmethod
def from_dict(cls, d: dict[str, str]) -> MyClass:
r = d.get('regexp')
if r is None:
raise KeyError('missing regexp')

return cls(regexp=r)

Der Typ des Wörterbuchs wird dict[str, str] sein.
Ich muss überprüfen, ob das Wörterbuch den richtigen Schlüssel enthält, um einen None-Typ zu verhindern, falls die Get-Funktion dies nicht kann finde es.
Ich erhalte die Fehlermeldung:
Fehler: Argument „regexp“ zu „MyClass“ hat inkompatiblen Typ „str“; erwartet „AnyStr | Pattern[AnyStr]“ [arg-type]
Das sieht bizarr aus, weil str mit AnyStr kompatibel sein sollte, aber nehmen wir an, ich ändere die Wörterbuchtypisierung to dict[str, AnyStr]
Aber anstatt das Problem zu beheben, vervielfacht es es, weil ich zwei Fehler erhalte:
Fehler: Das Argument „regexp“ zu „MyClass“ ist nicht kompatibel Geben Sie „str“ ein; erwarteter „AnyStr | Pattern[AnyStr]“ [arg-type]
Fehler: Argument „regexp“ zu „MyClass“ hat inkompatiblen Typ „bytes“; erwartet "AnyStr | Pattern[AnyStr]" [arg-type]

Ich bin kurz davor aufzugeben. Es sieht so aus, als ob ich mich in einer Schleife befinde. Wenn ich denke, dass ich etwas behoben habe, habe ich das Problem einfach an eine andere Stelle verschoben.
Können Sie mir bei diesem Rätsel helfen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post