Update copyright years to 2024. by 0xSalikh · Pull Request #113608 · python/cpython (original) (raw)


Co-authored-by: Sam Gross colesbury@gmail.com

This ensures the source directory is not modified at build time, and different builds (e.g. different versions or GIL vs no-GIL) do not have conflicts.

Co-authored-by: Hugo van Kemenade hugovk@users.noreply.github.com

In cmd.Cmd.do_help call inspect.cleandoc(), to clean indentation and remove leading/trailing empty lines from a dosctring before printing.

Use os.DirEntry.path as the string representation of child paths, unless the parent path is empty, in which case we use the entry name.

Mimalloc segments are data structures that contain memory allocations along with metadata. Each segment is "owned" by a thread. When a thread exits, it abandons its segments to a global pool to be later reclaimed by other threads. This changes the pool to be per-interpreter instead of process-wide.

This will be important for when we use mimalloc to find GC objects in the --disable-gil builds. We want heaps to only store Python objects from a single interpreter. Absent this change, the abandoning and reclaiming process could break this isolation.

Co-authored-by: Alex Waygood Alex.Waygood@Gmail.com Co-authored-by: Hugo van Kemenade hugovk@users.noreply.github.com

Co-authored-by: Xavier de Gaye xdegaye@gmail.com

Co-authored-by: Alex Waygood Alex.Waygood@Gmail.com

Mimalloc pages are data structures that contain contiguous allocations of the same block size. Note that they are distinct from operating system pages. Mimalloc pages are contained in segments.

When a thread exits, it abandons any segments and contained pages that have live allocations. These segments and pages may be later reclaimed by another thread. To support GC and certain thread-safety guarantees in free-threaded builds, we want pages to only be reclaimed by the corresponding heap in the claimant thread. For example, we want pages containing GC objects to only be claimed by GC heaps.

This allows heaps and pages to be tagged with an integer tag that is used to ensure that abandoned pages are only claimed by heaps with the same tag. Heaps can be initialized with a tag (0-15); any page allocated by that heap copies the corresponding tag.

This splits part of Modules/gcmodule.c of into Python/gc.c, which now contains the core garbage collection implementation. The Python module remain in the Modules/gcmodule.c file.

Raise auditing events in pathlib.Path.glob(), rglob() and walk(), but not in pathlib._abc.PathBase methods. Also move generation of a deprecation warning into pathlib.Path so it gets the right stack level.

Explicitly open and close files instead of using FileType.

It can only be a dict since Python 2.4.

gh-113750: Fix object resurrection on free-threaded builds

This avoids the undesired re-initializing of fields like ob_gc_bits, ob_mutex, and ob_tid when an object is resurrected due to its finalizer being called.

This change has no effect on the default (with GIL) build.

Co-authored-by: Terry Jan Reedy tjreedy@udel.edu

Add support for loading XML plists from a string value instead of a only bytes value.

The DummyPurePath and DummyPath test classes are simple subclasses of PurePathBase and PathBase. This commit adds __repr__() methods to the dummy classes, which makes debugging test failures less painful.

Split test cases for invalid names into dedicated test methods. This will make it easier to refactor tests for invalid name handling in ABCs later.

No change of coverage, just a change of test suite organisation.

Slightly improve pathlib.Path.glob() tests for symlink loop handling

When filtering results, ignore paths with more than one linkD/ segment, rather than all paths below the first linkD/ segment. This allows us to test that other paths under linkD/ are correctly returned.

Replace usage of _from_parsed_parts() with with_segments() in with_name(), and take a similar approach in name for consistency's sake.

