File: stdlib_incompatibilities.rst

package info (click to toggle)
python-future 0.18.2-6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 4,264 kB
  • sloc: python: 43,246; makefile: 136; sh: 29
file content (106 lines) | stat: -rw-r--r-- 3,151 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
.. _stdlib-incompatibilities:

Standard library incompatibilities
==================================

Some standard library interfaces have changed in ways that require
different code than normal Py3 code in order to achieve Py2/3
compatibility.

Here we will attempt to document these, together with known workarounds:

.. csv-table:: Standard library incompatibilities
   :header: "module", "object / feature", "section"
   :widths: 10, 20, 15

   ``array``, ``array`` constructor, :ref:`stdlib-array-constructor`
   ``array``, ``array.read()`` method, :ref:`stdlib-array-read`
   ``base64``, ``decodebytes()`` function, :ref:`stdlib-base64-decodebytes`
   ``re``, ``ASCII`` mode, :ref:`stdlib-re-ASCII`

To contribute to this, please email the python-porting list or send a
pull request. See :ref:`contributing`.


.. _stdlib-array-constructor:

array.array()
-------------

The first argument to ``array.array(typecode[, initializer])`` must be a native
platform string: unicode string on Python 3, byte string on Python 2.

Python 2::
    >>> array.array(b'b')
    array.array(b'b')

    >>> array.array(u'u')
    TypeError: must be char, not unicode

Python 3::
    >>> array.array(b'b')
    TypeError: must be a unicode character, not bytes

    >>> array.array(u'b')
    array('b')

This means that the typecode cannot be specified portably across Python 3 and Python 2
with a single string literal when ``from __future__ import unicode_literals`` is in effect.

You can use the following code on both Python 3 and Python 2::

    from __future__ import unicode_literals
    from future.utils import bytes_to_native_str
    import array

    # ...

    a = array.array(bytes_to_native_str(b'b'))

This was `fixed in Python 2.7.11
<https://hg.python.org/cpython/file/6d1b6a68f775/Misc/NEWS#l233>`_.
Since then, ``array.array()`` now also accepts unicode format typecode.

.. _stdlib-array-read:

array.array.read()
------------------
This method has been removed in Py3. This crops up in e.g. porting ``http.client``.


.. _stdlib-base64-decodebytes:

base64.decodebytes() and base64.encodebytes()
---------------------------------------------
The ``base64`` module on Py2 has no ``decodebytes`` or ``encodebytes`` functions.


.. _stdlib-re-ASCII:

re.ASCII
--------
Python 3 code using regular expressions sometimes looks like this (from
:mod:`urllib.request`)::

    re.compile(r":\d+$", re.ASCII)

This enables 'ASCII mode' for regular expressions (see the docs `here
<http://docs.python.org/3/library/re.html#re.ASCII>`_). Python 2's
:mod:`re` module has no equivalent mode.

struct.pack()
-------------

Before Python version 2.7.7, the :func:`struct.pack` function
required a native string as its format argument. For example::

    >>> from __future__ import unicode_literals
    >>> from struct import pack
    >>> pack('<4H2I', version, rec_type, build, year, file_hist_flags, ver_can_read)

raised ``TypeError: Struct() argument 1 must be string, not unicode``.

This was `fixed in Python 2.7.7
<https://hg.python.org/cpython/raw-file/f89216059edf/Misc/NEWS>`_.
Since then, ``struct.pack()`` now also accepts unicode format
strings.