summaryrefslogtreecommitdiffstats
path: root/Doc/howto/pyporting.rst
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-02-05 12:13:38 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-02-05 12:13:38 (GMT)
commitbd866e972c1db654105a5204742eeff342a91719 (patch)
tree5b3d6519fe1a059c19d4798f9938d02736a54029 /Doc/howto/pyporting.rst
parente6a1464b89fc24f88e92fe0bab05c80efaf9780f (diff)
downloadcpython-bd866e972c1db654105a5204742eeff342a91719.zip
cpython-bd866e972c1db654105a5204742eeff342a91719.tar.gz
cpython-bd866e972c1db654105a5204742eeff342a91719.tar.bz2
Everybody hates this one :) (bytes indexing)
Diffstat (limited to 'Doc/howto/pyporting.rst')
-rw-r--r--Doc/howto/pyporting.rst31
1 files changed, 31 insertions, 0 deletions
diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst
index 38a13af..0c7721c 100644
--- a/Doc/howto/pyporting.rst
+++ b/Doc/howto/pyporting.rst
@@ -367,6 +367,37 @@ To turn the warning into an exception, use the ``-bb`` flag instead::
BytesWarning: Comparison between bytes and string
+Indexing bytes objects
+''''''''''''''''''''''
+
+Another potentially surprising change is the indexing behaviour of bytes
+objects in Python 3::
+
+ >>> b"xyz"[0]
+ 120
+
+Indeed, Python 3 bytes objects (as well as :class:`bytearray` objects)
+are sequences of integers. But code converted from Python 2 will often
+assume that indexing a bytestring produces another bytestring, not an
+integer. To reconcile both behaviours, use slicing::
+
+ >>> b"xyz"[0:1]
+ b'x'
+ >>> n = 1
+ >>> b"xyz"[n:n+1]
+ b'y'
+
+The only remaining gotcha is that an out-of-bounds slice returns an empty
+bytes object instead of raising ``IndexError``:
+
+ >>> b"xyz"[3]
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+ IndexError: index out of range
+ >>> b"xyz"[3:4]
+ b''
+
+
``__str__()``/``__unicode__()``
'''''''''''''''''''''''''''''''
In Python 2, objects can specify both a string and unicode representation of