python3 - bug oder feature?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

mit python2.6

Code: Alles auswählen

$ python2.6
Python 2.6 (r26:66714, Nov 19 2008, 12:48:10) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Test:
... 	def mygetitem(self, key):
... 		return 42
... 	def __init__(self):    
... 		self.__getitem__ = self.mygetitem
... 
>>> t = Test()
>>> t['blab']    
42
und python3.0:

Code: Alles auswählen

$ python3.0
Python 3.0rc1+ (py3k, Oct 28 2008, 09:23:29) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> class Test:
...     def __init__(self):
...             self.__getitem__ = self.mygetitem
...     def mygetitem(self, key):
...             return 42
... 
>>> t = Test()
>>> t['a']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Test' object is unsubscriptable
>>> 
kann mich nhemand aufklaeren :?
cp != mv
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das ist ein Feature: dein Beispiel würde mit Python 2.x auch nicht funktionieren, wenn du New-Style-Klassen verwenden würdest, da dort ``__getitem__`` nicht im Dict des Exemplars sondern im Dict der Klasse gesucht wird. Und in 3k gibt es eben nur noch New-Style-Klassen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dh, du musst bei New Style Klassen __getitem__ im Namensraum der Klasse definieren, nicht mit "self":

Code: Alles auswählen

In [4]: class Test(object):
   ...:     def mygetitem(self, key):
   ...:         return 42
   ...:     __getitem__ = mygetitem
   ...:     
   ...:     

In [5]: a = Test()

In [6]: a["5q"]
Out[6]: 42
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Man könnte natürlich auch gleich def __getitem__(self, key) schreiben, aber das wär wahrscheinlich zu umständlich.
Antworten