Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-31582: Created a new section describing sys.path initialization #31082

Merged
merged 18 commits into from Mar 23, 2022

Conversation

RusselWebber
Copy link
Contributor

@RusselWebber RusselWebber commented Feb 2, 2022

Moved common details from the Windows specific finding modules section to a new platform neutral section. Linked to the new section from the relevant module documenation.

https://bugs.python.org/issue31582

Moved common details from the Windows specific finding modules section to a new platform neutral section. Linked to the new section from the relevant module documenation.
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Copy link
Member

@zooba zooba left a comment

Great first pass. I think we can flesh out a couple bits and then merge, and then I'll (or you may) announce on python-dev that the doc is in and let people come in with tweaks and enhancements.

Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Doc/using/windows.rst Show resolved Hide resolved
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
RusselWebber and others added 2 commits Feb 3, 2022
Suggested edit from @eryksun

Co-authored-by: Eryk Sun <eryksun@gmail.com>
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
@zooba zooba added the skip news label Feb 9, 2022
@RusselWebber
Copy link
Contributor Author

RusselWebber commented Feb 10, 2022

@zooba good to merge now?

@RusselWebber RusselWebber requested a review from zooba Feb 15, 2022
@RusselWebber
Copy link
Contributor Author

RusselWebber commented Feb 22, 2022

@zooba are we good to merge? Please let me know what concerns you may have.

Doc/using/cmdline.rst Outdated Show resolved Hide resolved
@bedevere-bot
Copy link

bedevere-bot commented Mar 2, 2022

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

module search path even if the archive does not exist. If no archive was found,
Python on Windows will continue the search for ``prefix`` by looking for :file:`Lib\\os.py`
or :file:`Lib\\os.pyc`. Python on Unix will look for :file:`lib/python{majorversion}.{minorversion}/os.py`
(``lib/python3.11/os.py``) or :file:`lib/python{majorversion}.{minorversion}/os.pyc` (``lib/python3.11/os.pyc``).
Copy link
Member

@ned-deily ned-deily Mar 2, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that true? On Unix systems these days, the .pyc files are supposed to be in lib/python3.n/__pycache__/ and have a version-specific and opt-level specific suffix. For example, on a current macOS framework install:

$ cd /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10
$ ls *.pyc
ls: *.pyc: No such file or directory
$ ls __pycache__/
__future__.cpython-310.opt-1.pyc                    nntplib.cpython-310.opt-1.pyc
__future__.cpython-310.pyc                          nntplib.cpython-310.pyc
__phello__.foo.cpython-310.opt-1.pyc                ntpath.cpython-310.opt-1.pyc
[...]

The old unqualified .pyc form of the file name in the lib directly may still be supported as a legacy but that should be the exception these days.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well spotted! I think you are correct, this should be updated in getpath.py I believe, @zooba what do you think?

At the moment line 170 in getpath.py has:

if os_name == 'posix' or os_name == 'darwin':
    BUILDDIR_TXT = 'pybuilddir.txt'
    BUILD_LANDMARK = 'Modules/Setup.local'
    DEFAULT_PROGRAM_NAME = f'python{VERSION_MAJOR}'
    STDLIB_SUBDIR = f'{platlibdir}/python{VERSION_MAJOR}.{VERSION_MINOR}'
    STDLIB_LANDMARKS = [f'{STDLIB_SUBDIR}/os.py', f'{STDLIB_SUBDIR}/os.pyc']
    PLATSTDLIB_LANDMARK = f'{platlibdir}/python{VERSION_MAJOR}.{VERSION_MINOR}/lib-dynload'
    BUILDSTDLIB_LANDMARKS = ['Lib/os.py']
    VENV_LANDMARK = 'pyvenv.cfg'
    ZIP_LANDMARK = f'{platlibdir}/python{VERSION_MAJOR}{VERSION_MINOR}.zip'
    DELIM = ':'
    SEP = '/'

elif os_name == 'nt':
    BUILDDIR_TXT = 'pybuilddir.txt'
    BUILD_LANDMARK = f'{VPATH}\\Modules\\Setup.local'
    DEFAULT_PROGRAM_NAME = f'python'
    STDLIB_SUBDIR = 'Lib'
    STDLIB_LANDMARKS = [f'{STDLIB_SUBDIR}\\os.py', f'{STDLIB_SUBDIR}\\os.pyc']
    PLATSTDLIB_LANDMARK = f'{platlibdir}'
    BUILDSTDLIB_LANDMARKS = ['Lib\\os.py']
    VENV_LANDMARK = 'pyvenv.cfg'
    ZIP_LANDMARK = f'python{VERSION_MAJOR}{VERSION_MINOR}{PYDEBUGEXT or ""}.zip'
    WINREG_KEY = f'SOFTWARE\\Python\\PythonCore\\{PYWINVER}\\PythonPath'
    DELIM = ';'
    SEP = '\\'

