Die Mathe-Redaktion - 21.11.2019 23:37 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 515 Gäste und 16 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Python: Erklärung von types.SimpleNamespace
Druckversion
Druckversion
Autor
Universität/Hochschule J Python: Erklärung von types.SimpleNamespace
Lucky_7
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 21.01.2018
Mitteilungen: 163
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2019-10-08


Ich bemühe mich gerade pythons `types.SimpleNamespace` zu verstehen. Laut Doku entspricht dieser Ausdruck in etwa folgendem Code:
python
class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
 
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))
 
    def __eq__(self, other):
        return self.__dict__ == other.__dict__

Hierzu erst einmal folgende Frage:
Was hat es zu bedeuten, wenn eine Funktion mit doppeltem Unterstich beginnt und endet? Ich weiß, dass in Python häufiger der Ausdruck __name__ = auftaucht. Das bezieht sich dann auf den Namen des aufgerufenen Programms. Das Hauptprogramm main.py kann ja ein anderes Programm mit anderem Namen aufrufen, zum Beispiel Unterprogramm1.py - in diesem Fall wäre __name__ == Unterprogramm1. Glaube ich.
Aber hat das irgendetwas mit den Funktionen dieser Klasse zu tun?

self bezieht sich ja immer auf das Objekt dieser Klasse, das gerade erzeugt wurde. Über __init__ wird also sobald ein Objekt erzeugt wird, dieses Objekt auch initialisiert. kwargs ist hierbei eine Liste, nehme ich an. Über **kwargs werden dann die einzelnen Einträge der Liste der Reihe nach an __init__ übergeben. Was aber ist __dict__ ? Klar, hiermit wird ein dictionary gemeint sein. Aber gibt es das schon? Wo wurde das initialisiert? Wird dieses dictionary über self.__dict__.update(kwargs) erzeugt? In dem Fall müsste in kwargs ja sowohl ein key als auch ein entsprechender Wert für jeden key genannt sein.
Dann gibt es da noch diese Zeile:
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
Was geschieht hier? Ich iteriere durch die keys des dictionaries. Und dann wird in "{}={!r}" so etwas stehen wie: key="value". Value ist hierbei ein string. Warum will ich den value als string angeben?

Ok. Ich schätze ihr seht schon: Fragen über Fragen. Kann mir jemand diese Klasse erklären? Ich komme hier nicht mehr mit.

Vielen Dank schon mal!



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2819
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2019-10-08


Hallo,

ich hab zwar schon seit Ewigkeiten nicht mehr in Python programmiert, aber versuche mein bestes ... einige dieser Dinge werden im Python-Tutorial (auf python.org) behandelt, das solltest du auf jeden Fall mal durchgehen.

Die Funktionen mit doppeltem Unterstrich vorn und hinten sind "magisch", d.h. sie sind nicht dazu gedacht, explizit aufgerufen zu werden, sondern sie werden intern in bestimmten Situationen aufgerufen. __init__ ist ein Konstruktor: Wenn du mit n = SimpleNamespace() eine Instanz der Klasse erstellst, wird hinter den Kulissen __init__ aufgerufen, um diese zu initialisieren. __repr__ erzeugt eine String-Repräsentation, so dass print(n) funktioniert. __eq__ wird aufgerufen, wenn die Gleichheit n == m geprüft wird. Es gibt noch viele andere solcher "magischen" Funktionen.

kwargs ist ein Dictionary von Keyword-Argumenten. Diese werden hier nacheinander in das __dict__ eingefügt. Damit kann man also über Konstruktorargumente bereits die Instanz mit zusätzlichen Elementen (Funktionen etc.) anreichern.

__dict__ ist das Dictionary, das die Elemente der Klasse enthält. Wenn deine Klasse also z.B. eine Funktion foo enthält, dann enthält __dict__ zu dem Schlüssel "foo" das entsprechende Funktionsobjekt.

Das sollte mehr oder weniger deine Fragen abdecken. Die Frage ist noch, wozu willst du das wissen? Vermutlich willst du die Klasse nicht einfach so benutzen, sondern das wird in Code, der dir vorliegt, gemacht. Ich denke aus der Benutzung sollte ungefähr hervorgehen, was der Sinn davon ist ...


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 45995
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2019-10-08


Hi Lucky_7,
es ist nicht richtig, die return-Anweisung in einer Schleife auszuführen.
Die Funktion wird bereits beim ersten Schleifendurchlauf verlassen. Das kann nicht beabsichtigt sein.
Gruß Buri



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2819
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2019-10-08


@Buri, da steht nirgends eine return-Anweisung in einer Schleife.



  Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 45995
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, eingetragen 2019-10-08


