Skip to content

Commit fdc73cb

Browse files
gvanrossumucoderycarltongibsonhugovkjonburdo
authored
Merged main into regmachine branch (#50)
* Correct CVE-2020-10735 documentation (python#100306) * pythongh-94912: Added marker for non-standard coroutine function detection (python#99247) This introduces a new decorator `@inspect.markcoroutinefunction`, which, applied to a sync function, makes it appear async to `inspect.iscoroutinefunction()`. * Docs: Don't upload CI artifacts (python#100330) * pythongh-89727: Fix os.walk RecursionError on deep trees (python#99803) Use a stack to implement os.walk iteratively instead of recursively to avoid hitting recursion limits on deeply nested trees. * pythongh-69929: re docs: Add more specific definition of \w (python#92015) Co-authored-by: Jelle Zijlstra <[email protected]> * pythongh-89051: Add ssl.OP_LEGACY_SERVER_CONNECT (python#93927) Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Christian Heimes <[email protected]> Co-authored-by: Hugo van Kemenade <[email protected]> Fixes python#89051 * pythongh-88211: Change lower-case and upper-case to match recommendations in imaplib docs (python#99625) * pythongh-100348: Fix ref cycle in `asyncio._SelectorSocketTransport` with `_read_ready_cb` (python#100349) * pythongh-99925: Fix inconsistency in `json.dumps()` error messages (pythonGH-99926) * Clarify that every thread has its own default context in contextvars (python#99246) * pythongh-99576: Fix cookiejar file that was not truncated for some classes (pythonGH-99616) Co-authored-by: Łukasz Langa <[email protected]> * pythongh-100188: Reduce misses in BINARY_SUBSCR_(LIST/TUPLE)_INT (python#100189) Don't specialize if the index is negative. * pythongh-99991: improve docs on str.encode and bytes.decode (python#100198) Co-authored-by: C.A.M. Gerlach <[email protected]> * pythongh-91081: Add note on WeakKeyDictionary behavior when deleting a replaced entry (python#91499) Co-authored-by: Pieter Eendebak <[email protected]> Co-authored-by: Jelle Zijlstra <[email protected]> * pythongh-85267: Improvements to inspect.signature __text_signature__ handling (python#98796) This makes a couple related changes to inspect.signature's behaviour when parsing a signature from `__text_signature__`. First, `inspect.signature` is documented as only raising ValueError or TypeError. However, in some cases, we could raise RuntimeError. This PR changes that, thereby fixing python#83685. (Note that the new ValueErrors in RewriteSymbolics are caught and then reraised with a message) Second, `inspect.signature` could randomly drop parameters that it didn't understand (corresponding to `return None` in the `p` function). This is the core issue in python#85267. I think this is very surprising behaviour and it seems better to fail outright. Third, adding this new failure broke a couple tests. To fix them (and to e.g. allow `inspect.signature(select.epoll.register)` as in python#85267), I add constant folding of a couple binary operations to RewriteSymbolics. (There's some discussion of making signature expression evaluation arbitrary powerful in python#68155. I think that's out of scope. The additional constant folding here is pretty straightforward, useful, and not much of a slippery slope) Fourth, while python#85267 is incorrect about the cause of the issue, it turns out if you had consecutive newlines in __text_signature__, you'd get `tokenize.TokenError`. Finally, the `if name is invalid:` code path was dead, since `parse_name` never returned `invalid`. * pythonGH-100363: Speed up `asyncio.get_running_loop` (python#100364) * pythonGH-100133: fix `asyncio` subprocess losing `stderr` and `stdout` output (python#100154) * pythongh-100374: Fixed a bug in socket.getfqdn() (pythongh-100375) * pythongh-100129: Add tests for pickling all builtin types and functions (pythonGH-100142) * Remove unused variable from `dis._find_imports` (python#100396) * pythongh-78878: Fix crash when creating an instance of `_ctypes.CField` (python#14837) * pythonGH-69564: Clarify use of octal format of mode argument in help(os.chmod) (python#20621) Co-authored-by: Kumar Aditya <[email protected]> * pythonGH-99554: Pack location tables more effectively (pythonGH-99556) * Correct typo in typing.py (python#100423) In the docstring of `ParamSpec`, the name of `P = ParamSpec('P')` was mistakenly written as `'T'`. * pythongh-99761: Add `_PyLong_IsPositiveSingleDigit` function to check for single digit integers (python#100064) * pythonGH-99770: Make the correct call specialization fail kind show up in the stats (pythonGH-99771) * pythongh-78997: fix bad rebase of moved test file (python#100424) * pythongh-100344: Add C implementation for `asyncio.current_task` (python#100345) Co-authored-by: pranavtbhat * pythonGH-99554: Trim trailing whitespace (pythonGH-100435) Automerge-Triggered-By: GH:brandtbucher * pythongh-85432: Harmonise parameter names between C and pure-Python implementations of `datetime.time.strftime`, `datetime.datetime.fromtimestamp` (python#99993) * pythongh-57762: fix misleading tkinter.Tk docstring (python#98837) Mentioned as a desired change by terryjreedy on the corresponding issue, since Tk is not a subclass of Toplevel. * pythongh-48496: Added example and link to faq for UnboundLocalError in reference (python#93068) * Fix typo in 3.12 What's New (python#100449) * pythongh-76963: PEP3118 itemsize of an empty ctypes array should not be 0 (pythonGH-5576) The itemsize returned in a memoryview of a ctypes array is now computed from the item type, instead of dividing the total size by the length and assuming that the length is not zero. * pythonGH-100459: fix copy-paste errors in specialization stats (pythonGH-100460) * pythongh-99110: Initialize `frame->previous` in init_frame to fix segmentation fault when accessing `frame.f_back` (python#100182) * pythongh-98712: Clarify "readonly bytes-like object" semantics in C arg-parsing docs (python#98710) * pythongh-92216: improve performance of `hasattr` for type objects (pythonGH-99979) * pythongh-100288: Specialise LOAD_ATTR_METHOD for managed dictionaries (pythonGH-100289) * Revert "pythongh-100288: Specialise LOAD_ATTR_METHOD for managed dictionaries (pythonGH-100289)" (python#100468) This reverts commit c3c7848. * pythongh-94155: Reduce hash collisions for code objects (python#100183) * Uses a better hashing algorithm to get better dispersion and remove commutativity. * Incorporates `co_firstlineno`, `Py_SIZE(co)`, and bytecode instructions. * This is now the entire set of criteria used in `code_richcompare`, except for `_PyCode_ConstantKey` (which would incorporate the types of `co_consts` rather than just their values). * pythongh-83076: 3.8x speed improvement in (Async)Mock instantiation (python#100252) * pythongh-99482: remove `jython` compatibility parts from stdlib and tests (python#99484) * bpo-40447: accept all path-like objects in compileall.compile_file (python#19883) Signed-off-by: Filipe Laíns <[email protected]> Signed-off-by: Filipe Laíns <[email protected]> Co-authored-by: Irit Katriel <[email protected]> Co-authored-by: Shantanu <[email protected]> * pythonGH-100425: Improve accuracy of builtin sum() for float inputs (pythonGH-100426) * pythongh-68320, pythongh-88302 - Allow for private `pathlib.Path` subclassing (pythonGH-31691) Users may wish to define subclasses of `pathlib.Path` to add or modify existing methods. Before this change, attempting to instantiate a subclass raised an exception like: AttributeError: type object 'PPath' has no attribute '_flavour' Previously the `_flavour` attribute was assigned as follows: PurePath._flavour = xxx not set!! xxx PurePosixPath._flavour = _PosixFlavour() PureWindowsPath._flavour = _WindowsFlavour() This change replaces it with a `_pathmod` attribute, set as follows: PurePath._pathmod = os.path PurePosixPath._pathmod = posixpath PureWindowsPath._pathmod = ntpath Functionality from `_PosixFlavour` and `_WindowsFlavour` is moved into `PurePath` as underscored-prefixed classmethods. Flavours are removed. Co-authored-by: Alex Waygood <[email protected]> Co-authored-by: Brett Cannon <[email protected]> Co-authored-by: Adam Turner <[email protected]> Co-authored-by: Eryk Sun <[email protected]> * pythongh-99947: Ensure unreported errors are chained for SystemError during import (pythonGH-99946) * Add "strict" to dotproduct(). Add docstring. Factor-out common code. (pythonGH-100480) * pythongh-94808: improve test coverage of number formatting (python#99472) * pythongh-100454: Start running SSL tests with OpenSSL 3.1.0-beta1 (python#100456) * pythongh-100268: Add is_integer method to int (python#100439) This improves the lives of type annotation users of `float` - which type checkers implicitly treat as `int|float` because that is what most code actually wants. Before this change a `.is_integer()` method could not be assumed to exist on things annotated as `: float` due to the method not existing on both types. * pythongh-77771: Add enterabs example in sched (python#92716) Co-authored-by: Shantanu <[email protected]> * pythonGH-91166: Implement zero copy writes for `SelectorSocketTransport` in asyncio (python#31871) Co-authored-by: Guido van Rossum <[email protected]> * pythonGH-91166: Implement zero copy writes for `SelectorSocketTransport` in asyncio (python#31871) Co-authored-by: Guido van Rossum <[email protected]> * Misc Itertools recipe tweaks (pythonGH-100493) * pythongh-100357: Convert several functions in `bltinsmodule` to AC (python#100358) * Remove wrong comment about `repr` in `test_unicode` (python#100495) * pythongh-99908: Tutorial: Modernize the 'data-record class' example (python#100499) Co-authored-by: Alex Waygood <[email protected]> * pythongh-100474: Fix handling of dirs named index.html in http.server (pythonGH-100475) If you had a directory called index.html or index.htm within a directory, it would cause http.server to return a 404 Not Found error instead of the directory listing. This came about due to not checking that the index was a regular file. I have also added a test case for this situation. Automerge-Triggered-By: GH:merwok * pythongh-100287: Fix unittest.mock.seal with AsyncMock (python#100496) * pythongh-99535: Add test for inheritance of annotations and update documentation (python#99990) * pythongh-100428: Make float documentation more accurate (python#100437) Previously, the grammar did not accept `float("10")`. Also implement mdickinson's suggestion of removing the indirection. * [Minor PR] Quotes in documentation changed into code blocks (python#99536) Minor formatting fix in documentation Co-authored-by: Shantanu <[email protected]> * pythongh-100472: Fix docs claim that compileall parameters could be bytes (python#100473) * pythongh-100519: simplification to `eff_request_host` in cookiejar.py (python#99588) `IPV4_RE` includes a `.`, and the `.find(".") == -1` included here is already testing to make sure there's no dot, so this part of the expression is tautological. Instead use more modern `in` syntax to make it clear what the check is doing here. The simplified implementation more clearly matches the wording in RFC 2965. Co-authored-by: hauntsaninja <[email protected]> * pythongh-99308: Clarify re docs for byte pattern group names (python#99311) * pythongh-92446: Improve argparse choices docs; revert bad change to lzma docs (python#94627) Based on the definition of the collections.abc classes, it is more accurate to use "sequence" instead of "container" when describing argparse choices. A previous attempt at fixing this in python#92450 was mistaken; this PR reverts that change. Co-authored-by: Shantanu <[email protected]> * Fix name of removed `inspect.Signature.from_builtin` method in 3.11.0a2 changelog (python#100525) * pythongh-100520: Fix `rst` markup in `configparser` docstrings (python#100524) * pythongh-99509: Add `__class_getitem__` to `multiprocessing.queues.Queue` (python#99511) * pythongh-94603: micro optimize list.pop (pythongh-94604) * Remove `NoneType` redefinition from `clinic.py` (python#100551) * pythongh-100553: Improve accuracy of sqlite3.Row iter test (python#100555) * pythonGH-98831: Modernize a ton of simpler instructions (python#100545) * load_const and load_fast aren't families for now * Don't decref unmoved names * Modernize GET_ANEXT * Modernize GET_AWAITABLE * Modernize ASYNC_GEN_WRAP * Modernize YIELD_VALUE * Modernize POP_EXCEPT (in more than one way) * Modernize PREP_RERAISE_STAR * Modernize LOAD_ASSERTION_ERROR * Modernize LOAD_BUILD_CLASS * Modernize STORE_NAME * Modernize LOAD_NAME * Modernize LOAD_CLASSDEREF * Modernize LOAD_DEREF * Modernize STORE_DEREF * Modernize COPY_FREE_VARS (mark it as done) * Modernize LIST_TO_TUPLE * Modernize LIST_EXTEND * Modernize SET_UPDATE * Modernize SETUP_ANNOTATIONS * Modernize DICT_UPDATE * Modernize DICT_MERGE * Modernize MAP_ADD * Modernize IS_OP * Modernize CONTAINS_OP * Modernize CHECK_EXC_MATCH * Modernize IMPORT_NAME * Modernize IMPORT_STAR * Modernize IMPORT_FROM * Modernize JUMP_FORWARD (mark it as done) * Modernize JUMP_BACKWARD (mark it as done) Signed-off-by: Filipe Laíns <[email protected]> Signed-off-by: Filipe Laíns <[email protected]> Co-authored-by: Jeremy Paige <[email protected]> Co-authored-by: Carlton Gibson <[email protected]> Co-authored-by: Hugo van Kemenade <[email protected]> Co-authored-by: Jon Burdo <[email protected]> Co-authored-by: Stanley <[email protected]> Co-authored-by: Jelle Zijlstra <[email protected]> Co-authored-by: Thomas Grainger <[email protected]> Co-authored-by: Brad Wolfe <[email protected]> Co-authored-by: Richard Kojedzinszky <[email protected]> Co-authored-by: František Nesveda <[email protected]> Co-authored-by: Pablo Galindo Salgado <[email protected]> Co-authored-by: Nikita Sobolev <[email protected]> Co-authored-by: Łukasz Langa <[email protected]> Co-authored-by: Dennis Sweeney <[email protected]> Co-authored-by: Bisola Olasehinde <[email protected]> Co-authored-by: C.A.M. Gerlach <[email protected]> Co-authored-by: Pieter Eendebak <[email protected]> Co-authored-by: Shantanu <[email protected]> Co-authored-by: Kumar Aditya <[email protected]> Co-authored-by: Dominic Socular <[email protected]> Co-authored-by: Serhiy Storchaka <[email protected]> Co-authored-by: Hai Shi <[email protected]> Co-authored-by: amaajemyfren <[email protected]> Co-authored-by: Brandt Bucher <[email protected]> Co-authored-by: david-why <[email protected]> Co-authored-by: Pieter Eendebak <[email protected]> Co-authored-by: penguin_wwy <[email protected]> Co-authored-by: Eli Schwartz <[email protected]> Co-authored-by: Itamar Ostricher <[email protected]> Co-authored-by: Alex Waygood <[email protected]> Co-authored-by: Eric Wieser <[email protected]> Co-authored-by: Irit Katriel <[email protected]> Co-authored-by: Bill Fisher <[email protected]> Co-authored-by: Petr Viktorin <[email protected]> Co-authored-by: Ken Jin <[email protected]> Co-authored-by: Carl Meyer <[email protected]> Co-authored-by: Filipe Laíns <[email protected]> Co-authored-by: Raymond Hettinger <[email protected]> Co-authored-by: Barney Gale <[email protected]> Co-authored-by: Brett Cannon <[email protected]> Co-authored-by: Adam Turner <[email protected]> Co-authored-by: Eryk Sun <[email protected]> Co-authored-by: Sebastian Berg <[email protected]> Co-authored-by: Illia Volochii <[email protected]> Co-authored-by: JosephSBoyle <[email protected]> Co-authored-by: James Frost <[email protected]> Co-authored-by: MonadChains <[email protected]> Co-authored-by: Bart Broere <[email protected]> Co-authored-by: Glyph <[email protected]> Co-authored-by: hauntsaninja <[email protected]> Co-authored-by: Ilya Kulakov <[email protected]> Co-authored-by: Guy Yagev <[email protected]> Co-authored-by: Jakub Kuczys <[email protected]>
1 parent 1ee1006 commit fdc73cb

File tree

160 files changed

+2564
-1744
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

160 files changed

+2564
-1744
lines changed

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ jobs:
235235
strategy:
236236
fail-fast: false
237237
matrix:
238-
openssl_ver: [1.1.1s, 3.0.7]
238+
openssl_ver: [1.1.1s, 3.0.7, 3.1.0-beta1]
239239
env:
240240
OPENSSL_VER: ${{ matrix.openssl_ver }}
241241
MULTISSL_DIR: ${{ github.workspace }}/multissl

.github/workflows/doc.yml

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,8 @@ jobs:
5050
run: make -C Doc/ venv
5151
- name: 'Check documentation'
5252
run: make -C Doc/ check
53-
- name: 'Upload NEWS'
54-
uses: actions/upload-artifact@v3
55-
with:
56-
name: NEWS
57-
path: Doc/build/NEWS
5853
- name: 'Build HTML documentation'
5954
run: make -C Doc/ SPHINXOPTS="-q" SPHINXERRORHANDLING="-W --keep-going" html
60-
- name: 'Upload docs'
61-
uses: actions/upload-artifact@v3
62-
with:
63-
name: doc-html
64-
path: Doc/build/html
6555

6656
# Run "doctest" on HEAD as new syntax doesn't exist in the latest stable release
6757
doctest:

Doc/c-api/arg.rst

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,24 +34,39 @@ These formats allow accessing an object as a contiguous chunk of memory.
3434
You don't have to provide raw storage for the returned unicode or bytes
3535
area.
3636

37-
In general, when a format sets a pointer to a buffer, the buffer is
38-
managed by the corresponding Python object, and the buffer shares
39-
the lifetime of this object. You won't have to release any memory yourself.
40-
The only exceptions are ``es``, ``es#``, ``et`` and ``et#``.
41-
42-
However, when a :c:type:`Py_buffer` structure gets filled, the underlying
43-
buffer is locked so that the caller can subsequently use the buffer even
44-
inside a :c:type:`Py_BEGIN_ALLOW_THREADS` block without the risk of mutable data
45-
being resized or destroyed. As a result, **you have to call**
46-
:c:func:`PyBuffer_Release` after you have finished processing the data (or
47-
in any early abort case).
48-
4937
Unless otherwise stated, buffers are not NUL-terminated.
5038

51-
Some formats require a read-only :term:`bytes-like object`, and set a
52-
pointer instead of a buffer structure. They work by checking that
53-
the object's :c:member:`PyBufferProcs.bf_releasebuffer` field is ``NULL``,
54-
which disallows mutable objects such as :class:`bytearray`.
39+
There are three ways strings and buffers can be converted to C:
40+
41+
* Formats such as ``y*`` and ``s*`` fill a :c:type:`Py_buffer` structure.
42+
This locks the underlying buffer so that the caller can subsequently use
43+
the buffer even inside a :c:type:`Py_BEGIN_ALLOW_THREADS`
44+
block without the risk of mutable data being resized or destroyed.
45+
As a result, **you have to call** :c:func:`PyBuffer_Release` after you have
46+
finished processing the data (or in any early abort case).
47+
48+
* The ``es``, ``es#``, ``et`` and ``et#`` formats allocate the result buffer.
49+
**You have to call** :c:func:`PyMem_Free` after you have finished
50+
processing the data (or in any early abort case).
51+
52+
* .. _c-arg-borrowed-buffer:
53+
54+
Other formats take a :class:`str` or a read-only :term:`bytes-like object`,
55+
such as :class:`bytes`, and provide a ``const char *`` pointer to
56+
its buffer.
57+
In this case the buffer is "borrowed": it is managed by the corresponding
58+
Python object, and shares the lifetime of this object.
59+
You won't have to release any memory yourself.
60+
61+
To ensure that the underlying buffer may be safely borrowed, the object's
62+
:c:member:`PyBufferProcs.bf_releasebuffer` field must be ``NULL``.
63+
This disallows common mutable objects such as :class:`bytearray`,
64+
but also some read-only objects such as :class:`memoryview` of
65+
:class:`bytes`.
66+
67+
Besides this ``bf_releasebuffer`` requirement, there is no check to verify
68+
whether the input object is immutable (e.g. whether it would honor a request
69+
for a writable buffer, or whether another thread can mutate the data).
5570

5671
.. note::
5772

@@ -89,7 +104,7 @@ which disallows mutable objects such as :class:`bytearray`.
89104
Unicode objects are converted to C strings using ``'utf-8'`` encoding.
90105

91106
``s#`` (:class:`str`, read-only :term:`bytes-like object`) [const char \*, :c:type:`Py_ssize_t`]
92-
Like ``s*``, except that it doesn't accept mutable objects.
107+
Like ``s*``, except that it provides a :ref:`borrowed buffer <c-arg-borrowed-buffer>`.
93108
The result is stored into two C variables,
94109
the first one a pointer to a C string, the second one its length.
95110
The string may contain embedded null bytes. Unicode objects are converted
@@ -108,8 +123,9 @@ which disallows mutable objects such as :class:`bytearray`.
108123
pointer is set to ``NULL``.
109124

110125
``y`` (read-only :term:`bytes-like object`) [const char \*]
111-
This format converts a bytes-like object to a C pointer to a character
112-
string; it does not accept Unicode objects. The bytes buffer must not
126+
This format converts a bytes-like object to a C pointer to a
127+
:ref:`borrowed <c-arg-borrowed-buffer>` character string;
128+
it does not accept Unicode objects. The bytes buffer must not
113129
contain embedded null bytes; if it does, a :exc:`ValueError`
114130
exception is raised.
115131

Doc/faq/programming.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ Yes. The coding style required for standard library modules is documented as
113113
Core Language
114114
=============
115115

116+
.. _faq-unboundlocalerror:
117+
116118
Why am I getting an UnboundLocalError when the variable has a value?
117119
--------------------------------------------------------------------
118120

Doc/howto/annotations.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ Accessing The Annotations Dict Of An Object In Python 3.10 And Newer
5757
newer is to call :func:`getattr` with three arguments,
5858
for example ``getattr(o, '__annotations__', None)``.
5959

60+
Before Python 3.10, accessing ``__annotations__`` on a class that
61+
defines no annotations but that has a parent class with
62+
annotations would return the parent's ``__annotations__``.
63+
In Python 3.10 and newer, the child class's annotations
64+
will be an empty dict instead.
65+
6066

6167
Accessing The Annotations Dict Of An Object In Python 3.9 And Older
6268
===================================================================

Doc/library/argparse.rst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ The add_argument() method
765765

766766
* type_ - The type to which the command-line argument should be converted.
767767

768-
* choices_ - A container of the allowable values for the argument.
768+
* choices_ - A sequence of the allowable values for the argument.
769769

770770
* required_ - Whether or not the command-line option may be omitted
771771
(optionals only).
@@ -1209,7 +1209,7 @@ choices
12091209
^^^^^^^
12101210

12111211
Some command-line arguments should be selected from a restricted set of values.
1212-
These can be handled by passing a container object as the *choices* keyword
1212+
These can be handled by passing a sequence object as the *choices* keyword
12131213
argument to :meth:`~ArgumentParser.add_argument`. When the command line is
12141214
parsed, argument values will be checked, and an error message will be displayed
12151215
if the argument was not one of the acceptable values::
@@ -1223,9 +1223,9 @@ if the argument was not one of the acceptable values::
12231223
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
12241224
'paper', 'scissors')
12251225

1226-
Note that inclusion in the *choices* container is checked after any type_
1226+
Note that inclusion in the *choices* sequence is checked after any type_
12271227
conversions have been performed, so the type of the objects in the *choices*
1228-
container should match the type_ specified::
1228+
sequence should match the type_ specified::
12291229

12301230
>>> parser = argparse.ArgumentParser(prog='doors.py')
12311231
>>> parser.add_argument('door', type=int, choices=range(1, 4))
@@ -1235,8 +1235,8 @@ container should match the type_ specified::
12351235
usage: doors.py [-h] {1,2,3}
12361236
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)
12371237