Replace use of _from_parsed_parts() with with_segments(), and move assignments to _drv, _root, _tail_cachedand_strslots intoPurePath`.

Replace use of _from_parsed_parts() with with_segments() in PurePathBase.relative_to(), and move the assignment of _drv, _root and _tail_cached slots into PurePath.relative_to().

Remove LibreSSL specific workaround ifdefs from _ssl.c and delete the non-version-specific _ssl_data.h file (relevant for OpenSSL < 1.1.1, which we no longer support per PEP 644).

Co-authored-by: Christian Heimes christian@python.org Co-authored-by: Gregory P. Smith greg@krypto.org

Allow extraction (no-op) of a "/" folder in a zipfile, they are commonly added by some archive creation tools.

Co-authored-by: Erlend E. Aasland erlend@python.org Co-authored-by: Gregory P. Smith greg@krypto.org

It can be used to set the location of a .python_history file


Co-authored-by: Levi Sabah 0xl3vi@gmail.com Co-authored-by: Hugo van Kemenade hugovk@users.noreply.github.com

Co-authored-by: Serhiy Storchaka storchaka@gmail.com

io.TextIOWrapper was dropping the internal decoding buffer during read() and write() calls.

Ensure the character y is disallowed within an Ascii85 5-tuple.

Co-authored-by: Lee Cannon leecannon@leecannon.xyz

After #53875: PyObject_HasAttr is not an equivalent of hasattr. PyObject_HasAttrWithError is; it already has the note.

Fix refleaks and a typo.

Adapt the following functions to Argument Clinic:

PurePathBase does not define __eq__(), and so we have no business checking path equality in test_eq_common and test_equivalences. The tests only pass at the moment because we define the test class's __eq__() for use elsewhere.

Also move test_parse_path_common into the main pathlib test suite. It exercises a private _parse_path() method that will be moved to PurePath soon.

Lastly move a couple more tests concerned with optimisations and path normalisation.

(the gcmodule -> gc refactoring broke it)

Also fix a race condition in asyncio.Semaphore.acquire() when cancelled.

Determine the support of the Kyiv timezone by checking the result of astimezone() which uses the system tz database and not the one populated by zoneinfo.

Avoid line break in command as this causes displaying issues on GH.

Co-authored-by: Adam Turner 9087854+aa-turner@users.noreply.github.com Co-authored-by: Sergey B Kirpichev skirpichev@gmail.com

Co-authored-by: Alex Waygood Alex.Waygood@Gmail.com Co-authored-by: Pieter Eendebak pieter.eendebak@gmail.com Co-authored-by: Erlend E. Aasland erlend.aasland@protonmail.com

Test the following features for _ctypes types:

The following _ctypes types are tested:

Co-authored-by: Erlend E. Aasland erlend.aasland@protonmail.com

Fix a few places where the lltrace debug output printed (null) instead of an opcode name, because it was calling _PyUOpName() on a Tier-1 opcode.

Call straight through to joinpath() in PathBase._make_child_relpath(). Move optimised/caching code to pathlib.Path._make_child_relpath()

The tracemalloc module can already be cleared.

The intention of exiting 5 was to detect issues where the test suite wasn't discovered at all. If we skipped tests, it was correctly discovered.

Replace use of _from_parsed_parts() with with_segments() in resolve().

No effect on Path.resolve(), which uses os.path.realpath().

Use the object's actual class name in the following _io type's repr:

Implement parts using _stack, which itself calls pathmod.split() repeatedly. This avoids use of _tail, which will be moved to PurePath shortly.

Restore full battle-tested implementations of PurePath.[is_]relative_to(). These were recently split up in 3375dfe and a15a773.

In PurePathBase, add entirely new implementations based on _stack, which itself calls pathmod.split() repeatedly to disassemble a path. These new implementations preserve features like trailing slashes where possible, while still observing that a .. segment cannot be added to traverse an empty or . segment in walk_up mode. They do not rely on parents nor __eq__(), nor do they spin up temporary path objects.

Unfortunately calling pathmod.relpath() isn't an option, as it calls abspath() and in turn os.getcwd(), which is impure.

Apply pathlib's normalization and performance tuning in pathlib.PurePath, but not pathlib._abc.PurePathBase.

With this change, the pathlib ABCs do not normalize away alternate path separators, empty segments, or dot segments. A single string given to the initialiser will round-trip by default, i.e. str(PurePathBase(my_string)) == my_string. Implementors can set their own path domain-specific normalization scheme by overriding __str__()

Eliminating path normalization makes maintaining and caching the path's parts and string representation both optional and not very useful, so this commit moves the _drv, _root, _tail_cached and _str slots from PurePathBase to PurePath. Only _raw_paths and _resolving slots remain in PurePathBase. This frees the ABCs from the burden of some of pathlib's hardest-to-understand code.

Refuse to guess what a user means when they initialise a pathlib ABC without any positional arguments. In mainline pathlib it's normalised to ., but in the ABCs this guess isn't appropriate; for example, the path type may not represent the current directory as ., or may have no concept of a "current directory" at all.

When an StopIteration raises into asyncio.Future, this will cause a thread to hang. This commit address this by not raising an exception and silently transforming the StopIteration with a RuntimeError, which the caller can reconstruct from fut.exception().__cause__

winfo_id() converts the result of "winfo id" command to integer, but "winfo pathname" command requires an argument to be a hexadecimal number on Win64.

If other exception was raised during exiting an expired asyncio.timeout() block, insert TimeoutError in the exception context just above the CancelledError.

Based on patch by SilentGhost.

It occurred when try to re-encode an unknown-8bit part combined with non-unknown-8bit part.

Use cursive to make it looking like mathematic formulas.

Open and close files manually. It prevents from leaking files, preliminary creation of output files, and accidental closing of stdin and stdout.

Previously the C implementation of pickle.Pickler and pickle.Unpickler classes did not have such methods and they could only be used if they were overloaded in subclasses or set as instance attributes.

Fixed calling super().persistent_id() and super().persistent_load() in subclasses of the C implementation of pickle.Pickler and pickle.Unpickler classes. It no longer causes an infinite recursion.

Guarantee that it either open an existing ".mh_sequences" file or create a new ".mh_sequences" file, but do not replace existing ".mh_sequences" file.

Raise BadZipFile when try to read an entry that overlaps with other entry or central directory.

Add a fast-path for the common case.

Benchmark:

python -m pyperf timeit \
    -s 'import math; gcd=math.gcd; x=2*3; y=3*5' \
    'gcd(x,y)'

Result: 1.07x faster (-3.4 ns)

Mean +- std dev: 52.6 ns +- 4.0 ns -> 49.2 ns +- 0.4 ns: 1.07x faster

Co-authored-by: Hugo van Kemenade 1324225+hugovk@users.noreply.github.com

On Windows, set _O_NOINHERIT flag on file descriptors created by os.pipe() and io.WindowsConsoleIO.

Add test_pipe_spawnl() to test_os.

Co-authored-by: Zackery Spytz zspytz@gmail.com


Co-authored-by: Steve Dower steve.dower@microsoft.com

Fix DeprecationWarning in test___ne__().

Co-authored-by: Nikita Sobolev mail@sobolevn.me

Co-authored-by: Erlend E. Aasland erlend@python.org

Remove .cirrus.yml which was already disabled by being renamed to .cirrus-DISABLED.yml. In total, Cirrus CI only run for less than one month.

Co-authored-by: Erlend E. Aasland erlend@python.org

test_configdialog.HighPageTest.test_highlight_target_text_mouse fails if a line of the Highlight tab text sample is not visible. If so, bbox() in click_char() returns None and the unpacking iteration fails.

This occurred on a Devuan Linux system. Fix by moving the 'see character' call inside click_char, just before the bbox call.

Also, reduce the click_char calls to just one per tag name and replace the other nested function with a dict comprehension.

Cut down ccache size

sqlite3.Connection.iterdump now ensures that foreign key support is disabled before dumping the database schema, if there is any foreign key violation.

Co-authored-by: Erlend E. Aasland erlend@python.org

Co-authored-by: Serhiy Storchaka storchaka@gmail.com

The end number should be exclusive, not inclusive.

The new flags were extracted from the macOS 14.2 SDK.

Co-authored-by: Serhiy Storchaka storchaka@gmail.com

Co-authored-by: Jules 57632293+JuliaPoo@users.noreply.github.com Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>

Make zipfile.ZipInfo.compress_level public.

A property is used to retain the behavior of the ._compresslevel.

People constructing zipfile.ZipInfo instances to pass into existing APIs to control per-file compression levels already treat this as public, there was never a reason for it not to be.

I used the more modern name compress_level instead of compresslevel as the keyword argument on other ZipFile APIs is called to be consistent with compress_type and a general long term preference of not runningwordstogether without a separator in names.

Some of the asyncio SSL changes in GH-31275 1 were taken from v0.16.0 of the uvloop project 2. In order to comply with the MIT license, we need to just need to document the copyright information.

Fix Sphinx Lint warnings in Misc/

The MagicMock documentation mentions magic methods several times without actually pointing to the term in the glossary. This can be helpful for people to fully understand what those magic methods are.

On Windows, os.path.isabs() now returns False when given a path that starts with exactly one (back)slash. This is more compatible with other functions in os.path, and with Microsoft's own documentation.

Also adjust pathlib.PureWindowsPath.is_absolute() to call ntpath.isabs(), which corrects its handling of partial UNC/device paths like //foo.

Co-authored-by: Jon Foster jon@jon-foster.co.uk

It's wrong for the PurePathBase methods to rely so much on __str__(). Instead, they should treat the raw path(s) as opaque objects and leave the details to pathmod.

This commit adds a PurePathBase._raw_path property and uses it through many of the other ABC methods. These methods are all redefined in PurePath and Path, so this has no effect on the public classes.

Increase the backlog for multiprocessing.connection.Listenerobjects created bymultiprocessing.managerandmultiprocessing.resource_sharerto significantly reduce the risk of getting a connection refused error when creating amultiprocessing.connection.Connection` to them.