Both the Windows and Unix os.pyc STDLIB_LANDMARKS should be updated/removed.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Contributor

@eryksun eryksun Mar 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking for f'{STDLIB_SUBDIR}\\os.pyc' is even more historical now. Unless the standard library is manually precompiled, which is optional when installing, Python 3.11 won't have an "os[.*].pyc" file in any directory. The os module is frozen in 3.11, so there's no reason to distribute or cache it as a PYC file.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zooba closed https://bugs.python.org/issue46909 as the searching for .pyc is used. Probably best to leave it out of the the documentation though.

Copy link
Member

@zooba zooba Mar 9, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The os module is frozen in 3.11, so there's no reason to distribute or cache it as a PYC file.

This is a good point, we probably need to pick a different landmark (perhaps site.py?).

I do think detecting the precompiled PYC is correct here. Precompiling on install generates the __pycache__ directories, but precompiling manually for an embedded runtime is totally legitimate (though I believe more performant if you also zip up the .pycs and put the ZIP file somewhere discoverable, which is why the ZIP detection overrides these landmarks).

Copy link
Contributor

@eryksun eryksun Mar 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good point, we probably need to pick a different landmark (perhaps site.py?).

site.py is also frozen. See Tools/scripts/freeze_modules.py. Maybe add an empty landmark file that includes the Python version in its name, e.g. __py_stdlib_cpython_3_11.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Steve, to be clear, do you think the docs should mention searching for os.pyc or not?

Doc/using/cmdline.rst Outdated Show resolved Hide resolved
Doc/using/cmdline.rst Outdated Show resolved Hide resolved
@ned-deily
Copy link
Member

ned-deily commented Mar 2, 2022

Thanks for doing this, BTW. I think it will be a nice improvement to the docs.

@RusselWebber
Copy link
Contributor Author

RusselWebber commented Mar 3, 2022

I have made the requested changes; please review again.

@RusselWebber
Copy link
Contributor Author

RusselWebber commented Mar 4, 2022

Made changes suggested by @vstinner and @ucodery

Doc/using/cmdline.rst Outdated Show resolved Hide resolved

The next items added are the directories containing standard Python modules as
well as any :term:`extension module`\s that these modules depend on. Extension
modules are .dll files on Windows, .dylib files on macOS and .so files on Linux.
Copy link
Member

