dataclass: Unterschied zu automatischer Generierung aus dict

Hallo, meine Frage bezieht sich auf dieses StackOverflow-Posting: https://stackoverflow.com/q/72217470/4865723 Dort geht es darum, wie man aus den Keys eines dict automatisch eine dataclass erzeugen könnte. Erst einmal erscheint es einfach:
import dataclasses d = {'a': 3, 'b': 7} X = dataclasses.make_dataclass('X', d)
Aber es gibt hier im Ergebnis einen Unterschied zu einer regulär erzeugten dataclass.
X <class 'types.X'>
Regulär erzeugt
@dataclasses.dataclass ... class X: ... a: int ... b: int ... X <class '__main__.X'>
In einem Fall "types.X" und im anderen "__main__.X". Warum ist das so und ist dieser Unterschied von Relevanz? SG Christian

Eine Konsequenz scheint zu sein, dass ich eine automatisch erzeugte dataclass nicht pickeln kann. Ich bekomme den Fehler "_pickle.PicklingError: Can't pickle <class 'types.X'>: attribute lookup X on types failed" Wenn ich aber den Modulnamen ändere x.__module__ = '__main__' geht es auch mit Pickle. Am 13.05.2022 10:06 schrieb c.buhtz@posteo.jp:
Hallo,
meine Frage bezieht sich auf dieses StackOverflow-Posting: https://stackoverflow.com/q/72217470/4865723
Dort geht es darum, wie man aus den Keys eines dict automatisch eine dataclass erzeugen könnte. Erst einmal erscheint es einfach:
import dataclasses d = {'a': 3, 'b': 7} X = dataclasses.make_dataclass('X', d)
Aber es gibt hier im Ergebnis einen Unterschied zu einer regulär erzeugten dataclass.
X <class 'types.X'>
Regulär erzeugt
@dataclasses.dataclass ... class X: ... a: int ... b: int ... X <class '__main__.X'>
In einem Fall "types.X" und im anderen "__main__.X". Warum ist das so und ist dieser Unterschied von Relevanz?
SG Christian _______________________________________________ python-de Mailingliste -- python-de@python.org Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an python-de-leave@python.org https://mail.python.org/mailman3/lists/python-de.python.org/ Mitgliedsadresse: c.buhtz@posteo.jp

c.buhtz@posteo.jp schrieb am 13.05.22 um 12:23:
Eine Konsequenz scheint zu sein, dass ich eine automatisch erzeugte dataclass nicht pickeln kann. Ich bekomme den Fehler "_pickle.PicklingError: Can't pickle <class 'types.X'>: attribute lookup X on types failed"
Wenn ich aber den Modulnamen ändere x.__module__ = '__main__' geht es auch mit Pickle.
Ja, das ist auch zu erwarten. Pickle muss die Klasse ja irgendwo her bekommen, um beim Auspickeln ein Objekt davon erzeugen zu können. Dazu benötigt es den Package/Modul-Pfad. Das selbe Problem würdest du mit einem namedtuple haben, mit lokal innerhalb einer Funktion erzeugten Klassen, oder anderen Datentypen, bei denen nicht klar ist, woher sie kommen und wie sie zugänglich sind. Stefan
participants (2)
-
c.buhtz@posteo.jp
-
Stefan Behnel