Seite 1 von 1

python3 - bug oder feature?

Verfasst: Sonntag 21. Dezember 2008, 14:27
von Costi
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 :?

Verfasst: Sonntag 21. Dezember 2008, 14:33
von Trundle
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.

Verfasst: Sonntag 21. Dezember 2008, 21:10
von str1442
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

Verfasst: Sonntag 21. Dezember 2008, 21:16
von BlackVivi
Man könnte natürlich auch gleich def __getitem__(self, key) schreiben, aber das wär wahrscheinlich zu umständlich.