Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5818 > unrolled thread

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

Started byc.buhtz@posteo.jp
First post2022-05-13 08:06 +0000
Last post2022-05-13 18:03 +0200
Articles 3 — 2 participants

Back to article view | Back to de.comp.lang.python


Contents

  [Python-de] dataclass: Unterschied zu automatischer Generierung aus dict c.buhtz@posteo.jp - 2022-05-13 08:06 +0000
    [Python-de] Re: dataclass: Unterschied zu automatischer Generierung c.buhtz@posteo.jp - 2022-05-13 10:23 +0000
      [Python-de] Re: dataclass: Unterschied zu automatischer Stefan Behnel <python-de@behnel.de> - 2022-05-13 18:03 +0200

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

Fromc.buhtz@posteo.jp
Date2022-05-13 08:06 +0000
Subject[Python-de] dataclass: Unterschied zu automatischer Generierung aus dict
Message-ID<f2138ea335d55c76b5e2433fc8710713@posteo.de>
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

[toc] | [next] | [standalone]


#5819 — [Python-de] Re: dataclass: Unterschied zu automatischer Generierung

Fromc.buhtz@posteo.jp
Date2022-05-13 10:23 +0000
Subject[Python-de] Re: dataclass: Unterschied zu automatischer Generierung
Message-ID<013a3cfd0c91a73055b920f9be9f45ad@posteo.de>
In reply to#5818
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

[toc] | [prev] | [next] | [standalone]


#5820 — [Python-de] Re: dataclass: Unterschied zu automatischer

FromStefan Behnel <python-de@behnel.de>
Date2022-05-13 18:03 +0200
Subject[Python-de] Re: dataclass: Unterschied zu automatischer
Message-ID<7f5bded9-7c18-feaa-0b76-834573040e80@behnel.de>
In reply to#5819
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

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.python


csiph-web