Verfasst: Dienstag 23. Februar 2010, 17:14
Das ist was ganz anderes: http://de.wikipedia.org/wiki/Funktional ... ierspracheDackel hat geschrieben:funktionalen Ecke
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Das ist was ganz anderes: http://de.wikipedia.org/wiki/Funktional ... ierspracheDackel hat geschrieben:funktionalen Ecke
Code: Alles auswählen
len x
Ja natürlich nicht, aber das war auch nicht deine Frage. Auf deine Frage ist die Antwort nunmal „Ist so“. Auch wenn es unbefriedigend ist. Aber es gibt einfach keinen zwingenden Grund warum man eine len()-Funktion nehmen musste.r74 hat geschrieben:Aber ich glaube nicht, dass die Python-Entwickler ohne wirklichen Grund es einfach so gemacht haben, wie es im Moment ist.
Genauer gesagt wird bei der jeweiligen Klasse des Objekts gesucht, nicht bei der Instanz selbst.Darii hat geschrieben:Das Konzept von len(dass nach einer Methode __len__ bei dem Objekt gesucht wird) findest du in Python aber auch an anderen Stellen, z.B. bei "foo in bar" sucht Python nach einer Methode namens __contains__ von bar. Oder bei for(__getitem__ und __iter__ sind hier heiße Kandidaten).
Ja, das ist typischerweise der Unterschied: Funktionen mutieren das übergebene Objekt nicht sondern geben ein neues zurück, Methoden mutieren das Objekt und geben None zurück. (Das ist keineswegs zwingend, aber oft so.)Darii hat geschrieben:Das sind aber auch zwei verschiedene Funktionen. sort arbeitet in-place, sorted gibt eine neue Liste zurück und akzeptiert außerdem ein beliebiges iterable.numerix hat geschrieben:Ich empfinde hier auch Inkonsistenzen. Beispiel für eine Liste a:
Es heißt a.sort() und nicht sort(a), stattdessen gibt es z.B. sorted(a).
Bis auf Descriptoren wird immer die normale Suchreihenfolge für die Attribute eingehalten, d.h. erst Instanz dann Klasse.bords0 hat geschrieben:Genauer gesagt wird bei der jeweiligen Klasse des Objekts gesucht, nicht bei der Instanz selbst.
Vielleicht ja 2017 in Python 4. ;P Wobei es sich wohl empfehlen würde, bei ".len()" zu bleiben, da ".count()" schon existiert.sma hat geschrieben:Aber zu dem Zeitpunkt, wo immer mehr von Python objektorientiert wurde, war es offenbar schon zu spät und Rückwärtskompatibilität wurde noch höher bewertet als Uniformität.
Der Witz ist, dass bei "special syntax" (und len etc.) die Suche gleich bei der Klasse anfängt und nicht bei der Instanz. Die Attribute selbst kann man ganz normal nachschlagen.Darii hat geschrieben:Bis auf Descriptoren wird immer die normale Suchreihenfolge für die Attribute eingehalten, d.h. erst Instanz dann Klasse.bords0 hat geschrieben:Genauer gesagt wird bei der jeweiligen Klasse des Objekts gesucht, nicht bei der Instanz selbst.
Code: Alles auswählen
>>> list.__len__
<slot wrapper '__len__' of 'list' objects>
>>> len(list)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: object of type 'type' has no len()
Jein. Tatsachlich hast du Recht, das gilt aber nur für new-Style-Klassen. Naja, „Special cases aren't special enough to break the rules.“ hatten wir ja gerade...bords0 hat geschrieben:Der Witz ist, dass bei "special syntax" (und len etc.) die Suche gleich bei der Klasse anfängt und nicht bei der Instanz.
Was willst du jetzt damit zeigen? Das kann sowieso gar nicht funktionieren, da list.__len__ keine Klassenmethode ist.Code: Alles auswählen
>>> list.__len__ <slot wrapper '__len__' of 'list' objects> >>> len(list) Traceback (most recent call last): File "<interactive input>", line 1, in <module> TypeError: object of type 'type' has no len()
Was willst du jetzt damit zeigen? Das kann sowieso gar nicht funktionieren, da list.__len__ keine Klassenmethode ist.[/quote]Code: Alles auswählen
>>> list.__len__ <slot wrapper '__len__' of 'list' objects> >>> len(list) Traceback (most recent call last): File "<interactive input>", line 1, in <module> TypeError: object of type 'type' has no len()
Ganz einfach, da __len__ keine Klassenmethode ist, könne list.__len__() gar nicht funktionieren, wenn dort danach gesucht würde. Ich hab mir halt die Fehlermeldung nicht durchgelesen.bords0 hat geschrieben:Dass bei len nicht bei der Instanz (hier: list) nach dem Attribut __len__ gesucht wird.
Was Klassenmethoden damit zu tun haben, verstehe ich nicht![]()
len braucht doch keine Klassenmethoden (classmethod)?
Irgendwo muss man Kompromisse eingehen damit die Ausführungsgeschwindigkeit nicht völlig in den Keller geht.bords0 hat geschrieben:Der Witz ist, dass bei "special syntax" (und len etc.) die Suche gleich bei der Klasse anfängt und nicht bei der Instanz. Die Attribute selbst kann man ganz normal nachschlagen.
Doch, genau dies ist der Grund, warum Python vergleichsweise ineffizient ist und die UnloadenSwallow-Leute so Probleme haben, das System fix zu kriegen.Darii hat geschrieben:Der Dict-Lookup mehr oder weniger bringt einen bei Python jetzt auch nicht um. ;)
Eine VM kann da wenig machen. Bereits jetzt hat AFAIK CPython eine vtable pro Klasse, wo die ganzen Spezialmethoden, die ja überall aufgerufen werden müssen, eingetragen sind, damit man einen k*O(1) Zugriff mit minimalem k hat. Diese pro Exemplar einer Klasse mitzuschleppen klingt nicht nach einer guten Idee. Daher finde ich die Entscheidung, dass man Spezialmethoden nicht in einzelnen Exemplaren überschreiben kann, verständlich.Darii hat geschrieben: Sowas zu optimieren ist dann Aufgabe der VM und nicht der Sprache. Aber so ist das einfach nur inkonsistent.
Aber Python ist ja nicht deswegen ineffizient, weil die fünf Spezialmethoden einen zusätzlichen dict-Lookup benötigen, sondern weil das überall der Fall ist.sma hat geschrieben:Doch, genau dies ist der Grund, warum Python vergleichsweise ineffizient ist und die UnloadenSwallow-Leute so Probleme haben, das System fix zu kriegen.Darii hat geschrieben:Der Dict-Lookup mehr oder weniger bringt einen bei Python jetzt auch nicht um.
Muss man ja auch nicht, so lange das Exemplar sie nicht enthält.Eine VM kann da wenig machen. Bereits jetzt hat AFAIK CPython eine vtable pro Klasse, wo die ganzen Spezialmethoden, die ja überall aufgerufen werden müssen, eingetragen sind, damit man einen k*O(1) Zugriff mit minimalem k hat. Diese pro Exemplar einer Klasse mitzuschleppen klingt nicht nach einer guten Idee.Darii hat geschrieben: Sowas zu optimieren ist dann Aufgabe der VM und nicht der Sprache. Aber so ist das einfach nur inkonsistent.