[Python-de] dataclass: Unterschied zu automatischer Generierung aus dict

2 views
Skip to first unread message

c.b...@posteo.jp

unread,
May 13, 2022, 4:06:20 AMMay 13
to
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

c.b...@posteo.jp

unread,
May 13, 2022, 6:24:02 AMMay 13
to
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.
> _______________________________________________
> python-de Mailingliste -- pyth...@python.org
> Zur Abmeldung von dieser Mailingliste senden Sie eine Nachricht an
> python-...@python.org
> https://mail.python.org/mailman3/lists/python-de.python.org/
> Mitgliedsadresse: c.b...@posteo.jp

Stefan Behnel

unread,
May 13, 2022, 12:15:56 PMMay 13
to
c.b...@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
Reply all
Reply to author
Forward
0 new messages