Wie überprüfe ich, welche Typen in definierten Typen sind.Python

Python-Programme
Anonymous
 Wie überprüfe ich, welche Typen in definierten Typen sind.

Post by Anonymous »

Ich benutze Python 3.11 und müsste feststellen, ob ein optionales -Klass -Attribut eine Art von Enum ist (d. H. Typ einer Unterklasse von Enum). Noch besser, wenn ich den Typ eines optionalen Feldes abrufen könnte, ist es optional [STR] , optional [int] , optional [class_x] usw.
Beispielcode
">"> ">"> ">"> ">"> ">

Code: Select all

from typing import Optional, get_type_hints
from enum import IntEnum, Enum

class TestEnum(IntEnum):
foo = 1
bar = 2

class Foo():
opt_enum : TestEnum | None = None

types = get_type_hints(Foo)['opt_enum']
Dies funktioniert
(ipython)

Code: Select all

In [4]: Optional[TestEnum] == types
Out[4]: True
Diese Einen fehlen
(Ja, das sind verzweifelte Versuche)

Code: Select all

In [6]: Optional[IntEnum] == types
Out[6]: False
< /code>
und < /p>
In [11]: issubclass(Enum, types)
Out[11]: False
< /code>
und < /p>
In [12]: issubclass(types, Enum)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [12], line 1
----> 1 issubclass(types, Enum)

TypeError: issubclass() arg 1 must be a class
< /code>
und < /p>
In [13]: issubclass(types, Optional[Enum])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [13], line 1
----> 1 issubclass(types, Optional[Enum])

File /usr/lib/python3.10/typing.py:1264, in _UnionGenericAlias.__subclasscheck__(self, cls)
1262 def __subclasscheck__(self, cls):
1263     for arg in self.__args__:
-> 1264         if issubclass(cls, arg):
1265             return True

TypeError: issubclass() arg 1 must be a class
< /code>
und < /p>
In [7]: IntEnum in types
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In [7], line 1
----> 1 IntEnum in types

TypeError: argument of type 'types.UnionType' is not iterable
< /code>
 Warum ich dies brauchte < /h3>
Ich habe mehrere Fälle, in denen ich Daten aus CSV -Dateien importiere und Objekte einer Klasse aus jeder Zeile erstelle. csv.dictreader () 
gibt einen Diktat [str, str] zurück und ich muss die Typen für die Felder beheben, bevor sie versuchen, das Objekt zu erstellen. Einige der Objektfelder sind jedoch optional [int] , optional [bool] , optional [enumx] oder optional [classx] . Ich habe einige dieser Klassen, die meine csvimportable () Klasse/Schnittstelle multi-ineritieren. Ich möchte die Logik einmal in csvimportable () Klasse implementieren, anstatt in jeder Unterklasse ungefähr den gleichen Code auf Feldbewusstsein zu schreiben. Diese csvimportable._field_type_updater () sollte:

Die Typen zumindest für Basistypen und Enums ordnungsgemäß ändert>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post