@ned-deily ned-deily Mar 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I may have mislead you here. Extension modules have a .so extension on macOS as well as on Linux and on other Unix-y systems - all other ones AFAIK (like the BSD's). What is true is that shared libraries on macOS typically have a .dylib extension but Python extension modules on macOS aren't shared libraries. (A package installed (via pip, say) that includes an extension module might also install a shared library but I think that level of detail isn't needed here.) So perhaps this should be reworded to be .dll files on Windows, .so files on other platforms. ?

Copy link
Contributor

@eryksun eryksun Mar 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Extension modules are ".pyd" files in Windows, which in CPython are DLL files (IMAGE_FILE_DLL to be specific in terms of the PE IMAGE_FILE_HEADER.Characteristics). The ".pyd" file extension is used in Windows in order to associate a Python icon with the file, as defined by the "Python.Extension" progid.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No problem @ned-deily. Thanks @eryksun , I never knew why Windows used .pyd, always seemed curious to me that Python had these renamed .dll files!

~~~~~~~~~~

To completely override :data:`sys.path`, create a ``._pth`` file with the same
name as the extension module (``python311._pth``) or the executable (``python._pth``)
Copy link
Member

@ned-deily ned-deily Mar 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think there is some confusion here: I believe the python311 here is referring to the Python interpreter shared library (a DLL), not an extension module (confusingly also a DLL). @zooba, can you confirm and perhaps suggest a more correct wording?

Copy link
Member

@ned-deily ned-deily Mar 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, it this a Windows only feature? If not, the wording needs to take into account the fact that on Unix-y systems the python executable might have a shared library component.

Copy link
Contributor

@eryksun eryksun Mar 10, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be the same name as and located beside the Python executable or shared library (not "extension module") -- e.g. "python.exe" -> "python._pth" or "python311.dll" -> "python311._pth".

Support for "._pth" files was extended to all platforms. I've tested this in Linux for a "._pth" file that's based on the real executable name, as well as a symlink to the executable, as well as a symlink to the "._pth" file. All work, but note that relative paths are resolved against the opened location of the "._pth" file. The real path of the "._pth" file is not used. I haven't checked how a "._pth" file works when named for a shared library, if the interpreter is built as such. Apparently this configuration isn't tested in POSIX.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you, I have been mixing my shared library and extension module terms far too freely. Will review.

@bedevere-bot
Copy link

bedevere-bot commented Mar 10, 2022

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

@RusselWebber
Copy link
Contributor Author

RusselWebber commented Mar 11, 2022

I have made the requested changes; please review again.

@bedevere-bot
Copy link

bedevere-bot commented Mar 11, 2022

Thanks for making the requested changes!

@ned-deily: please review the changes made to this pull request.

@bedevere-bot bedevere-bot requested a review from ned-deily Mar 11, 2022
Doc/whatsnew/3.6.rst Show resolved Hide resolved
Copy link
Member

@vstinner vstinner left a comment

Nice! It's great that someone is brave enough to attempt updating the outdated doc and merge all infos scattered in the doc at a single place.

I suggest to create a new dedicated page, IMO it's worth it: Doc/library/sys_path_init.rst.

* :ref:`using-on-finding-modules` for further details about the
initialization of :data:`sys.path`.
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suggest to move it outside the seealso section, it's directly related to sys.path.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, done.

@@ -59,6 +59,7 @@ all consecutive arguments will end up in :data:`sys.argv` -- note that the first
element, subscript zero (``sys.argv[0]``), is a string reflecting the program's
source.

.. _using-on-interface-option-c:
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's not needed, use:

:option:`-c <command> <-c>`

(I'm not sure if it works for -c because of its <command> argument, I never tried.)

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I will try that.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Works nicely, thank you for that!

@@ -252,6 +254,7 @@ Miscellaneous options
options). See also :envvar:`PYTHONDEBUG`.


.. _using-on-misc-option-uppercase-e:
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just use:

:option:`-E`

.. _using-on-finding-modules:

Finding modules
---------------
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think of adding a new file to the doc? This section doesn't directly belong to the "Command line and environment". I suggest adding the new file to the Doc/library/ directory.

Example: Doc/library/sys_path_init.rst.

IMO listing this file in https://docs.python.org/dev/library/modules.html is a good place.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You are right, this section doesn't fit neatly into the "Command line and environment" page. I'm open to the idea of a new page. Be interested to know what @zooba and @ned-deily think?

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have moved the section into a new doc. Lets see what people think of this approach.

---------------

A module search path is initialized when Python starts. This module search path
may be accessed at :data:`sys.path`.
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
may be accessed at :data:`sys.path`.
is accessed at :data:`sys.path`.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

may be accessed is correct IMO. The data is available at sys.path, but you don't have to go and view it, that is what I was getting at with may be accessed. The other correct alternative is is available at sys.path

Doc/using/cmdline.rst Outdated Show resolved Hide resolved
(``lib/python3.11/os.py``). On Windows ``prefix`` and ``exec_prefix`` are the same,
however on other platforms :file:`lib/python{majorversion}.{minorversion}/lib-dynload`
(``lib/python3.11/lib-dynload``) is searched for and used as an anchor for
``exec_prefix``.
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should document sys.platlibdir and PYTHONPLATLIBDIR env var somewhere.

See: https://docs.python.org/dev/library/sys.html#sys.platlibdir

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I have now mentioned them.

.. note::

Certain command line options may further affect path calculations.
See :ref:`-E <using-on-misc-option-uppercase-e>`, :ref:`-I <using-on-misc-option-uppercase-i>`, :ref:`-s <using-on-misc-option-s>` and :ref:`-S <using-on-misc-option-uppercase-s>` for further details.
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In terms of formatting, I suggest a list instead:

Suggested change
.. note::
Certain command line options may further affect path calculations.
See :ref:`-E <using-on-misc-option-uppercase-e>`, :ref:`-I <using-on-misc-option-uppercase-i>`, :ref:`-s <using-on-misc-option-s>` and :ref:`-S <using-on-misc-option-uppercase-s>` for further details.
Certain command line options may further affect path calculations:
* :ref:`-E <using-on-misc-option-uppercase-e>`: ignore environment variables
* :ref:`-I <using-on-misc-option-uppercase-i>`: isolated mode
* :ref:`-s <using-on-misc-option-s>`: don't add user directory
* :ref:`-S <using-on-misc-option-uppercase-s>`: don't import the :mod:`site` module

It would be nice to have at one place, the exhaustive list of things impacting sys.path:

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had a more verbose description, see 59cbc07#r822648316 however @zooba preferred the more succint approach.

Embedded Python
~~~~~~~~~~~~~~~

If Python is embedded within another application :c:func:`Py_SetPath` can be used to
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Py_SetPath is deprecated. I suggest to document the PyConfig API first.

There is also Py_SetPathEx.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, will do

@@ -994,3 +1000,110 @@ Debug-mode variables
Need Python configured with the :option:`--with-trace-refs` build option.

.. versionadded:: 3.11

.. _using-on-finding-modules:
Copy link
Member

@vstinner vstinner Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

importlib finds module. This section is only about sys.path initialization: it can be modified afterwards by modifying directly sys.path list. I suggest to rename the link to "sys-path-init".

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair comment, I have amended.

Co-authored-by: Victor Stinner <vstinner@python.org>
To completely override :data:`sys.path`, create a ``._pth`` file with the same
name as the shared library (``python311._pth``) or the executable (``python._pth``)
Copy link
Contributor

@eryksun eryksun Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked the shared-library case in Linux. It appears to not be supported at all. This may be the case on all POSIX platforms, including macOS. This description should emphasize that the shared library is used only if its path is known. It's always known in Windows.

Copy link
Contributor

@eryksun eryksun Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ISTM that the path of the shared library in POSIX could be known in many if not most cases, since most Unix platforms support the non-standard dladdr() function. For example, call dladdr(PyObject_Call, &info), which returns the object path in info.dli_fname. If the interpreter is known to have been built as a shared library, then dli_fname is either the absolute path of the library or relative to the current working directory at startup.

I wouldn't trust the result if Python is linked statically in the application, because the path comes from the command line (at least in Linux), which isn't necessarily related to the file that was actually executed. Then again, the code that sets sys.executable doesn't seem to care about this in POSIX. For example, run Python with the command line "./spam", where "./spam" does not exist, but actually execute the real Python binary. Then sys.executable will be the non-existent path "./spam", and "./spam._pth" will be used if it exists.

Copy link
Contributor

@eryksun eryksun Mar 11, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A bit of the latter has leaked into Windows Python in 3.11. An existing file or directory from the command line will be used as sys.executable, but only if the path from the command line uses backslashes instead of forward slashes.

For example, spawn Python by calling CreateProcessW() with lpCommandLine set to "C:\\Windows" and lpApplicationName set to the real executable path. Then sys.executable will be "C:\\Windows" (a directory), and "C:\\Windows._pth" will used if it exists. But change the command line to "C:/Windows", and sys.executable will be the path of the executed file.

From behavior in prior versions, I expect sys.executable in Windows (or sys._base_executable in the venv case) to always be the path of the process image, i.e. lpApplicationName from the CreateProcessW() call, never the argv[0] file/directory from the command line.

Copy link
Contributor Author

@RusselWebber RusselWebber Mar 16, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked the shared-library case in Linux. It appears to not be supported at all. This may be the case on all POSIX platforms, including macOS. This description should emphasize that the shared library is used only if its path is known. It's always known in Windows.

Thanks for checking this.

Copy link
Member

@zooba zooba Mar 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eryksun That last change you mention is deliberate, as it's actually essential to fix some symlink handling. It does open some interesting exploitability, however, using the ._pth next to library is always recommended if you're worried about someone hijacking it.

Copy link
Contributor

@eryksun eryksun Mar 17, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zooba, if it's intentional, maybe it should support forward slash for the leaf component, e.g. r"C:/Windows\py.exe" works, but passing r"C:/Windows/py.exe" as argv[0] falls back on using the real process image path for sys.executable. Though I don't follow the necessity due to symlinks. The Windows loader never resolves symlinks for GetModuleFileNameW().

Copy link
Member

@zooba zooba Mar 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably right about the forward slash, I haven't looked back at why it's acting like that.

Possibly the symlink issue I'm thinking of is Explorer? I dug into it a while back, but I think ShellExecute resolves the symlink before launching, but passes the original path through argv?

Copy link
Contributor

@eryksun eryksun Mar 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly the symlink issue I'm thinking of is Explorer?

Ah, the shell API. It's always the shell API...

@RusselWebber RusselWebber requested review from zooba and vstinner Mar 16, 2022
@zooba
Copy link
Member

zooba commented Mar 17, 2022

I'm happy with this I think. @vstinner had the last thorough review, so if he's happy with the changes then let's put this in the docs! (Never too late to make more updates as necessary)

@AlexWaygood AlexWaygood added the docs Documentation in the Doc dir label Mar 17, 2022
@zooba zooba merged commit c62b944 into python:main Mar 23, 2022
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
docs Documentation in the Doc dir skip news
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

9 participants