1238-
Any container can be passed as the *choices* value, so :class:`list` objects,
1239-
:class:`set` objects, and custom containers are all supported.
1238+
Any sequence can be passed as the *choices* value, so :class:`list` objects,
1239+
:class:`tuple` objects, and custom sequences are all supported.
12401240

12411241
Use of :class:`enum.Enum` is not recommended because it is difficult to
12421242
control its appearance in usage, help, and error messages.

Doc/library/compileall.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ Public functions
199199

200200
The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to
201201
the ``-s``, ``-p`` and ``-e`` options described above.
202-
They may be specified as ``str``, ``bytes`` or :py:class:`os.PathLike`.
202+
They may be specified as ``str`` or :py:class:`os.PathLike`.
203203

204204
If *hardlink_dupes* is true and two ``.pyc`` files with different optimization
205205
level have the same content, use hard links to consolidate duplicate files.
@@ -269,7 +269,7 @@ Public functions
269269

270270
The *stripdir*, *prependdir* and *limit_sl_dest* arguments correspond to
271271
the ``-s``, ``-p`` and ``-e`` options described above.
272-
They may be specified as ``str``, ``bytes`` or :py:class:`os.PathLike`.
272+
They may be specified as ``str`` or :py:class:`os.PathLike`.
273273

274274
If *hardlink_dupes* is true and two ``.pyc`` files with different optimization
275275
level have the same content, use hard links to consolidate duplicate files.