2019-10-08 18:22 - ligning in Beitrag No. 3 schreibt:
@Buri, da steht nirgends eine return-Anweisung in einer Schleife.
Hi ligning,
es steht da: (for k in keys), und darauf folgt die return-Anweisung.
Gruß Buri



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2819
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2019-10-08


Ich kann mich nur wiederholen.



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 731
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, eingetragen 2019-10-08


2019-10-08 18:27 - Buri in Beitrag No. 4 schreibt:
es steht da: (for k in keys), und darauf folgt die return-Anweisung.

Du scheinst die Bedeutung von "for" misszuverstehen. Für die Funktion...
python
def f(r):
  items = (k**2 for k in range(r))
  return items

... liefert f(r) einen Generator für die Werte $0,1,4,\ldots,(r-1)^2$:
python
>>> f(5)
<generator object f.<locals>.<genexpr> at 0x6ffffe3a468>
>>> list(f(5))
[0, 1, 4, 9, 16]

--zippy



  Profil  Quote  Link auf diesen Beitrag Link
Buri
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 02.08.2003
Mitteilungen: 45995
Aus: Dresden
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.7, eingetragen 2019-10-08


2019-10-08 19:48 - zippy in Beitrag No. 6 schreibt:
Du scheinst die Bedeutung von "for" misszuverstehen.
Hi zippy,
tatsächlich, ich wußte nicht, dass die for-Klausel der eigentlichen Anweisung nachgestellt werden kann wie in "items ... for(k in keys)".
Danke für die Aufklärung.
Gruß Buri



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 21.01.2018
Mitteilungen: 163
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.8, vom Themenstarter, eingetragen 2019-10-09


Hey ligning,

vielen Dank für deine Erklärung, die ist echt spitze!

Wenn ich es richtig verstanden habe, werden die "magischen" Funktionen bei bestimmten Operationen automatisch aufgerufen. Wenn ich also beispielsweise eine Instanz eines Objektes erzeuge, wird automatisch __init__ aufgerufen. Wieso die gegebene Definition von __eq__ hier relevant sein könnte, weiß ich nicht. Aber ist vrmtl gerade auch nicht so wichtig.

Eine Frage habe ich noch zu der __repr__ Funktion:
python
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

Sagen wir, ich habe ein dictionary wie folgendes:
python
myDict = {'key1': 1, 'key2': 2, 'key3': 3}
Dann liefert der genannte Code für items:
python
'key1' = 1
'key2' = 2
'key3' = 3
(also !r ist irgendwie ein Platzhalter für die repr Repräsentation...)
Und zurück gegeben wird
python
myClassName.myProgramName ('key1', 'key2', 'key3')

Stimmt das so?

Übrigens: Du hast natürlich recht - ich bin auf diese Klasse in einem Tutorial zur Socketprogrammierung gestoßen: hier

Hier lese ich geraden den Part über den Multi-Connection Server. Aber das muss ich mir nochmals in Ruhe anschauen, um den Code genau zu verstehen





  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2819
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.9, eingetragen 2019-10-09


2019-10-09 10:35 - Lucky_7 in Beitrag No. 8 schreibt:
Wieso die gegebene Definition von __eq__ hier relevant sein könnte, weiß ich nicht. Aber ist vrmtl gerade auch nicht so wichtig.
Wenn ich SimpleNamespace beim flüchtigen Lesen richtig verstanden habe, ist das mehr so eine Komfort-Klasse, die brauchbare Definitionen für gewisse Funktionen mitbringt, die man normalerweise von Hand schreiben würde.


Eine Frage habe ich noch zu der __repr__ Funktion:
python
items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

Sagen wir, ich habe ein dictionary wie folgendes:
python
myDict = {'key1': 1, 'key2': 2, 'key3': 3}
Dann liefert der genannte Code für items:
python
'key1' = 1
'key2' = 2
'key3' = 3
(also !r ist irgendwie ein Platzhalter für die repr Repräsentation...)
Und zurück gegeben wird
python
myClassName.myProgramName ('key1', 'key2', 'key3')

Stimmt das so?
Wenn ich dich richtig verstehe, meinst du __dict__ statt myDict. Ansonsten sehe ich die Relevanz von myDict hier nicht. Und dann sieht das eher so aus: "myClassName(key1=1, key2=2, key3=3).



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 21.01.2018
Mitteilungen: 163
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.10, vom Themenstarter, eingetragen 2019-10-09


ah ja. Verstehe.

Danke dir, nochmals!



  Profil  Quote  Link auf diesen Beitrag Link
Lucky_7 hat die Antworten auf ihre/seine Frage gesehen.
Lucky_7 hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]