summaryrefslogtreecommitdiffstatshomepage
path: root/docs/differences/python_39.rst
blob: f68abc50740ac2b804ed38c8caebc34eaebc574e (plain) (blame)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
.. _python_39:

Python 3.9
==========

Python 3.9.0 (final) was released on the 5th October 2020. The Features for 3.9 are
defined in `PEP 596 <https://www.python.org/dev/peps/pep-0596/#features-for-3-9>`_
and a detailed description of the changes can be found in
`What's New in Python 3.9 <https://docs.python.org/3/whatsnew/3.9.html>`_

.. table::
  :widths: 20 60 20

  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | **Features**                                           |                                                    | **Status**           |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 573 <https://www.python.org/dev/peps/pep-0573/>`_ | Fast access to module state from methods of C      | Not relevant         |
  |                                                        | extension types                                    |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 584 <https://www.python.org/dev/peps/pep-0584/>`_ | Union operators added to dict                      | Complete [#pep584]_  |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 585 <https://www.python.org/dev/peps/pep-0584/>`_ | Type hinting generics in standard collections      |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 593 <https://www.python.org/dev/peps/pep-0593/>`_ | Flexible function and variable annotations         |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 602 <https://www.python.org/dev/peps/pep-0602/>`_ | CPython adopts an annual release cycle. Instead of | Not relevant         |
  |                                                        | annual, aiming for two month release cycle         |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 614 <https://www.python.org/dev/peps/pep-0614/>`_ | Relaxed grammar restrictions on decorators         |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 615 <https://www.python.org/dev/peps/pep-0615/>`_ | The IANA Time Zone Database is now present in the  |                      |
  |                                                        | standard library in the zoneinfo module            |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 616 <https://www.python.org/dev/peps/pep-0616/>`_ | String methods to remove prefixes and suffixes     |                      |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+
  | `PEP 617 <https://www.python.org/dev/peps/pep-0617/>`_ | CPython now uses a new parser based on PEG         | Not relevant         |
  +--------------------------------------------------------+----------------------------------------------------+----------------------+

Other Language Changes:

.. table::
  :widths: 90 10

  +-------------------------------------------------------------------------------------------------------------+---------------+
  | *__import__()* now raises *ImportError* instead of *ValueError*                                             | Complete      |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | Python now gets the absolute path of the script filename specified on the command line (ex: *python3*       |               |
  | *script.py*): the *__file__* attribute of the *__main__* module became an absolute path, rather than a      |               |
  | relative path                                                                                               |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | By default, for best performance, the errors argument is only checked at the first encoding/decoding error  |               |
  | and the encoding argument is sometimes ignored for empty strings                                            |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | *"".replace("", s, n)* now returns *s* instead of an empty string for all non-zero n. It is now consistent  |               |
  | with *"".replace("", s)*                                                                                    |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | Any valid expression can now be used as a decorator. Previously, the grammar was much more restrictive      |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | Parallel running of *aclose()* / *asend()* / *athrow()* is now prohibited, and *ag_running* now reflects    |               |
  | the actual running status of the async generator                                                            |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | Unexpected errors in calling the *__iter__* method are no longer masked by TypeError in the in operator and |               |
  | functions contains(), indexOf() and countOf() of the operator module                                        |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+
  | Unparenthesized lambda expressions can no longer be the expression part in an if clause in comprehensions   |               |
  | and generator expressions                                                                                   |               |
  +-------------------------------------------------------------------------------------------------------------+---------------+

Changes to built-in modules:

.. table::
  :widths: 90 10

  +---------------------------------------------------------------------------------------------------------------+---------------+
  | `asyncio <https://docs.python.org/3/whatsnew/3.9.html#asyncio>`_                                                              |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Due to significant security concerns, the reuse_address parameter of *asyncio.loop.create_datagram_endpoint()*|               |
  | is no longer supported                                                                                        |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added a new coroutine *shutdown_default_executor()* that schedules a shutdown for the default executor that   |               |
  | waits on the *ThreadPoolExecutor* to finish closing. Also, *asyncio.run()* has been updated to use the new    |               |
  | coroutine.                                                                                                    |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added *asyncio.PidfdChildWatcher*, a Linux-specific child watcher implementation that polls process file      |               |
  | descriptors                                                                                                   |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | added a new *coroutine asyncio.to_thread()*                                                                   |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | When cancelling the task due to a timeout, *asyncio.wait_for()* will now wait until the cancellation is       |               |
  | complete also in the case when timeout is <= 0, like it does with positive timeouts                           |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | *asyncio* now raises *TyperError* when calling incompatible methods with an *ssl.SSLSocket* socket            |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | `gc <https://docs.python.org/3/whatsnew/3.9.html#gc>`_                                                                        |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Garbage collection does not block on resurrected objects                                                      |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added a new function *gc.is_finalized()* to check if an object has been finalized by the garbage collector    |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | `math <https://docs.python.org/3/whatsnew/3.9.html#math>`_                                                                    |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Expanded the *math.gcd()* function to handle multiple arguments. Formerly, it only supported two arguments    |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added *math.lcm()*: return the least common multiple of specified arguments                                   |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added *math.nextafter()*: return the next floating-point value after x towards y                              |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added *math.ulp()*: return the value of the least significant bit of a float                                  |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | `os <https://docs.python.org/3/whatsnew/3.9.html#os>`_                                                                        |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Exposed the Linux-specific *os.pidfd_open()* and *os.P_PIDFD*                                                 |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | The *os.unsetenv()* function is now also available on Windows                                                 | Complete      |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | The *os.putenv()* and *os.unsetenv()* functions are now always available                                      | Complete      |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  |  Added *os.waitstatus_to_exitcode()* function: convert a wait status to an exit code                          |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | `random <https://docs.python.org/3/whatsnew/3.9.html#random>`_                                                                |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added a new *random.Random.randbytes* method: generate random bytes                                           |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | `sys <https://docs.python.org/3/whatsnew/3.9.html#sys>`_                                                                      |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Added a new *sys.platlibdir* attribute: name of the platform-specific library directory                       |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+
  | Previously, *sys.stderr* was block-buffered when non-interactive. Now stderr defaults to always being         |               |
  | line-buffered                                                                                                 |               |
  +---------------------------------------------------------------------------------------------------------------+---------------+

.. rubric:: Notes

.. [#pep584] PEP 584 ``dict`` union operator is only available on MicroPython builds with ``MICROPY_CPYTHON_COMPAT`` enabled.