Doc/library/contextvars.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@ Manual Context Management
144144
To get a copy of the current context use the
145145
:func:`~contextvars.copy_context` function.
146146

147+
Every thread will have a different top-level :class:`~contextvars.Context`
148+
object. This means that a :class:`ContextVar` object behaves in a similar
149+
fashion to :func:`threading.local()` when values are assigned in different
150+
threads.
151+
147152
Context implements the :class:`collections.abc.Mapping` interface.
148153

149154
.. method:: run(callable, *args, **kwargs)

Doc/library/functions.rst

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -650,20 +650,23 @@ are always available. They are listed here in alphabetical order.
650650
sign may be ``'+'`` or ``'-'``; a ``'+'`` sign has no effect on the value
651651
produced. The argument may also be a string representing a NaN
652652
(not-a-number), or positive or negative infinity. More precisely, the
653-
input must conform to the following grammar after leading and trailing
654-
whitespace characters are removed:
653+
input must conform to the ``floatvalue`` production rule in the following
654+
grammar, after leading and trailing whitespace characters are removed:
655655

656656
.. productionlist:: float
657657
sign: "+" | "-"
658658
infinity: "Infinity" | "inf"
659659
nan: "nan"
660-
numeric_value: `floatnumber` | `infinity` | `nan`
661-
numeric_string: [`sign`] `numeric_value`
660+
digitpart: `digit` (["_"] `digit`)*
661+
number: [`digitpart`] "." `digitpart` | `digitpart` ["."]
662+
exponent: ("e" | "E") ["+" | "-"] `digitpart`
663+
floatnumber: number [`exponent`]
664+
floatvalue: [`sign`] (`floatnumber` | `infinity` | `nan`)
662665