Fix a bug in the regex used for parsing a string input to the fractions.Fraction constructor. That bug led to an inconsistent exception message being given for some inputs.


Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Mark Dickinson dickinsm@gmail.com

It no longer uses the C stack. The depth of nesting is only limited by Python recursion limit setting.

Establish Tools/clinic/libclinic/utils.py and move the following functions over there:

Path modules provide a subset of the os.path API, specifically those functions needed to provide PurePathBase functionality. Each PurePathBase subclass references its path module via a pathmod class attribute.

This commit adds a new PathModuleBase class, which provides abstract methods that unconditionally raise UnsupportedOperation. An instance of this class is assigned to PurePathBase.pathmod, replacing posixpath. As a result, PurePathBase is no longer POSIX-y by default, and all its methods raise UnsupportedOperation courtesy of pathmod.

Users who subclass PurePathBase or PathBase should choose the path syntax by setting pathmod to posixpath, ntpath, os.path, or their own subclass of PathModuleBase, as circumstances demand.

This allows users of the pathlib-abc PyPI package to use posixpath or ntpath as a path module in versions of Python lacking os.path.splitroot() (3.11 and before).

Co-authored-by: Alex Waygood Alex.Waygood@Gmail.com

Add some constants to module 'stat' that are used on macOS.

Co-authored-by: Serhiy Storchaka storchaka@gmail.com

