Lassen Sie den Typ -Checker verstehen, dass Klasse- und Instanzattribute teilen, aber dynamisch unterschiedliche Typen hPython

Python-Programme
Anonymous
 Lassen Sie den Typ -Checker verstehen, dass Klasse- und Instanzattribute teilen, aber dynamisch unterschiedliche Typen h

Post by Anonymous »

Ich habe ein Stück Code in Python, das im Wesentlichen auf die folgende Weise aussieht und funktioniert: < /p>

Code: Select all

class Column:
def __init__(self, s: str) -> None:
self.name = s

class Meta(type):
def __new__(cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]) -> type:
annotations = namespace.get('__annotations__', {})
namespace.update({k: Column(k) for k in annotations})

return super().__new__(cls, name, bases, namespace)

class Base(metaclass=Meta):
def __init__(self, data: dict[str, Any]) -> None:
if self.__class__ == Base:
raise RuntimeError

self.__dict__ = data
< /code>
Lassen Sie uns nun ein Beispiel geben. Die Basisklasse sollte vererbt werden und dann erstellen wir ein Objekt zum Testen (und wir gehen davon aus, dass die übergebenen Daten korrekt sind): < /p>
class Human(Base):
name: str
height: int

tom = Human({'name': "Tom", 'height': 180})

Human.height  # Column(name="height")
tom.height    # 180

< /code>
Wenn wir jetzt auf ein Feld aus der Klasse zugreifen, erhalten wir eine Spalte mit dem Namen des Feldes zurück. Wenn wir von einer Instanz wie Tom 
auf das Feld zugreifen, erhalten wir den tatsächlichen Wert für dieses Feld dieser Instanz zurück, in unserem Fall 180 . (Zumindest ist dies der Fall für Pylance, was ich verwende)
kommt jetzt die Frage:
Gibt es einen Trick oder eine Problemumgehung, damit der Typ -Checker versteht, dass Human.Height Spalte Typ ist , ohne das gleiche Feld zweimal das gleiche Feld, das zweimal das gleiche wie folgt ist: , müsste hier folgendes folgt:

Code: Select all

class Human(Base):
name: str
name: ClassVar[Column]
height: int
height: ClassVar[Column]
Das Ziel ist also, dass mein Typ -Checker der Meinung ist, dass die Klasse die kommentierten Instanzattribute hat, während alle Klassenattribute denselben Namen haben, aber alle Spalten der Type sind .

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post