663-
Here ``floatnumber`` is the form of a Python floating-point literal,
664-
described in :ref:`floating`. Case is not significant, so, for example,
665-
"inf", "Inf", "INFINITY", and "iNfINity" are all acceptable spellings for
666-
positive infinity.
666+
Here ``digit`` is a Unicode decimal digit (character in the Unicode general
667+
category ``Nd``). Case is not significant, so, for example, "inf", "Inf",
668+
"INFINITY", and "iNfINity" are all acceptable spellings for positive
669+
infinity.
667670

668671
Otherwise, if the argument is an integer or a floating point number, a
669672
floating point number with the same value (within Python's floating point
@@ -1733,6 +1736,10 @@ are always available. They are listed here in alphabetical order.
17331736
.. versionchanged:: 3.8
17341737
The *start* parameter can be specified as a keyword argument.
17351738

1739+
.. versionchanged:: 3.12 Summation of floats switched to an algorithm
1740+
that gives higher accuracy on most builds.
1741+
1742+
17361743
.. class:: super()
17371744
super(type, object_or_type=None)
17381745

Doc/library/imaplib.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ IMAP4 Objects
187187
-------------
188188

189189
All IMAP4rev1 commands are represented by methods of the same name, either
190-
upper-case or lower-case.
190+
uppercase or lowercase.
191191

192192
All arguments to commands are converted to strings, except for ``AUTHENTICATE``,
193193
and the last argument to ``APPEND`` which is passed as an IMAP4 literal. If

Doc/library/inspect.rst

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,15 +343,36 @@ attributes (see :ref:`import-mod-attrs` for module attributes):
343343

344344
.. function:: iscoroutinefunction(object)
345345

346-
Return ``True`` if the object is a :term:`coroutine function`
347-
(a function defined with an :keyword:`async def` syntax).
346+
Return ``True`` if the object is a :term:`coroutine function` (a function
347+
defined with an :keyword:`async def` syntax), a :func:`functools.partial`
348+
wrapping a :term:`coroutine function`, or a sync function marked with
349+
:func:`markcoroutinefunction`.
348350

349351
.. versionadded:: 3.5
350352

351353
.. versionchanged:: 3.8
352354
Functions wrapped in :func:`functools.partial` now return ``True`` if the
353355
wrapped function is a :term:`coroutine function`.
354356

357+
.. versionchanged:: 3.12
358+
Sync functions marked with :func:`markcoroutinefunction` now return
359+
``True``.
360+
361+
362+
.. function:: markcoroutinefunction(func)
363+
364+
Decorator to mark a callable as a :term:`coroutine function` if it would not
365+
otherwise be detected by :func:`iscoroutinefunction`.
366+
367+
This may be of use for sync functions that return a :term:`coroutine`, if
368+
the function is passed to an API that requires :func:`iscoroutinefunction`.
369+
370+
When possible, using an :keyword:`async def` function is preferred. Also
371+
acceptable is calling the function and testing the return with
372+
:func:`iscoroutine`.
373+
374+
.. versionadded:: 3.12
375+
355376

356377
.. function:: iscoroutine(object)
357378

Doc/library/itertools.rst

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,11 @@ which incur interpreter overhead.
788788

789789
.. testcode::
790790

791+
import collections
792+
import math
793+
import operator
794+
import random
795+
791796
def take(n, iterable):
792797
"Return first n items of the iterable as a list"
793798
return list(islice(iterable, n))
@@ -834,7 +839,8 @@ which incur interpreter overhead.
834839
return chain.from_iterable(repeat(tuple(iterable), n))
835840

836841
def dotproduct(vec1, vec2):
837-
return sum(map(operator.mul, vec1, vec2))
842+
"Compute a sum of products."
843+
return sum(starmap(operator.mul, zip(vec1, vec2, strict=True)))
838844

839845
def convolve(signal, kernel):
840846
# See: https://betterexplained.com/articles/intuitive-convolution/
@@ -846,7 +852,7 @@ which incur interpreter overhead.
846852
window = collections.deque([0], maxlen=n) * n
847853
for x in chain(signal, repeat(0, n-1)):
848854
window.append(x)
849-
yield sum(map(operator.mul, kernel, window))
855+
yield dotproduct(kernel, window)
850856

851857
def polynomial_from_roots(roots):
852858
"""Compute a polynomial's coefficients from its roots.
@@ -891,6 +897,21 @@ which incur interpreter overhead.
891897
data[2] = 1
892898
return iter_index(data, 1) if n > 2 else iter([])
893899

900+
def factor(n):
901+
"Prime factors of n."
902+
# factor(97) --> 97
903+
# factor(98) --> 2 7 7
904+
# factor(99) --> 3 3 11
905+
for prime in sieve(n+1):
906+
while True:
907+
quotient, remainder = divmod(n, prime)
908+
if remainder:
909+
break
910+
yield prime
911+
n = quotient
912+
if n == 1:
913+
return
914+
894915
def flatten(list_of_lists):
895916
"Flatten one level of nesting"
896917
return chain.from_iterable(list_of_lists)
@@ -1133,11 +1154,6 @@ which incur interpreter overhead.
11331154

11341155
Now, we test all of the itertool recipes
11351156

1136-
>>> import operator
1137-
>>> import collections
1138-
>>> import math
1139-
>>> import random
1140-
11411157
>>> take(10, count())
11421158
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
11431159

@@ -1250,6 +1266,35 @@ which incur interpreter overhead.
12501266
>>> set(sieve(10_000)).isdisjoint(carmichael)
12511267
True
12521268

1269+
list(factor(0))
1270+
[]
1271+
list(factor(1))
1272+
[]
1273+
list(factor(2))
1274+
[2]
1275+
list(factor(3))
1276+
[3]
1277+
list(factor(4))
1278+
[2, 2]
1279+
list(factor(5))
1280+
[5]
1281+
list(factor(6))
1282+
[2, 3]
1283+
list(factor(7))
1284+
[7]
1285+
list(factor(8))
1286+
[2, 2, 2]
1287+
list(factor(9))
1288+
[3, 3]
1289+
list(factor(10))
1290+
[2, 5]
1291+
all(math.prod(factor(n)) == n for n in range(1, 1000))
1292+
True
1293+
all(set(factor(n)) <= set(sieve(n+1)) for n in range(1, 1000))
1294+
True
1295+
all(list(factor(n)) == sorted(factor(n)) for n in range(1, 1000))
1296+
True
1297+
12531298
>>> list(flatten([('a', 'b'), (), ('c', 'd', 'e'), ('f',), ('g', 'h', 'i')]))
12541299
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
12551300

Doc/library/lzma.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ Compressing and decompressing data in memory
147147
This format is more limited than ``.xz`` -- it does not support integrity
148148
checks or multiple filters.
149149

150-
* :const:`FORMAT_RAW`: A raw data stream, not using sequences format.
150+
* :const:`FORMAT_RAW`: A raw data stream, not using any container format.
151151
This format specifier does not support integrity checks, and requires that
152152
you always specify a custom filter chain (for both compression and
153153
decompression). Additionally, data compressed in this manner cannot be

0 commit comments

Comments
 (0)