Seite 1 von 1

Das neue memoryview() - voll "einfach"

Verfasst: Donnerstag 8. Juli 2010, 09:24
von snafu
`memoryview()` wurde in Python 2.7 rückportiert. Ich habe es mal in Python 3.1 ausprobiert. Für mich klang es zunächst einmal toll, sozusagen veränderbare Zeichenketten wie in C zu haben. Aber vieles daran lässt mich erschaudern (außer ich habe etwas grundsätzlich falsch verstanden):

Code: Alles auswählen

Python 3.1.1+ (r311:74480, Nov  2 2009, 14:49:22)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
# es fängt schon gut an
>>> m = memoryview('abcdefg')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot make memory view because object does not have the buffer interface
>>> m = memoryview(b'abcdefg')
>>> m
<memory at 0xb75260cc>
>>> m[0]
b'a'
# so mag er das nicht, also später passenden Typ übergeben
>>> m[0] = '*'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(b'abcdefg')
>>> mb = memoryview(b)
# jetzt vergesse ich schon wieder das `b'`
>>> mb[0] = '*'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface
>>> mb[0] = b'*'
>>> mb[0]
b'*'
# wäre auch zu einfach gewesen
>>> mb[:3]
<memory at 0xb752616c>
# yeah, Seiteneffekt (aber das muss wohl so sein)
>>> b[:3]
bytearray(b'*bc')
Fazit, Python 3 und ich werden bestimmt sehr gute Freunde... :)

Naja, vermutlich muss ich mich wirklich noch näher damit auseinandersetzen und werde hoffentlich schon bald den ersten schlechten Eindruck wieder revidieren können.

Re: Das neue memoryview() - voll "einfach"

Verfasst: Donnerstag 8. Juli 2010, 09:36
von DasIch
bytearray() ist genau was du willst.

Re: Das neue memoryview() - voll "einfach"

Verfasst: Donnerstag 8. Juli 2010, 09:40
von BlackJack
@snafu: Ich verstehe die Kritik nicht so ganz?

Wenn man veränderbare Zeichenketten wie in C haben möchte, würde ich ja `ctypes` verwenden.

Re: Das neue memoryview() - voll "einfach"

Verfasst: Donnerstag 8. Juli 2010, 09:52
von snafu
DasIch hat geschrieben:bytearray() ist genau was du willst.
Ja, man könnte an der Stelle mit `b[0] = ord('*')` dasselbe erreichen. Das wusste ich bisher nicht. Das macht die Sache schon etwas unkomplizierter, auch wenn man weiterhin die Typumwandlungen beachten muss.

Re: Das neue memoryview() - voll "einfach"

Verfasst: Donnerstag 8. Juli 2010, 09:55
von snafu
BlackJack hat geschrieben:Wenn man veränderbare Zeichenketten wie in C haben möchte, würde ich ja `ctypes` verwenden.
Es ging jetzt nur darum, dass das Feature offensichtlich mit Python-Sprachmitteln nutzbar ist, aber der Weg dorthin mir recht schwierig vorkam. Nach dem Hinweis von DasIch ist ja klar geworden, dass es im Endeffekt doch relativ einfach ist.

Re: Das neue memoryview() - voll "einfach"

Verfasst: Donnerstag 8. Juli 2010, 10:24
von DasIch
snafu hat geschrieben:
DasIch hat geschrieben:bytearray() ist genau was du willst.
Ja, man könnte an der Stelle mit `b[0] = ord('*')` dasselbe erreichen. Das wusste ich bisher nicht. Das macht die Sache schon etwas unkomplizierter, auch wenn man weiterhin die Typumwandlungen beachten muss.
bytes() ist ein bytearray() bloß unveränderbar. In diesem Fall bietet sich slicing an:

Code: Alles auswählen

>>> s = bytearray(b'abc')
>>> s[2:3] = b'd'
>>> print(s)
bytearray(b'abd')
Allerdings sollte dir klar sein das bytes binäre Daten repräsentieren und keinen Text, es handelt sich hier nicht einfach um veränderbare Strings.