PyComplex_RealAsDouble()/PyComplex_ImagAsDouble now try to convert an object to a complex instance using its __complex__() method before falling back to the __float__() method.

PyComplex_ImagAsDouble() also will not silently return 0.0 for non-complex types anymore. Instead we try to call PyFloat_AsDouble() and return 0.0 only if this call is successful.

This fixes _PyInterpreterState_GetAllocatedBlocks() and _Py_GetGlobalAllocatedBlocks() in the free-threaded builds. The gh-113263 change that introduced multiple mimalloc heaps per-thread broke the logic for counting the number of allocated blocks. For subtle reasons, this led to reported reference count leaks in the refleaks buildbots.

Small performance improvement of getproxies_environment() when there are many environment variables. In a benchmark with 5k environment variables not related to proxies, and 5 specifying proxies, we get a 10% walltime improvement.

If trackfd is False, the file descriptor specified by fileno will not be duplicated.

Co-authored-by: Erlend E. Aasland erlend@python.org Co-authored-by: Petr Viktorin encukou@gmail.com Co-authored-by: Serhiy Storchaka storchaka@gmail.com

Co-authored-by: Irit Katriel 1055913+iritkatriel@users.noreply.github.com

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>

gh-114107: Fix symlink test if symlinks aren't supported

Co-authored-by: Erlend E. Aasland erlend.aasland@protonmail.com

Passing allow_code=False prevents serialization and de-serialization of code objects which is incompatible between Python versions.

Also, don't skip the whole collect_windows() if ctypes is missing.

Log also ctypes.windll.shell32.IsUserAnAdmin().

This comment appears to have been mistakenly copied from what is now called iobase_check_closed() in commit 4d9aec022063.

Also unite the iobase_check_closed() code with the relevant comment.

Co-authored-by: Serhiy Storchaka storchaka@gmail.com

