Das neue memoryview() - voll "einfach"

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6834
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

`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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

bytearray() ist genau was du willst.
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.
Benutzeravatar
snafu
User
Beiträge: 6834
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Benutzeravatar
snafu
User
Beiträge: 6834
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Antworten