Möglicher Bug in python 3

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
acoolon
User
Beiträge: 27
Registriert: Samstag 2. August 2008, 20:16

Moin,

mir ist sehr wohl bewusst, dass es einen Bugtracker gibt, ich bin mir jedoch hiermit nicht ganz sicher.
Da will ich lieber dieses Forum füllen statt einen falschen Eintrag im Bugtracker zu hinterlassen.

Mir ist folgende Unstimmigkeit aufgefallen, ich denke Code verdeutlicht das am Besten:

Code: Alles auswählen

b = b'\x00\x01'
print(repr(b[-1]))
print(b[-1] == b'\x01')
print(repr(b[:]))

Code: Alles auswählen

Python 2.7 (r27:82500, Oct 20 2010, 03:28:42) 
[GCC 4.5.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> b = b'\x00\x01'
>>> print(repr(b[-1]))
'\x01'
>>> print(b[-1] == b'\x01')
True
>>> print(repr(b[:]))
'\x00\x01

Code: Alles auswählen

Python 3.1.2 (r312:79147, Oct  4 2010, 12:45:09) 
[GCC 4.5.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> b = b'\x00\x01'
>>> print(repr(b[-1]))
1
>>> print(b[-1] == b'\x01')
False
>>> print(repr(b[:]))
b'\x00\x01'
Ist das Absicht?

Danke, aco
BlackJack

@acoolon: Ja das ist Absicht. Die Elemente sind bei Python 3 keine Byteketten der Länge 1 mehr, sondern Zahlen mit dem jeweiligen Bytewert an dem Index:

Code: Alles auswählen

>>> b
b'\x00\x01'
>>> type(b[-1])
<class 'int'>
>>> b'\xff'[-1]
255
Das heisst der `repr()`-Aufruf ist in Deinem Beispiel in Python 3 überflüssig weil `repr()` und `str()` bei ganzen Zahlen das gleiche Ergebnis liefern.
acoolon
User
Beiträge: 27
Registriert: Samstag 2. August 2008, 20:16

Ok, danke.

Scheint mit ein wenig inkonsistent, aber dann muss man damit halt leben.

aco
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

acoolon hat geschrieben:Scheint mit ein wenig inkonsistent, aber dann muss man damit halt leben.
Einfach Python 3 vermeiden, so lange es geht…die „Bytesstrings“ sind ein einziger „Bug-by-Intention“ in Python 3.
Antworten