Remove excess words in the first and third sentences.

This avoids impact on later parts of the application which may be able to do things they otherwise shouldn't.

Align the multiprocessing shared memory docs with Diatáxis's recommendations for references.

The substantive change is on line 577/593. Rest is header/footer stuff ignored when displaying.

Skip .pth files with names starting with a dot or hidden file attribute.

As of #108553, the _avoid_backslashes code path is dead

scape_newlines was introduced in #110271. Happy to drop the typo fix if we don't want it

Also fix tests found failing under a pydebug build of WASI thanks to make test working due to this change.

Co-authored-by: Hugo van Kemenade 1324225+hugovk@users.noreply.github.com

The GC implementation for free-threaded builds will need to accurately detect if the debug allocator is used because it affects the offset of the Python object from the beginning of the memory allocation. The current implementation of _PyMem_DebugEnabled only considers if the debug allocator is the outer-most allocator; it doesn't handle the case of "hooks" like tracemalloc being used on top of the debug allocator.

This change enables more accurate detection of the debug allocator by tracking when debug hooks are enabled.

We propagate the OSError from the is_dir() call on the top-level directory, and suppress all others.

Co-authored-by: Adam Turner 9087854+AA-Turner@users.noreply.github.com

"compatability" => "compatibility"

This is a very soft deprecation of PurePath.as_uri(). We instead document it as a Path method, and add a couple of sentences mentioning that it's also available in PurePath.

Co-authored-by: Adam Turner 9087854+AA-Turner@users.noreply.github.com

Co-authored-by: Terry Jan Reedy tjreedy@udel.edu

The first parameter is named 'fn', not 'func'.

This matches Firefox format. Edge double-spaces non-simple list but I think it looks worse.

Tkinter is a fact, not necessarily a feature.

Reorganize editor key bindings in a logical order and remove those that do not work, at least on Windows.

Improve shell bindings list.

Instead of checking if a directory does not exist and thereafter creating it, directly call os.makedirs() with the exist_ok=True.

This reverts commit 05e142b1543eb9662d6cc33722e7e16250c9219f.

Only set filename to cwd if it was caused by failed chdir(cwd).

_fork_exec() now returns "noexec:chdir" for failed chdir(cwd).

Co-authored-by: Robert O'Shea PurityLake@users.noreply.github.com

gh-113205: test_multiprocessing.test_terminate: Test the API works on threadpools

Threads can't be forced to terminate (without potentially corrupting too much state), so the expected behaviour of ThreadPool.terminate is to wait for the currently executing tasks to finish.

The entire test was skipped in GH-110848 (0e9c364f4ac18a2237bdbac702b96bcf8ef9cb09). Instead of skipping it entirely, we should ensure the API eventually succeeds: use a shorter timeout.

For the record: on my machine, when the test is un-skipped, the task manages to start in about 1.5% cases.

Ordered keys are no longer unlike 'real dict's.

Prefix 'dict' with 'o', 'g', or 'l' for 'object', 'global', or 'local'. Suffix 'object' with '_'.

EPERM is raised when setreuid() fails. EACCES is set in execve() when the test user has not access to sys.executable.

Co-authored-by: Kirill Podoprigora kirill.bast9@mail.ru

Co-authored-by: Erlend E. Aasland erlend@python.org

Co-authored-by: Brett Cannon brett@python.org

This change renames the dataclass replace method's first argument name from 'obj' to 'self'.

Use different versions in the examples for when extensions do and do not need to be recompiled to make the examples easier to understand.

Co-authored-by: Adam Turner 9087854+AA-Turner@users.noreply.github.com Co-authored-by: Éric merwok@netwok.org

Use a ring buffer instead of a Python list in order to simplify the process of making queue.SimpleQueue thread-safe in free-threaded builds. The ring buffer implementation has no places where critical sections may be released.

Disable toc_object_entries, new in Sphinx 5.2.3

Allow os.PathLike objects to be passed as patterns to pathlib.Path.glob() and rglob(). (It's already possible to use them in PurePath.match())

While we're in the area:

Use _make_child_entry() rather than _make_child_relpath() to retrieve path objects for directories to visit. This saves the allocation of one path object per directory in user subclasses of PathBase, and avoids a second loop.

This trick does not apply when walking top-down, because users can affect the walk by modifying dirnames in-place.

A side effect of this change is that, in bottom-up mode, subdirectories of each directory are visited in reverse order, and that this order doesn't match that of the names in dirnames. I suspect this is fine as the order is arbitrary anyway.

The GH-93000 change set inadvertently caused a sentence in re.compile() documentation to refer to details that no longer followed. Correct this with a link to the Flags sub-subsection.

Co-authored-by: Adam Turner 9087854+aa-turner@users.noreply.github.com

Introduce the following headings and subheadings:

The free-threaded build's garbage collector implementation will need to find GC objects by traversing mimalloc heaps. This hooks up the allocation calls with the correct heaps by using a thread-local "current_obj_heap" variable.

Co-authored-by: Adam Turner 9087854+AA-Turner@users.noreply.github.com

Regression introduced by b1ad5a5d4.

I believe I added this while chasing some performance of hash functions when I first created hashlib. It hasn't been used since, is frankly trivial, and not a test.

Co-authored-by: Adam Turner 9087854+AA-Turner@users.noreply.github.com Co-authored-by: Sergey B Kirpichev skirpichev@gmail.com

Co-authored-by: Hugo van Kemenade 1324225+hugovk@users.noreply.github.com

Some socket tests related to sending file descriptors cause a file descriptor leak on macOS, all of them tests that send one or more descriptors than cannot be received on the read end. This appears to be a platform bug.

This PR skips those tests when doing a refleak test run to avoid hiding other problems.

Co-authored-by: Hugo van Kemenade 1324225+hugovk@users.noreply.github.com


Co-authored-by: Donghee Na donghee.na@python.org Co-authored-by: Sam Gross colesbury@gmail.com Co-authored-by: Irit Katriel 1055913+iritkatriel@users.noreply.github.com Co-authored-by: Itamar Oren itamarost@gmail.com Co-authored-by: Alex Waygood Alex.Waygood@Gmail.com Co-authored-by: Hugo van Kemenade hugovk@users.noreply.github.com Co-authored-by: Filip Łapkiewicz 80906036+fipachu@users.noreply.github.com Co-authored-by: Brandt Bucher brandtbucher@microsoft.com Co-authored-by: Jamie Phan jamie@ordinarylab.dev Co-authored-by: wookie184 wookie1840@gmail.com Co-authored-by: Guido van Rossum guido@python.org Co-authored-by: Barney Gale barney.gale@gmail.com Co-authored-by: Mark Shannon mark@hotpy.org Co-authored-by: Pablo Galindo Salgado Pablogsal@gmail.com Co-authored-by: Hugo van Kemenade 1324225+hugovk@users.noreply.github.com Co-authored-by: Zackery Spytz zspytz@gmail.com Co-authored-by: Xavier de Gaye xdegaye@gmail.com Co-authored-by: Serhiy Storchaka storchaka@gmail.com Co-authored-by: Ronald Oussoren ronaldoussoren@mac.com Co-authored-by: Terry Jan Reedy tjreedy@udel.edu Co-authored-by: AN Long aisk@users.noreply.github.com Co-authored-by: Grigoriev Semyon 33061489+grigoriev-semyon@users.noreply.github.com Co-authored-by: Rami 72725910+ramikg@users.noreply.github.com Co-authored-by: Christian Heimes christian@python.org Co-authored-by: Gregory P. Smith greg@krypto.org Co-authored-by: Erlend E. Aasland erlend@python.org Co-authored-by: Levi Sabah 0xl3vi@gmail.com Co-authored-by: Lee Cannon leecannon@leecannon.xyz Co-authored-by: Sergey B Kirpichev skirpichev@gmail.com Co-authored-by: neonene 53406459+neonene@users.noreply.github.com Co-authored-by: Raymond Hettinger rhettinger@users.noreply.github.com Co-authored-by: Jakub Kulík Kulikjak@gmail.com Co-authored-by: Kristján Valur Jónsson sweskman@gmail.com Co-authored-by: Steve Dower steve.dower@python.org Co-authored-by: mara004 geisserml@gmail.com Co-authored-by: William Andrea william.j.andrea@gmail.com Co-authored-by: Adam Turner 9087854+aa-turner@users.noreply.github.com Co-authored-by: Vinay Sajip vinay_sajip@yahoo.co.uk Co-authored-by: Yan Yanchii yyanchiy@gmail.com Co-authored-by: Pieter Eendebak pieter.eendebak@gmail.com Co-authored-by: Erlend E. Aasland erlend.aasland@protonmail.com Co-authored-by: Stefano Rivera stefano@rivera.za.net Co-authored-by: Petr Viktorin encukou@gmail.com Co-authored-by: Victor Stinner vstinner@python.org Co-authored-by: Seth Michael Larson sethmichaellarson@gmail.com Co-authored-by: Steve Dower steve.dower@microsoft.com Co-authored-by: Kirill Podoprigora kirill.bast9@mail.ru Co-authored-by: Nikita Sobolev mail@sobolevn.me Co-authored-by: Peter Lazorchak lazorchakp@gmail.com Co-authored-by: Mariusz Felisiak felisiak.mariusz@gmail.com Co-authored-by: Ned Batchelder ned@nedbatchelder.com Co-authored-by: Ken Jin kenjin@python.org Co-authored-by: Jules 57632293+JuliaPoo@users.noreply.github.com Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Brett Cannon brett@python.org Co-authored-by: Alois Klink alois@aloisklink.com Co-authored-by: Joseph Pearson 74079531+JoeyPearson822@users.noreply.github.com Co-authored-by: Andrew Zipperer 47086307+zipperer@users.noreply.github.com Co-authored-by: Pierre Equoy pierre.equoy@canonical.com Co-authored-by: InSync 122007197+InSyncWithFoo@users.noreply.github.com Co-authored-by: Stanley 46876382+slateny@users.noreply.github.com Co-authored-by: Jon Foster jon@jon-foster.co.uk Co-authored-by: Crowthebird 78076854+thatbirdguythatuknownot@users.noreply.github.com Co-authored-by: Mark Dickinson dickinsm@gmail.com Co-authored-by: Kamil Turek kamil.turek@hotmail.com Co-authored-by: Raphaël Marinier raphael.marinier@gmail.com Co-authored-by: Jérome Perrin perrinjerome@gmail.com Co-authored-by: Mike Zimin 122507876+mikeziminio@users.noreply.github.com Co-authored-by: Jonathon Reinhart JonathonReinhart@users.noreply.github.com Co-authored-by: Shantanu 12621235+hauntsaninja@users.noreply.github.com Co-authored-by: solya0x 41440448+0xSalikh@users.noreply.github.com Co-authored-by: Kuan-Wei Chiu visitorckw@gmail.com Co-authored-by: Mano Sriram mano.sriram0@gmail.com Co-authored-by: Steffen Zeile 48187781+Kaniee@users.noreply.github.com Co-authored-by: Thomas Wouters thomas@python.org Co-authored-by: Radislav Chugunov 52372310+chgnrdv@users.noreply.github.com Co-authored-by: Karolina Surma 33810531+befeleme@users.noreply.github.com Co-authored-by: Tian Gao gaogaotiantian@hotmail.com Co-authored-by: Ethan Furman ethan@stoneleaf.us Co-authored-by: Sheidan 37596668+Sh3idan@users.noreply.github.com Co-authored-by: Christophe Nanteuil 35002064+christopheNan@users.noreply.github.com Co-authored-by: buermarc 44375277+buermarc@users.noreply.github.com Co-authored-by: Robert O'Shea PurityLake@users.noreply.github.com Co-authored-by: Miyashita Yosuke 44266492+miyashiiii@users.noreply.github.com Co-authored-by: kcatss kcats9731@gmail.com Co-authored-by: Christopher Chavez chrischavez@gmx.us Co-authored-by: Phillip Schanely pschanely@gmail.com Co-authored-by: keithasaurus 592217+keithasaurus@users.noreply.github.com Co-authored-by: DerSchinken 53398996+DerSchinken@users.noreply.github.com Co-authored-by: Skip Montanaro skip.montanaro@gmail.com Co-authored-by: Éric merwok@netwok.org Co-authored-by: mpage mpage@meta.com Co-authored-by: David H. Gutteridge dhgutteridge@users.noreply.github.com Co-authored-by: cdzhan zhancdi@163.com