From 22b172d4b76dd14a118266f5cbb8f4779ced1159 Mon Sep 17 00:00:00 2001 From: JinWang An Date: Wed, 18 Jan 2023 15:01:34 +0900 Subject: [PATCH] Imported Upstream version 3.10.0 --- Doc/Makefile | 2 +- Doc/about.rst | 5 +- Doc/bugs.rst | 43 +- Doc/c-api/apiabiversion.rst | 81 +- Doc/c-api/arg.rst | 43 +- Doc/c-api/bytearray.rst | 2 + Doc/c-api/bytes.rst | 6 +- Doc/c-api/call.rst | 4 +- Doc/c-api/code.rst | 8 + Doc/c-api/codec.rst | 8 + Doc/c-api/conversion.rst | 10 +- Doc/c-api/datetime.rst | 15 +- Doc/c-api/descriptor.rst | 4 +- Doc/c-api/dict.rst | 4 + Doc/c-api/exceptions.rst | 121 +- Doc/c-api/function.rst | 8 +- Doc/c-api/gcsupport.rst | 59 +- Doc/c-api/init.rst | 47 +- Doc/c-api/init_config.rst | 910 +- Doc/c-api/intro.rst | 50 +- Doc/c-api/iter.rst | 28 +- Doc/c-api/long.rst | 66 +- Doc/c-api/mapping.rst | 6 +- Doc/c-api/memory.rst | 198 +- Doc/c-api/method.rst | 2 +- Doc/c-api/module.rst | 104 +- Doc/c-api/number.rst | 17 +- Doc/c-api/object.rst | 26 +- Doc/c-api/refcounting.rst | 60 +- Doc/c-api/reflection.rst | 8 +- Doc/c-api/sequence.rst | 10 +- Doc/c-api/set.rst | 12 +- Doc/c-api/stable.rst | 186 +- Doc/c-api/structures.rst | 65 +- Doc/c-api/sys.rst | 80 +- Doc/c-api/tuple.rst | 2 +- Doc/c-api/type.rst | 22 +- Doc/c-api/typehints.rst | 5 +- Doc/c-api/typeobj.rst | 295 +- Doc/c-api/unicode.rst | 83 +- Doc/c-api/veryhigh.rst | 65 +- Doc/c-api/weakref.rst | 6 +- Doc/conf.py | 11 +- Doc/copyright.rst | 2 +- Doc/data/python3.10.abi | 15736 ++++++++ Doc/data/python3.9.abi | 18706 --------- Doc/data/refcounts.dat | 51 +- Doc/data/stable_abi.dat | 863 + Doc/distutils/apiref.rst | 23 +- Doc/distutils/builtdist.rst | 86 +- Doc/distutils/commandref.rst | 1 - Doc/distutils/index.rst | 7 + Doc/distutils/introduction.rst | 11 - Doc/distutils/sourcedist.rst | 41 +- Doc/extending/building.rst | 1 - Doc/extending/extending.rst | 19 +- Doc/extending/newtypes.rst | 33 +- Doc/extending/newtypes_tutorial.rst | 11 +- Doc/extending/windows.rst | 4 +- Doc/faq/design.rst | 26 +- Doc/faq/extending.rst | 125 + Doc/faq/general.rst | 2 +- Doc/faq/library.rst | 16 +- Doc/faq/programming.rst | 142 +- Doc/faq/windows.rst | 8 +- Doc/glossary.rst | 83 +- Doc/howto/annotations.rst | 226 + Doc/howto/argparse.rst | 57 +- Doc/howto/clinic.rst | 64 +- Doc/howto/curses.rst | 6 +- Doc/howto/descriptor.rst | 57 +- Doc/howto/functional.rst | 11 +- Doc/howto/index.rst | 1 + Doc/howto/instrumentation.rst | 10 +- Doc/howto/ipaddress.rst | 2 +- Doc/howto/logging-cookbook.rst | 24 +- Doc/howto/logging.rst | 31 +- Doc/howto/logging_flow.png | Bin 21907 -> 22058 bytes Doc/howto/regex.rst | 2 +- Doc/howto/sockets.rst | 2 +- Doc/howto/sorting.rst | 53 +- Doc/howto/unicode.rst | 10 +- Doc/includes/custom.c | 2 +- Doc/includes/custom2.c | 2 +- Doc/includes/custom3.c | 2 +- Doc/includes/custom4.c | 2 +- Doc/includes/sqlite3/text_factory.py | 4 +- Doc/includes/sublist.c | 2 +- Doc/includes/typestruct.h | 5 +- Doc/install/index.rst | 9 +- Doc/library/2to3.rst | 18 +- Doc/library/__future__.rst | 10 +- Doc/library/__main__.rst | 377 +- Doc/library/_thread.rst | 20 +- Doc/library/abc.rst | 37 +- Doc/library/aifc.rst | 6 - Doc/library/argparse.rst | 56 +- Doc/library/array.rst | 8 +- Doc/library/ast.rst | 395 +- Doc/library/asynchat.rst | 3 - Doc/library/asyncio-api-index.rst | 2 +- Doc/library/asyncio-eventloop.rst | 19 +- Doc/library/asyncio-future.rst | 15 +- Doc/library/asyncio-queue.rst | 12 +- Doc/library/asyncio-stream.rst | 59 +- Doc/library/asyncio-subprocess.rst | 23 +- Doc/library/asyncio-sync.rst | 40 +- Doc/library/asyncio-task.rst | 118 +- Doc/library/asyncio.rst | 1 + Doc/library/asyncore.rst | 3 - Doc/library/audioop.rst | 5 - Doc/library/base64.rst | 38 +- Doc/library/binascii.rst | 7 +- Doc/library/bisect.rst | 118 +- Doc/library/bz2.rst | 7 +- Doc/library/cgi.rst | 13 +- Doc/library/cgitb.rst | 5 - Doc/library/chunk.rst | 5 - Doc/library/codecs.rst | 209 +- Doc/library/collections.abc.rst | 230 +- Doc/library/collections.rst | 139 +- Doc/library/concurrent.futures.rst | 5 +- Doc/library/configparser.rst | 33 +- Doc/library/constants.rst | 13 +- Doc/library/contextlib.rst | 118 +- Doc/library/contextvars.rst | 2 +- Doc/library/copy.rst | 3 +- Doc/library/copyreg.rst | 4 +- Doc/library/crypt.rst | 13 +- Doc/library/csv.rst | 14 + Doc/library/ctypes.rst | 15 +- Doc/library/curses.rst | 18 +- Doc/library/dataclasses.rst | 206 +- Doc/library/datetime.rst | 24 +- Doc/library/decimal.rst | 3 +- Doc/library/devmode.rst | 5 + Doc/library/dis.rst | 83 +- Doc/library/distutils.rst | 5 + Doc/library/doctest.rst | 48 +- Doc/library/email.charset.rst | 14 +- Doc/library/email.errors.rst | 3 + Doc/library/email.utils.rst | 6 +- Doc/library/ensurepip.rst | 6 +- Doc/library/enum.rst | 19 +- Doc/library/errno.rst | 61 +- Doc/library/exceptions.rst | 127 +- Doc/library/faulthandler.rst | 4 + Doc/library/fcntl.rst | 8 +- Doc/library/filecmp.rst | 8 +- Doc/library/fileformats.rst | 1 + Doc/library/fileinput.rst | 35 +- Doc/library/formatter.rst | 351 - Doc/library/ftplib.rst | 2 +- Doc/library/functions.rst | 370 +- Doc/library/functools.rst | 70 +- Doc/library/glob.rst | 32 +- Doc/library/grp.rst | 2 +- Doc/library/hashlib-blake2-tree.png | Bin 11070 -> 11146 bytes Doc/library/hashlib.rst | 20 +- Doc/library/hmac.rst | 2 +- Doc/library/html.entities.rst | 2 +- Doc/library/html.parser.rst | 2 +- Doc/library/http.client.rst | 9 + Doc/library/http.cookiejar.rst | 16 +- Doc/library/http.rst | 2 +- Doc/library/http.server.rst | 43 +- Doc/library/idle.rst | 18 +- Doc/library/imghdr.rst | 13 +- Doc/library/importlib.metadata.rst | 98 +- Doc/library/importlib.rst | 107 +- Doc/library/index.rst | 2 +- Doc/library/inspect.rst | 89 +- Doc/library/internet.rst | 7 +- Doc/library/io.rst | 142 +- Doc/library/ipaddress.rst | 2 +- Doc/library/ipc.rst | 2 + Doc/library/itertools.rst | 75 +- Doc/library/json.rst | 28 +- Doc/library/language.rst | 2 - Doc/library/locale.rst | 42 +- Doc/library/logging.config.rst | 65 +- Doc/library/logging.handlers.rst | 29 +- Doc/library/logging.rst | 69 +- Doc/library/lzma.rst | 4 +- Doc/library/mailcap.rst | 24 +- Doc/library/marshal.rst | 4 +- Doc/library/math.rst | 42 +- Doc/library/misc.rst | 13 - Doc/library/mm.rst | 7 + Doc/library/mmap.rst | 24 +- Doc/library/msilib.rst | 5 - Doc/library/multiprocessing.rst | 28 +- Doc/library/netdata.rst | 4 +- Doc/library/netrc.rst | 4 + Doc/library/nis.rst | 5 - Doc/library/nntplib.rst | 4 - Doc/library/operator.rst | 4 + Doc/library/optparse.rst | 2 +- Doc/library/os.path.rst | 46 +- Doc/library/os.rst | 369 +- Doc/library/ossaudiodev.rst | 5 - Doc/library/parser.rst | 357 - Doc/library/pathlib-inheritance.svg | 2 +- Doc/library/pathlib.rst | 91 +- Doc/library/pdb.rst | 12 +- Doc/library/pickle.rst | 47 +- Doc/library/pipes.rst | 8 +- Doc/library/pkgutil.rst | 8 +- Doc/library/platform.rst | 52 +- Doc/library/posix.rst | 6 +- Doc/library/pprint.rst | 70 +- Doc/library/pty.rst | 20 +- Doc/library/py_compile.rst | 36 +- Doc/library/pyclbr.rst | 7 + Doc/library/pydoc.rst | 6 +- Doc/library/queue.rst | 4 +- Doc/library/random.rst | 37 +- Doc/library/re.rst | 4 +- Doc/library/readline.rst | 4 +- Doc/library/resource.rst | 8 + Doc/library/runpy.rst | 4 +- Doc/library/secrets.rst | 2 +- Doc/library/security_warnings.rst | 4 +- Doc/library/shelve.rst | 20 +- Doc/library/shlex.rst | 14 + Doc/library/shutil.rst | 65 +- Doc/library/signal.rst | 81 +- Doc/library/smtpd.rst | 3 - Doc/library/smtplib.rst | 11 +- Doc/library/sndhdr.rst | 5 - Doc/library/socket.rst | 55 +- Doc/library/socketserver.rst | 4 +- Doc/library/spwd.rst | 5 - Doc/library/sqlite3.rst | 192 +- Doc/library/ssl.rst | 266 +- Doc/library/stat.rst | 2 +- Doc/library/statistics.rst | 139 +- Doc/library/stdtypes.rst | 503 +- Doc/library/string.rst | 19 +- Doc/library/subprocess.rst | 85 +- Doc/library/sunau.rst | 5 - Doc/library/superseded.rst | 24 +- Doc/library/symbol.rst | 32 - Doc/library/sys.rst | 189 +- Doc/library/sysconfig.rst | 42 +- Doc/library/telnetlib.rst | 5 - Doc/library/tempfile.rst | 41 +- Doc/library/test.rst | 957 +- Doc/library/textwrap.rst | 5 +- Doc/library/threading.rst | 67 +- Doc/library/time.rst | 62 +- Doc/library/timeit.rst | 7 - Doc/library/tk_msg.png | Bin 14979 -> 19645 bytes Doc/library/tkinter.font.rst | 7 +- Doc/library/tkinter.rst | 528 +- Doc/library/token-list.inc | 2 + Doc/library/token.rst | 2 +- Doc/library/traceback.rst | 53 +- Doc/library/types.rst | 30 +- Doc/library/typing.rst | 678 +- Doc/library/undoc.rst | 26 + Doc/library/unittest.mock.rst | 17 +- Doc/library/unittest.rst | 25 +- Doc/library/unix.rst | 4 + Doc/library/urllib.parse.rst | 91 +- Doc/library/urllib.request.rst | 15 +- Doc/library/urllib.robotparser.rst | 2 +- Doc/library/uu.rst | 6 - Doc/library/uuid.rst | 2 +- Doc/library/venv.rst | 6 +- Doc/library/warnings.rst | 4 +- Doc/library/weakref.rst | 4 - Doc/library/webbrowser.rst | 6 +- Doc/library/windows.rst | 1 + Doc/library/xdrlib.rst | 5 - Doc/library/xml.dom.minidom.rst | 8 - Doc/library/xml.dom.rst | 2 +- Doc/library/xml.etree.elementtree.rst | 27 +- Doc/library/xml.sax.handler.rst | 64 +- Doc/library/xmlrpc.client.rst | 8 +- Doc/library/zipfile.rst | 17 +- Doc/library/zipimport.rst | 66 +- Doc/library/zlib.rst | 14 +- Doc/library/zoneinfo.rst | 5 +- Doc/license.rst | 6 +- Doc/make.bat | 3 +- Doc/reference/compound_stmts.rst | 688 +- Doc/reference/datamodel.rst | 491 +- Doc/reference/executionmodel.rst | 13 +- Doc/reference/expressions.rst | 91 +- Doc/reference/grammar.rst | 3 +- Doc/reference/import.rst | 37 +- Doc/reference/lexical_analysis.rst | 36 +- Doc/reference/simple_stmts.rst | 30 +- Doc/requirements.txt | 10 +- Doc/tools/extensions/c_annotations.py | 110 +- Doc/tools/extensions/escape4chm.py | 9 +- Doc/tools/extensions/glossary_search.py | 63 + Doc/tools/extensions/peg_highlight.py | 19 +- Doc/tools/extensions/pyspecific.py | 78 +- Doc/tools/rstlint.py | 76 + Doc/tools/susp-ignored.csv | 29 +- Doc/tools/templates/search.html | 48 + Doc/tutorial/classes.rst | 2 +- Doc/tutorial/controlflow.rst | 174 +- Doc/tutorial/errors.rst | 101 +- Doc/tutorial/floatingpoint.rst | 2 +- Doc/tutorial/index.rst | 2 +- Doc/tutorial/inputoutput.rst | 28 +- Doc/tutorial/interpreter.rst | 10 +- Doc/tutorial/introduction.rst | 7 - Doc/tutorial/modules.rst | 7 +- Doc/tutorial/stdlib.rst | 21 +- Doc/tutorial/stdlib2.rst | 2 +- Doc/tutorial/venv.rst | 2 +- Doc/tutorial/whatnow.rst | 4 +- Doc/using/cmdline.rst | 180 +- Doc/using/configure.rst | 816 + Doc/using/index.rst | 1 + Doc/using/mac.rst | 2 +- Doc/using/unix.rst | 59 +- Doc/using/win_installer.png | Bin 84383 -> 95096 bytes Doc/using/windows.rst | 164 +- Doc/whatsnew/2.0.rst | 8 +- Doc/whatsnew/2.1.rst | 2 +- Doc/whatsnew/2.2.rst | 2 +- Doc/whatsnew/2.3.rst | 2 +- Doc/whatsnew/2.5.rst | 4 +- Doc/whatsnew/2.7.rst | 2 +- Doc/whatsnew/3.10.rst | 2311 ++ Doc/whatsnew/3.2.rst | 5 +- Doc/whatsnew/3.4.rst | 2 +- Doc/whatsnew/3.6.rst | 4 +- Doc/whatsnew/3.7.rst | 9 +- Doc/whatsnew/3.8.rst | 17 +- Doc/whatsnew/3.9.rst | 71 +- Doc/whatsnew/index.rst | 1 + Grammar/Grammar | 207 - Grammar/Tokens | 1 + Grammar/python.gram | 765 +- Include/Python-ast.h | 697 - Include/Python.h | 38 +- Include/README.rst | 12 + Include/abstract.h | 27 +- Include/asdl.h | 46 - Include/ast.h | 35 - Include/bitset.h | 23 - Include/boolobject.h | 15 +- Include/bytesobject.h | 35 +- Include/cellobject.h | 2 +- Include/ceval.h | 8 - Include/codecs.h | 8 + Include/compile.h | 109 +- Include/cpython/abstract.h | 23 +- Include/cpython/bytesobject.h | 2 +- Include/cpython/ceval.h | 8 - Include/cpython/code.h | 33 +- Include/cpython/compile.h | 52 + Include/cpython/dictobject.h | 16 +- Include/cpython/fileobject.h | 8 +- Include/cpython/fileutils.h | 17 +- Include/cpython/frameobject.h | 50 +- Include/cpython/import.h | 11 +- Include/cpython/initconfig.h | 293 +- Include/cpython/interpreteridobject.h | 8 - Include/cpython/listobject.h | 13 +- Include/cpython/object.h | 34 +- Include/cpython/objimpl.h | 51 +- Include/{ => cpython}/odictobject.h | 0 Include/{ => cpython}/picklebufobject.h | 0 Include/{ => cpython}/pyctype.h | 0 Include/{ => cpython}/pydebug.h | 0 Include/cpython/pyerrors.h | 32 +- Include/{ => cpython}/pyfpe.h | 0 Include/cpython/pylifecycle.h | 16 +- Include/cpython/pymem.h | 10 - Include/cpython/pystate.h | 70 +- Include/cpython/pythonrun.h | 121 + Include/{ => cpython}/pytime.h | 59 +- Include/cpython/sysmodule.h | 8 - Include/cpython/traceback.h | 8 - Include/cpython/tupleobject.h | 10 +- Include/cpython/unicodeobject.h | 103 +- Include/datetime.h | 8 + Include/descrobject.h | 2 +- Include/dictobject.h | 3 + Include/errcode.h | 3 +- Include/eval.h | 10 - Include/fileutils.h | 4 - Include/funcobject.h | 26 +- Include/genobject.h | 4 +- Include/graminit.h | 94 - Include/grammar.h | 77 - Include/internal/pegen_interface.h | 46 - Include/internal/pycore_asdl.h | 112 + Include/internal/pycore_ast.h | 855 + Include/internal/pycore_ast_state.h | 255 + Include/internal/pycore_atomic.h | 6 +- Include/internal/pycore_atomic_funcs.h | 94 + Include/internal/pycore_bitutils.h | 176 + .../internal/pycore_blocks_output_buffer.h | 317 + Include/internal/pycore_byteswap.h | 88 - Include/internal/pycore_ceval.h | 36 +- Include/internal/pycore_code.h | 7 + Include/internal/pycore_compile.h | 44 + Include/internal/pycore_context.h | 2 +- Include/internal/pycore_fileutils.h | 5 + Include/internal/pycore_format.h | 27 + Include/internal/pycore_gc.h | 18 +- Include/internal/pycore_hamt.h | 14 +- Include/internal/pycore_import.h | 9 +- Include/internal/pycore_initconfig.h | 11 +- Include/internal/pycore_interp.h | 223 +- Include/internal/pycore_list.h | 20 + Include/internal/pycore_long.h | 57 +- Include/internal/pycore_moduleobject.h | 42 + Include/internal/pycore_object.h | 115 +- Include/internal/pycore_parser.h | 31 + Include/internal/pycore_pathconfig.h | 1 + Include/internal/pycore_pyarena.h | 64 + Include/internal/pycore_pyerrors.h | 6 + Include/internal/pycore_pylifecycle.h | 83 +- Include/internal/pycore_pymem.h | 3 - Include/internal/pycore_pystate.h | 23 +- Include/internal/pycore_runtime.h | 15 +- Include/internal/pycore_structseq.h | 21 + .../pycore_symtable.h} | 41 +- Include/internal/pycore_traceback.h | 14 +- .../{pycore_tupleobject.h => pycore_tuple.h} | 7 +- Include/internal/pycore_ucnhash.h | 34 + Include/internal/pycore_unionobject.h | 22 + Include/internal/pycore_warnings.h | 2 +- Include/intrcheck.h | 3 - Include/iterobject.h | 3 + Include/longobject.h | 22 - Include/methodobject.h | 14 +- Include/modsupport.h | 10 +- Include/moduleobject.h | 6 + Include/node.h | 47 - Include/object.h | 161 +- Include/objimpl.h | 42 +- Include/opcode.h | 32 +- Include/parsetok.h | 110 - Include/patchlevel.h | 6 +- Include/pyarena.h | 64 - Include/pyerrors.h | 10 +- Include/pyhash.h | 5 +- Include/pylifecycle.h | 3 - Include/pymath.h | 8 - Include/pymem.h | 39 +- Include/pyport.h | 23 +- Include/pythonrun.h | 185 +- Include/setobject.h | 9 +- Include/structmember.h | 1 + Include/token.h | 5 +- Include/typeslots.h | 4 + Include/ucnhash.h | 36 - Include/unicodeobject.h | 22 +- LICENSE | 6 +- Lib/__future__.py | 4 +- Lib/_aix_support.py | 26 +- Lib/_bootlocale.py | 46 - Lib/_collections_abc.py | 151 +- Lib/_compression.py | 12 +- Lib/_markupbase.py | 36 +- Lib/_osx_support.py | 13 +- Lib/_pydecimal.py | 2 +- Lib/_pyio.py | 94 +- Lib/_sitebuiltins.py | 2 +- Lib/abc.py | 38 + Lib/argparse.py | 27 +- Lib/ast.py | 105 +- Lib/asynchat.py | 8 + Lib/asyncio/__init__.py | 4 - Lib/asyncio/base_events.py | 40 +- Lib/asyncio/events.py | 39 +- Lib/asyncio/futures.py | 10 +- Lib/asyncio/locks.py | 86 +- Lib/asyncio/mixins.py | 31 + Lib/asyncio/proactor_events.py | 45 +- Lib/asyncio/protocols.py | 4 + Lib/asyncio/queues.py | 25 +- Lib/asyncio/runners.py | 3 +- Lib/asyncio/selector_events.py | 22 +- Lib/asyncio/sslproto.py | 6 - Lib/asyncio/streams.py | 51 +- Lib/asyncio/subprocess.py | 30 +- Lib/asyncio/tasks.py | 139 +- Lib/asyncio/transports.py | 6 - Lib/asyncio/unix_events.py | 36 +- Lib/asyncio/windows_events.py | 5 - Lib/asyncore.py | 23 +- Lib/base64.py | 86 +- Lib/bdb.py | 29 +- Lib/bisect.py | 70 +- Lib/bz2.py | 120 +- Lib/calendar.py | 21 +- Lib/cgi.py | 7 +- Lib/cgitb.py | 4 +- Lib/codecs.py | 2 +- Lib/codeop.py | 29 +- Lib/collections/__init__.py | 96 +- Lib/colorsys.py | 15 +- Lib/compileall.py | 19 +- Lib/concurrent/futures/_base.py | 15 +- Lib/concurrent/futures/process.py | 55 +- Lib/concurrent/futures/thread.py | 6 - Lib/configparser.py | 3 +- Lib/contextlib.py | 72 +- Lib/copy.py | 5 +- Lib/copyreg.py | 6 + Lib/csv.py | 12 +- Lib/ctypes/_aix.py | 2 +- Lib/ctypes/test/__init__.py | 4 +- Lib/ctypes/test/test_bitfields.py | 3 - Lib/ctypes/test/test_find.py | 9 +- Lib/ctypes/test/test_functions.py | 18 +- Lib/ctypes/test/test_loading.py | 6 +- Lib/ctypes/test/test_numbers.py | 3 +- Lib/ctypes/test/test_python_api.py | 8 +- Lib/ctypes/test/test_struct_fields.py | 8 + Lib/ctypes/test/test_structures.py | 4 +- Lib/ctypes/test/test_values.py | 6 +- Lib/dataclasses.py | 249 +- Lib/datetime.py | 55 +- Lib/difflib.py | 2 +- Lib/dis.py | 44 +- Lib/distutils/__init__.py | 7 + Lib/distutils/ccompiler.py | 2 +- Lib/distutils/command/__init__.py | 1 - Lib/distutils/command/bdist.py | 4 +- Lib/distutils/command/bdist_msi.py | 2 - Lib/distutils/command/bdist_wininst.py | 377 - Lib/distutils/command/install.py | 98 +- Lib/distutils/command/wininst-10.0-amd64.exe | Bin 222208 -> 0 bytes Lib/distutils/command/wininst-10.0.exe | Bin 190976 -> 0 bytes Lib/distutils/command/wininst-14.0-amd64.exe | Bin 587776 -> 0 bytes Lib/distutils/command/wininst-14.0.exe | Bin 458240 -> 0 bytes Lib/distutils/command/wininst-6.0.exe | Bin 61440 -> 0 bytes Lib/distutils/command/wininst-7.1.exe | Bin 65536 -> 0 bytes Lib/distutils/command/wininst-8.0.exe | Bin 61440 -> 0 bytes Lib/distutils/command/wininst-9.0-amd64.exe | Bin 224256 -> 0 bytes Lib/distutils/command/wininst-9.0.exe | Bin 196096 -> 0 bytes Lib/distutils/extension.py | 3 +- Lib/distutils/sysconfig.py | 636 +- Lib/distutils/tests/__init__.py | 3 +- Lib/distutils/tests/support.py | 4 +- Lib/distutils/tests/test_archive_util.py | 4 +- Lib/distutils/tests/test_bdist.py | 17 +- Lib/distutils/tests/test_bdist_msi.py | 3 +- Lib/distutils/tests/test_bdist_rpm.py | 4 +- Lib/distutils/tests/test_bdist_wininst.py | 38 - Lib/distutils/tests/test_build_clib.py | 10 + Lib/distutils/tests/test_build_ext.py | 6 +- Lib/distutils/tests/test_config_cmd.py | 4 + Lib/distutils/tests/test_core.py | 10 +- Lib/distutils/tests/test_dist.py | 3 +- Lib/distutils/tests/test_extension.py | 3 +- Lib/distutils/tests/test_file_util.py | 4 +- Lib/distutils/tests/test_filelist.py | 16 +- Lib/distutils/tests/test_install.py | 17 +- Lib/distutils/tests/test_register.py | 3 +- Lib/distutils/tests/test_sdist.py | 3 +- Lib/distutils/tests/test_spawn.py | 18 +- Lib/distutils/tests/test_sysconfig.py | 5 +- Lib/distutils/tests/test_unixccompiler.py | 6 +- Lib/distutils/tests/test_util.py | 3 +- Lib/distutils/unixccompiler.py | 3 +- Lib/distutils/util.py | 3 + Lib/doctest.py | 51 +- Lib/email/_encoded_words.py | 10 +- Lib/email/_header_value_parser.py | 2 +- Lib/email/_parseaddr.py | 4 +- Lib/email/base64mime.py | 2 +- Lib/email/charset.py | 10 +- Lib/email/errors.py | 3 + Lib/email/headerregistry.py | 13 +- Lib/email/utils.py | 5 +- Lib/encodings/__init__.py | 3 +- Lib/encodings/idna.py | 32 +- Lib/encodings/raw_unicode_escape.py | 9 +- Lib/encodings/unicode_escape.py | 9 +- Lib/ensurepip/__init__.py | 122 +- .../_bundled/pip-21.2.3-py3-none-any.whl | Bin 0 -> 1563443 bytes .../_bundled/pip-22.0.4-py3-none-any.whl | Bin 2123599 -> 0 bytes ...whl => setuptools-57.4.0-py3-none-any.whl} | Bin 816725 -> 819017 bytes Lib/enum.py | 41 +- Lib/filecmp.py | 9 +- Lib/fileinput.py | 67 +- Lib/formatter.py | 452 - Lib/fractions.py | 125 +- Lib/functools.py | 47 +- Lib/glob.py | 151 +- Lib/gzip.py | 9 +- Lib/hashlib.py | 7 + Lib/hmac.py | 86 +- Lib/html/entities.py | 1 - Lib/html/parser.py | 2 +- Lib/http/__init__.py | 1 + Lib/http/client.py | 92 +- Lib/http/cookiejar.py | 40 +- Lib/http/server.py | 51 +- Lib/idlelib/ChangeLog | 2 +- Lib/idlelib/Icons/idle_16.gif | Bin 634 -> 1034 bytes Lib/idlelib/Icons/idle_16.png | Bin 1031 -> 1264 bytes Lib/idlelib/Icons/idle_256.png | Bin 39205 -> 42839 bytes Lib/idlelib/Icons/idle_32.gif | Bin 1019 -> 1435 bytes Lib/idlelib/Icons/idle_32.png | Bin 2036 -> 2542 bytes Lib/idlelib/Icons/idle_48.png | Bin 3977 -> 4710 bytes Lib/idlelib/Icons/minusnode.gif | Bin 75 -> 96 bytes Lib/idlelib/Icons/plusnode.gif | Bin 78 -> 79 bytes Lib/idlelib/Icons/python.gif | Bin 380 -> 585 bytes Lib/idlelib/Icons/tk.gif | Bin 72 -> 85 bytes Lib/idlelib/NEWS.txt | 59 +- Lib/idlelib/README.txt | 1 - Lib/idlelib/autocomplete.py | 5 +- Lib/idlelib/autocomplete_w.py | 9 +- Lib/idlelib/colorizer.py | 136 +- Lib/idlelib/editor.py | 35 +- Lib/idlelib/help.html | 27 +- Lib/idlelib/help_about.py | 14 +- Lib/idlelib/history.py | 4 +- Lib/idlelib/idle_test/example_noext | 4 - Lib/idlelib/idle_test/example_stub.pyi | 2 - Lib/idlelib/idle_test/htest.py | 10 +- Lib/idlelib/idle_test/mock_tk.py | 2 +- Lib/idlelib/idle_test/test_autocomplete_w.py | 2 +- Lib/idlelib/idle_test/test_browser.py | 18 +- Lib/idlelib/idle_test/test_calltip.py | 2 +- Lib/idlelib/idle_test/test_colorizer.py | 239 +- Lib/idlelib/idle_test/test_editor.py | 8 - Lib/idlelib/idle_test/test_iomenu.py | 24 +- Lib/idlelib/idle_test/test_multicall.py | 2 +- Lib/idlelib/idle_test/test_pyparse.py | 2 +- Lib/idlelib/idle_test/test_pyshell.py | 84 + Lib/idlelib/idle_test/test_query.py | 4 +- Lib/idlelib/idle_test/test_run.py | 47 +- Lib/idlelib/idle_test/test_sidebar.py | 408 +- Lib/idlelib/idle_test/test_squeezer.py | 33 +- Lib/idlelib/idle_test/test_util.py | 14 - .../idle_test/tkinter_testing_utils.py | 62 + Lib/idlelib/iomenu.py | 5 +- Lib/idlelib/mainmenu.py | 4 +- Lib/idlelib/percolator.py | 15 + Lib/idlelib/pyparse.py | 12 +- Lib/idlelib/pyshell.py | 211 +- Lib/idlelib/query.py | 2 +- Lib/idlelib/replace.py | 20 +- Lib/idlelib/run.py | 27 +- Lib/idlelib/sidebar.py | 508 +- Lib/idlelib/squeezer.py | 12 +- Lib/idlelib/util.py | 22 - Lib/imaplib.py | 13 +- Lib/imp.py | 3 +- Lib/importlib/__init__.py | 14 +- Lib/importlib/_abc.py | 54 + Lib/importlib/_adapters.py | 82 + Lib/importlib/_bootstrap.py | 80 +- Lib/importlib/_bootstrap_external.py | 195 +- Lib/importlib/_common.py | 85 +- Lib/importlib/abc.py | 136 +- Lib/importlib/machinery.py | 2 - Lib/importlib/metadata.py | 604 - Lib/importlib/metadata/__init__.py | 1007 + Lib/importlib/metadata/_adapters.py | 68 + Lib/importlib/metadata/_collections.py | 30 + Lib/importlib/metadata/_functools.py | 85 + Lib/importlib/metadata/_itertools.py | 19 + Lib/importlib/metadata/_meta.py | 47 + Lib/importlib/metadata/_text.py | 99 + Lib/importlib/readers.py | 123 + Lib/importlib/resources.py | 220 +- Lib/importlib/util.py | 14 +- Lib/inspect.py | 169 +- Lib/io.py | 19 +- Lib/ipaddress.py | 26 +- Lib/json/__init__.py | 4 +- Lib/json/encoder.py | 2 +- Lib/json/tool.py | 21 +- Lib/keyword.py | 7 +- Lib/lib2to3/fixes/fix_metaclass.py | 2 +- Lib/lib2to3/fixes/fix_paren.py | 2 +- Lib/lib2to3/pgen2/pgen.py | 2 +- Lib/lib2to3/pytree.py | 4 +- Lib/lib2to3/tests/data/infinite_recursion.py | 4 +- Lib/lib2to3/tests/data/py2_test_grammar.py | 7 +- Lib/lib2to3/tests/data/py3_test_grammar.py | 7 +- Lib/lib2to3/tests/test_all_fixers.py | 19 +- Lib/lib2to3/tests/test_parser.py | 53 +- Lib/linecache.py | 13 +- Lib/locale.py | 98 +- Lib/logging/__init__.py | 62 +- Lib/logging/config.py | 5 +- Lib/logging/handlers.py | 53 +- Lib/lzma.py | 5 + Lib/mailcap.py | 26 +- Lib/mimetypes.py | 51 +- Lib/multiprocessing/connection.py | 5 + Lib/multiprocessing/managers.py | 22 +- Lib/multiprocessing/queues.py | 23 +- Lib/multiprocessing/resource_tracker.py | 10 +- Lib/multiprocessing/util.py | 4 +- Lib/netrc.py | 8 +- Lib/ntpath.py | 23 +- Lib/opcode.py | 25 +- Lib/os.py | 100 +- Lib/pathlib.py | 354 +- Lib/pdb.py | 3 - Lib/pickle.py | 3 +- Lib/pipes.py | 4 +- Lib/pkgutil.py | 21 +- Lib/platform.py | 72 +- Lib/posixpath.py | 29 +- Lib/pprint.py | 223 +- Lib/pty.py | 47 +- Lib/py_compile.py | 71 +- Lib/pyclbr.py | 320 +- Lib/pydoc.py | 42 +- Lib/pydoc_data/topics.py | 2394 +- Lib/queue.py | 2 +- Lib/random.py | 85 +- Lib/re.py | 1 - Lib/rlcompleter.py | 9 +- Lib/runpy.py | 39 +- Lib/sched.py | 20 +- Lib/shelve.py | 4 +- Lib/shutil.py | 46 +- Lib/signal.py | 13 +- Lib/site.py | 53 +- Lib/smtpd.py | 17 +- Lib/smtplib.py | 8 +- Lib/socket.py | 7 +- Lib/sqlite3/__init__.py | 46 +- Lib/sqlite3/dbapi2.py | 14 + Lib/sqlite3/test/backup.py | 13 +- Lib/sqlite3/test/dbapi.py | 289 +- Lib/sqlite3/test/dump.py | 11 +- Lib/sqlite3/test/factory.py | 80 +- Lib/sqlite3/test/hooks.py | 66 +- Lib/sqlite3/test/regression.py | 119 +- Lib/sqlite3/test/transactions.py | 47 +- Lib/sqlite3/test/types.py | 128 +- Lib/sqlite3/test/userfunctions.py | 228 +- Lib/sre_compile.py | 30 +- Lib/sre_constants.py | 2 - Lib/sre_parse.py | 18 +- Lib/ssl.py | 88 +- Lib/statistics.py | 195 +- Lib/subprocess.py | 53 +- Lib/symbol.py | 122 - Lib/symtable.py | 74 +- Lib/sysconfig.py | 274 +- Lib/tarfile.py | 104 +- Lib/tempfile.py | 64 +- Lib/test/_test_atexit.py | 121 + .../eintr_tester.py => _test_eintr.py} | 13 +- Lib/test/_test_embed_set_config.py | 261 + Lib/test/_test_multiprocessing.py | 103 +- Lib/test/ann_module.py | 2 + Lib/test/ann_module4.py | 5 + Lib/test/ann_module5.py | 10 - Lib/test/ann_module6.py | 7 - Lib/test/ann_module7.py | 11 - Lib/test/audiotests.py | 3 +- Lib/test/audit-tests.py | 41 +- Lib/test/clinic.test | 115 +- Lib/test/datetimetester.py | 196 +- Lib/test/decimaltestdata/abs.decTest | 2 +- Lib/test/decimaltestdata/extra.decTest | 2 +- Lib/test/exception_hierarchy.txt | 1 + Lib/test/fork_wait.py | 5 +- Lib/test/imghdrdata/python.gif | Bin 405 -> 610 bytes Lib/test/inspect_stock_annotations.py | 28 + Lib/test/inspect_stringized_annotations.py | 34 + Lib/test/inspect_stringized_annotations_2.py | 3 + Lib/test/libregrtest/cmdline.py | 3 +- Lib/test/libregrtest/main.py | 67 +- Lib/test/libregrtest/pgo.py | 1 + Lib/test/libregrtest/refleak.py | 105 +- Lib/test/libregrtest/runtest.py | 37 +- Lib/test/libregrtest/runtest_mp.py | 31 +- Lib/test/libregrtest/save_env.py | 99 +- Lib/test/libregrtest/setup.py | 43 +- Lib/test/libregrtest/utils.py | 135 + Lib/test/libregrtest/win_utils.py | 258 +- Lib/test/list_tests.py | 14 - Lib/test/lock_tests.py | 11 +- Lib/test/make_ssl_certs.py | 2 +- Lib/test/mime.types | 6 +- Lib/test/multibytecodec_support.py | 2 +- Lib/test/pickletester.py | 51 +- Lib/test/pydoc_mod.py | 11 - Lib/test/pythoninfo.py | 45 +- Lib/test/string_tests.py | 39 + Lib/test/support/__init__.py | 1387 +- Lib/test/support/bytecode_helper.py | 3 +- Lib/test/support/import_helper.py | 238 + Lib/test/support/interpreters.py | 197 + Lib/test/support/os_helper.py | 612 + Lib/test/support/script_helper.py | 34 +- Lib/test/support/socket_helper.py | 6 +- Lib/test/support/testresult.py | 28 +- Lib/test/support/threading_helper.py | 209 + Lib/test/test___all__.py | 24 +- Lib/test/test__opcode.py | 2 +- Lib/test/test__osx_support.py | 20 +- Lib/test/test__xxsubinterpreters.py | 30 +- Lib/test/test_abc.py | 149 + Lib/test/test_aifc.py | 4 +- Lib/test/test_argparse.py | 320 +- Lib/test/test_array.py | 110 +- Lib/test/test_asdl_parser.py | 10 +- Lib/test/test_ast.py | 202 +- Lib/test/test_asyncgen.py | 388 +- Lib/test/test_asynchat.py | 29 +- Lib/test/test_asyncio/__init__.py | 10 +- Lib/test/test_asyncio/functional.py | 2 +- Lib/test/test_asyncio/test_asyncio_waitfor.py | 61 + Lib/test/test_asyncio/test_base_events.py | 19 +- Lib/test/test_asyncio/test_context.py | 4 - Lib/test/test_asyncio/test_events.py | 96 +- Lib/test/test_asyncio/test_futures.py | 69 +- Lib/test/test_asyncio/test_futures2.py | 8 - Lib/test/test_asyncio/test_locks.py | 662 +- Lib/test/test_asyncio/test_pep492.py | 26 +- Lib/test/test_asyncio/test_proactor_events.py | 89 +- Lib/test/test_asyncio/test_protocols.py | 10 - Lib/test/test_asyncio/test_queues.py | 185 +- Lib/test/test_asyncio/test_runners.py | 10 +- Lib/test/test_asyncio/test_selector_events.py | 20 - Lib/test/test_asyncio/test_sendfile.py | 21 +- Lib/test/test_asyncio/test_server.py | 10 +- Lib/test/test_asyncio/test_sock_lowlevel.py | 9 +- Lib/test/test_asyncio/test_sslproto.py | 35 +- Lib/test/test_asyncio/test_streams.py | 135 +- Lib/test/test_asyncio/test_subprocess.py | 29 +- Lib/test/test_asyncio/test_tasks.py | 714 +- Lib/test/test_asyncio/test_transports.py | 6 - Lib/test/test_asyncio/test_unix_events.py | 275 +- Lib/test/test_asyncio/test_waitfor.py | 294 - Lib/test/test_asyncio/utils.py | 16 +- Lib/test/test_asyncore.py | 43 +- Lib/test/test_atexit.py | 190 +- Lib/test/test_audit.py | 49 +- Lib/test/test_base64.py | 123 +- Lib/test/test_baseexception.py | 5 +- Lib/test/test_bdb.py | 65 +- Lib/test/test_bigaddrspace.py | 5 +- Lib/test/test_bigmem.py | 5 +- Lib/test/test_binascii.py | 23 +- Lib/test/test_binhex.py | 20 +- Lib/test/test_bisect.py | 64 +- Lib/test/test_bool.py | 38 +- Lib/test/test_buffer.py | 3 +- Lib/test/test_bufio.py | 9 +- Lib/test/test_builtin.py | 150 +- Lib/test/test_bytes.py | 34 +- Lib/test/test_bz2.py | 35 +- Lib/test/test_c_locale_coercion.py | 9 +- Lib/test/test_calendar.py | 44 +- Lib/test/test_call.py | 48 + Lib/test/test_capi.py | 209 +- Lib/test/test_cgi.py | 9 +- Lib/test/test_cgitb.py | 2 +- Lib/test/test_charmapcodec.py | 7 +- Lib/test/test_clinic.py | 3 +- Lib/test/test_cmath.py | 2 +- Lib/test/test_cmd_line.py | 95 +- Lib/test/test_cmd_line_script.py | 126 +- Lib/test/test_code.py | 11 +- Lib/test/test_code_module.py | 5 +- Lib/test/test_codeccallbacks.py | 177 +- Lib/test/test_codecs.py | 197 +- Lib/test/test_codeop.py | 9 +- Lib/test/test_collections.py | 95 +- Lib/test/test_compile.py | 270 +- Lib/test/test_compileall.py | 124 +- Lib/test/test_complex.py | 82 +- Lib/test/test_concurrent_futures.py | 179 +- Lib/test/test_configparser.py | 39 +- Lib/test/test_context.py | 35 - Lib/test/test_contextlib.py | 43 +- Lib/test/test_contextlib_async.py | 130 +- Lib/test/test_copy.py | 17 +- Lib/test/test_coroutines.py | 13 +- Lib/test/test_crypt.py | 3 - Lib/test/test_csv.py | 144 +- Lib/test/test_ctypes.py | 3 +- Lib/test/test_curses.py | 94 +- Lib/test/test_dataclasses.py | 472 +- Lib/test/test_datetime.py | 94 +- Lib/test/test_dbm.py | 121 +- Lib/test/test_dbm_dumb.py | 14 +- Lib/test/test_dbm_gnu.py | 11 +- Lib/test/test_dbm_ndbm.py | 15 +- Lib/test/test_decimal.py | 60 +- Lib/test/test_decorators.py | 116 +- Lib/test/test_defaultdict.py | 33 - Lib/test/test_deque.py | 38 +- Lib/test/test_descr.py | 124 +- Lib/test/test_devpoll.py | 7 +- Lib/test/test_dict.py | 136 +- Lib/test/test_dict_version.py | 6 +- Lib/test/test_difflib.py | 18 +- Lib/test/test_dis.py | 389 +- Lib/test/test_distutils.py | 24 +- Lib/test/test_doctest.py | 88 +- Lib/test/test_doctest2.py | 21 +- Lib/test/test_dtrace.py | 21 +- Lib/test/test_eintr.py | 21 +- Lib/test/test_email/__init__.py | 2 +- Lib/test/test_email/data/PyBanner048.gif | Bin 896 -> 954 bytes Lib/test/test_email/test__encoded_words.py | 7 - .../test_email/test__header_value_parser.py | 2 +- Lib/test/test_email/test_email.py | 84 +- Lib/test/test_email/test_headerregistry.py | 28 +- Lib/test/test_email/test_inversion.py | 8 + Lib/test/test_email/test_message.py | 2 +- Lib/test/test_email/test_utils.py | 10 + Lib/test/test_embed.py | 260 +- Lib/test/test_ensurepip.py | 69 +- Lib/test/test_enum.py | 94 +- Lib/test/test_eof.py | 38 +- Lib/test/test_exception_hierarchy.py | 4 +- Lib/test/test_exceptions.py | 898 +- Lib/test/test_faulthandler.py | 143 +- Lib/test/test_fcntl.py | 30 +- Lib/test/test_file.py | 14 +- Lib/test/test_file_eintr.py | 2 +- Lib/test/test_filecmp.py | 77 +- Lib/test/test_fileinput.py | 124 +- Lib/test/test_fileio.py | 19 +- Lib/test/test_float.py | 26 +- Lib/test/test_flufl.py | 6 +- Lib/test/test_format.py | 4 +- Lib/test/test_fractions.py | 2 + Lib/test/test_frame.py | 21 + Lib/test/test_fstring.py | 56 +- Lib/test/test_ftplib.py | 58 +- Lib/test/test_funcattrs.py | 32 + Lib/test/test_functools.py | 278 +- Lib/test/test_future.py | 83 +- Lib/test/test_gc.py | 48 +- Lib/test/test_gdb.py | 39 +- Lib/test/test_generators.py | 10 +- Lib/test/test_genericalias.py | 82 +- Lib/test/test_genericpath.py | 103 +- Lib/test/test_genexps.py | 2 +- Lib/test/test_getargs2.py | 145 +- Lib/test/test_getopt.py | 3 +- Lib/test/test_gettext.py | 9 +- Lib/test/test_glob.py | 54 +- Lib/test/test_global.py | 15 +- Lib/test/test_grammar.py | 266 +- Lib/test/test_graphlib.py | 17 +- Lib/test/test_grp.py | 9 +- Lib/test/test_gzip.py | 51 +- Lib/test/test_hashlib.py | 124 +- Lib/test/test_heapq.py | 5 +- Lib/test/test_hmac.py | 123 +- Lib/test/test_htmlparser.py | 22 - Lib/test/test_http_cookiejar.py | 34 +- Lib/test/test_httplib.py | 52 +- Lib/test/test_httpservers.py | 122 +- Lib/test/test_idle.py | 6 +- Lib/test/test_imaplib.py | 68 +- Lib/test/test_imghdr.py | 4 +- Lib/test/test_imp.py | 46 +- Lib/test/test_import/__init__.py | 74 +- .../test_importlib/builtin/test_finder.py | 16 +- .../test_importlib/builtin/test_loader.py | 5 +- .../extension/test_case_sensitivity.py | 18 +- .../test_importlib/extension/test_finder.py | 11 +- .../test_importlib/extension/test_loader.py | 77 +- Lib/test/test_importlib/fixtures.py | 100 +- Lib/test/test_importlib/frozen/test_finder.py | 5 +- Lib/test/test_importlib/frozen/test_loader.py | 18 +- .../test_importlib/import_/test___loader__.py | 39 +- .../import_/test___package__.py | 25 + Lib/test/test_importlib/import_/test_api.py | 31 + .../test_importlib/import_/test_caching.py | 39 +- .../test_importlib/import_/test_fromlist.py | 26 +- .../test_importlib/import_/test_meta_path.py | 14 +- .../test_importlib/import_/test_packages.py | 3 +- Lib/test/test_importlib/import_/test_path.py | 32 +- .../namespacedata01/binary.file | Bin 0 -> 4 bytes .../namespacedata01/utf-16.file | Bin 0 -> 44 bytes .../test_importlib/namespacedata01/utf-8.file | 1 + .../source/test_case_sensitivity.py | 11 +- .../test_importlib/source/test_file_loader.py | 12 +- Lib/test/test_importlib/source/test_finder.py | 4 +- Lib/test/test_importlib/test_abc.py | 111 +- Lib/test/test_importlib/test_api.py | 46 +- Lib/test/test_importlib/test_files.py | 4 +- Lib/test/test_importlib/test_locks.py | 15 +- Lib/test/test_importlib/test_main.py | 112 +- Lib/test/test_importlib/test_metadata_api.py | 236 +- .../test_importlib/test_namespace_pkgs.py | 41 +- Lib/test/test_importlib/test_open.py | 27 +- Lib/test/test_importlib/test_path.py | 19 + Lib/test/test_importlib/test_pkg_import.py | 4 +- Lib/test/test_importlib/test_read.py | 15 +- Lib/test/test_importlib/test_reader.py | 128 + Lib/test/test_importlib/test_resource.py | 193 +- Lib/test/test_importlib/test_spec.py | 64 +- .../test_importlib/test_threaded_import.py | 29 +- Lib/test/test_importlib/test_util.py | 32 +- Lib/test/test_importlib/test_windows.py | 55 +- Lib/test/test_importlib/test_zip.py | 14 +- Lib/test/test_importlib/update-zips.py | 53 + Lib/test/test_importlib/util.py | 22 +- .../test_importlib/zipdata01/ziptestdata.zip | Bin 876 -> 876 bytes .../test_importlib/zipdata02/ziptestdata.zip | Bin 698 -> 698 bytes Lib/test/test_inspect.py | 340 +- Lib/test/test_int.py | 203 +- Lib/test/test_interpreters.py | 745 + Lib/test/test_io.py | 483 +- Lib/test/test_ioctl.py | 3 +- Lib/test/test_ipaddress.py | 32 +- Lib/test/test_isinstance.py | 77 +- Lib/test/test_iter.py | 57 +- Lib/test/test_itertools.py | 124 +- Lib/test/test_json/__init__.py | 6 +- Lib/test/test_json/test_decode.py | 9 - Lib/test/test_json/test_recursion.py | 19 +- Lib/test/test_json/test_speedups.py | 9 - Lib/test/test_json/test_tool.py | 20 +- Lib/test/test_keyword.py | 6 +- Lib/test/test_keywordonlyarg.py | 3 +- Lib/test/test_largefile.py | 3 +- Lib/test/test_lib2to3.py | 3 +- Lib/test/test_linecache.py | 31 +- Lib/test/test_list.py | 13 - Lib/test/test_lltrace.py | 10 +- Lib/test/test_locale.py | 33 +- Lib/test/test_logging.py | 365 +- Lib/test/test_long.py | 11 + Lib/test/test_lzma.py | 30 +- Lib/test/test_mailbox.py | 75 +- Lib/test/test_mailcap.py | 15 +- Lib/test/test_marshal.py | 80 +- Lib/test/test_math.py | 107 +- Lib/test/test_memoryview.py | 4 +- Lib/test/test_mimetypes.py | 74 +- Lib/test/test_minidom.py | 17 +- Lib/test/test_mmap.py | 5 +- Lib/test/test_module.py | 57 +- Lib/test/test_msilib.py | 13 +- Lib/test/test_multibytecodec.py | 37 +- .../test_multiprocessing_main_handling.py | 36 +- Lib/test/test_named_expressions.py | 27 +- Lib/test/test_netrc.py | 91 +- Lib/test/test_nis.py | 4 +- Lib/test/test_nntplib.py | 40 +- Lib/test/test_ntpath.py | 199 +- Lib/test/test_opcache.py | 23 + Lib/test/test_opcodes.py | 9 +- Lib/test/test_operator.py | 8 +- Lib/test/test_optparse.py | 38 +- Lib/test/test_ordered_dict.py | 18 +- Lib/test/test_os.py | 669 +- Lib/test/test_ossaudiodev.py | 8 +- Lib/test/test_osx_env.py | 2 +- Lib/test/test_parser.py | 1046 - Lib/test/test_pathlib.py | 215 +- Lib/test/test_patma.py | 3176 ++ Lib/test/test_pdb.py | 208 +- Lib/test/test_peepholer.py | 16 - Lib/test/test_peg_generator/__init__.py | 12 +- Lib/test/test_peg_generator/test_c_parser.py | 96 +- .../test_grammar_validator.py | 51 + Lib/test/test_peg_parser.py | 798 - Lib/test/test_pickle.py | 59 +- Lib/test/test_picklebuffer.py | 8 +- Lib/test/test_pickletools.py | 69 +- Lib/test/test_pipes.py | 14 +- Lib/test/test_pkgutil.py | 59 +- Lib/test/test_platform.py | 115 +- Lib/test/test_plistlib.py | 11 +- Lib/test/test_poll.py | 14 +- Lib/test/test_popen.py | 3 + Lib/test/test_poplib.py | 31 +- Lib/test/test_posix.py | 731 +- Lib/test/test_posixpath.py | 154 +- Lib/test/test_pprint.py | 160 +- Lib/test/test_print.py | 18 +- Lib/test/test_profile.py | 9 +- Lib/test/test_property.py | 50 + Lib/test/test_pstats.py | 7 - Lib/test/test_pty.py | 196 +- Lib/test/test_pwd.py | 4 +- Lib/test/test_py_compile.py | 26 +- Lib/test/test_pyclbr.py | 29 +- Lib/test/test_pydoc.py | 102 +- Lib/test/test_queue.py | 38 +- Lib/test/test_raise.py | 31 +- Lib/test/test_random.py | 90 +- Lib/test/test_range.py | 6 + Lib/test/test_re.py | 185 +- Lib/test/test_readline.py | 29 +- Lib/test/test_regrtest.py | 78 +- Lib/test/test_reprlib.py | 7 +- Lib/test/test_resource.py | 13 +- Lib/test/test_rlcompleter.py | 8 +- Lib/test/test_robotparser.py | 3 +- Lib/test/test_runpy.py | 9 +- Lib/test/test_sax.py | 202 +- Lib/test/test_sched.py | 16 +- Lib/test/test_scope.py | 3 - Lib/test/test_select.py | 37 +- Lib/test/test_selectors.py | 30 +- Lib/test/test_set.py | 224 +- Lib/test/test_shelve.py | 130 +- Lib/test/test_shutil.py | 190 +- Lib/test/test_signal.py | 29 +- Lib/test/test_site.py | 28 +- Lib/test/test_smtpd.py | 58 +- Lib/test/test_smtplib.py | 48 +- Lib/test/test_smtpnet.py | 3 +- Lib/test/test_socket.py | 269 +- Lib/test/test_socketserver.py | 23 +- Lib/test/test_source_encoding.py | 21 +- Lib/test/test_spwd.py | 5 +- Lib/test/test_sqlite.py | 3 +- Lib/test/test_ssl.py | 984 +- Lib/test/test_startfile.py | 13 +- Lib/test/test_stat.py | 14 +- Lib/test/test_statistics.py | 107 +- Lib/test/test_strftime.py | 2 +- Lib/test/test_string_literals.py | 7 +- Lib/test/test_structmembers.py | 17 +- Lib/test/test_structseq.py | 12 + Lib/test/test_subprocess.py | 109 +- Lib/test/test_sundry.py | 9 +- Lib/test/test_support.py | 115 +- Lib/test/test_symbol.py | 58 - Lib/test/test_symtable.py | 7 + Lib/test/test_syntax.py | 684 +- Lib/test/test_sys.py | 159 +- Lib/test/test_sys_settrace.py | 630 +- Lib/test/test_sysconfig.py | 76 +- Lib/test/test_syslog.py | 5 +- Lib/test/test_tabnanny.py | 8 +- Lib/test/test_tarfile.py | 236 +- Lib/test/test_tcl.py | 28 +- Lib/test/test_telnetlib.py | 4 +- Lib/test/test_tempfile.py | 193 +- Lib/test/test_textwrap.py | 72 + Lib/test/test_thread.py | 20 +- Lib/test/test_threadedtempfile.py | 4 +- Lib/test/test_threading.py | 284 +- Lib/test/test_threading_local.py | 13 +- Lib/test/test_threadsignals.py | 19 +- Lib/test/test_time.py | 48 +- Lib/test/test_timeit.py | 9 + Lib/test/test_timeout.py | 18 +- Lib/test/test_tix.py | 14 +- Lib/test/test_tk.py | 17 +- Lib/test/test_tokenize.py | 5 +- Lib/test/test_tools/__init__.py | 12 +- .../test_tools/test_c_analyzer/__init__.py | 15 - .../test_tools/test_c_analyzer/__main__.py | 5 - .../test_c_analyzer/test_common/__init__.py | 6 - .../test_c_analyzer/test_common/test_files.py | 470 - .../test_c_analyzer/test_common/test_info.py | 197 - .../test_c_analyzer/test_common/test_show.py | 54 - .../test_c_analyzer/test_cpython/__init__.py | 6 - .../test_cpython/test___main__.py | 296 - .../test_cpython/test_functional.py | 34 - .../test_cpython/test_supported.py | 98 - .../test_c_analyzer/test_parser/__init__.py | 6 - .../test_parser/test_declarations.py | 795 - .../test_parser/test_preprocessor.py | 1561 - .../test_c_analyzer/test_symbols/__init__.py | 6 - .../test_c_analyzer/test_symbols/test_info.py | 192 - .../test_variables/__init__.py | 6 - .../test_variables/test_find.py | 124 - .../test_variables/test_info.py | 244 - .../test_variables/test_known.py | 139 - Lib/test/test_tools/test_c_analyzer/util.py | 60 - Lib/test/test_tools/test_fixcid.py | 15 +- Lib/test/test_tools/test_i18n.py | 72 +- Lib/test/test_tools/test_lll.py | 3 +- Lib/test/test_tools/test_md5sum.py | 10 +- Lib/test/test_tools/test_pathfix.py | 9 +- Lib/test/test_tools/test_pindent.py | 3 +- Lib/test/test_tools/test_sundry.py | 16 +- Lib/test/test_trace.py | 3 +- Lib/test/test_traceback.py | 210 +- Lib/test/test_tracemalloc.py | 25 +- Lib/test/test_ttk_guionly.py | 48 +- Lib/test/test_ttk_textonly.py | 464 +- Lib/test/test_turtle.py | 13 +- Lib/test/test_type_annotations.py | 103 + Lib/test/test_types.py | 385 +- Lib/test/test_typing.py | 935 +- Lib/test/test_ucn.py | 3 +- Lib/test/test_unicode.py | 117 +- Lib/test/test_unicode_file.py | 13 +- Lib/test/test_unicode_file_functions.py | 32 +- Lib/test/test_unicodedata.py | 8 +- Lib/test/test_unittest.py | 12 +- Lib/test/test_univnewlines.py | 16 +- Lib/test/test_unpack_ex.py | 55 +- Lib/test/test_unparse.py | 5 +- Lib/test/test_urllib.py | 48 +- Lib/test/test_urllib2.py | 47 +- Lib/test/test_urllib2_localnet.py | 49 +- Lib/test/test_urllib2net.py | 45 +- Lib/test/test_urllibnet.py | 7 +- Lib/test/test_utf8_mode.py | 27 + Lib/test/test_uu.py | 11 +- Lib/test/test_uuid.py | 7 +- Lib/test/test_venv.py | 24 +- Lib/test/test_warnings/__init__.py | 44 +- Lib/test/test_wave.py | 3 +- Lib/test/test_weakref.py | 25 +- Lib/test/test_weakset.py | 5 - Lib/test/test_webbrowser.py | 24 +- Lib/test/test_winconsoleio.py | 15 +- Lib/test/test_winreg.py | 8 +- Lib/test/test_winsound.py | 4 +- Lib/test/test_wsgiref.py | 5 +- Lib/test/test_xml_etree.py | 218 +- Lib/test/test_xml_etree_c.py | 14 +- Lib/test/test_xmlrpc.py | 36 +- Lib/test/test_xmlrpc_net.py | 9 +- Lib/test/test_xxlimited.py | 79 + Lib/test/test_xxtestfuzz.py | 4 +- Lib/test/test_yield_from.py | 3 + Lib/test/test_zipfile.py | 393 +- Lib/test/test_zipfile64.py | 5 +- Lib/test/test_zipimport.py | 227 +- Lib/test/test_zipimport_support.py | 9 +- Lib/test/test_zlib.py | 10 +- Lib/test/test_zoneinfo/_support.py | 2 +- Lib/test/test_zoneinfo/test_zoneinfo.py | 99 +- Lib/test/testtar.tar.xz | Bin 0 -> 172 bytes Lib/textwrap.py | 12 +- Lib/threading.py | 183 +- Lib/timeit.py | 1 + Lib/tkinter/__init__.py | 61 +- Lib/tkinter/commondialog.py | 29 +- Lib/tkinter/dnd.py | 22 +- Lib/tkinter/font.py | 14 +- Lib/tkinter/simpledialog.py | 79 +- Lib/tkinter/test/runtktests.py | 69 + .../test/test_tkinter/test_colorchooser.py | 35 +- Lib/tkinter/test/test_tkinter/test_font.py | 26 +- Lib/tkinter/test/test_tkinter/test_images.py | 19 +- Lib/tkinter/test/test_tkinter/test_loadtk.py | 6 +- .../test/test_tkinter/test_messagebox.py | 38 + Lib/tkinter/test/test_tkinter/test_misc.py | 22 +- .../test/test_tkinter/test_simpledialog.py | 30 +- Lib/tkinter/test/test_tkinter/test_text.py | 6 +- .../test/test_tkinter/test_variables.py | 12 +- Lib/tkinter/test/test_tkinter/test_widgets.py | 11 +- Lib/tkinter/test/test_ttk/test_extensions.py | 27 +- Lib/tkinter/test/test_ttk/test_functions.py | 460 + Lib/tkinter/test/test_ttk/test_style.py | 10 +- Lib/tkinter/test/test_ttk/test_widgets.py | 82 +- Lib/tkinter/tix.py | 15 +- Lib/tkinter/ttk.py | 7 +- Lib/token.py | 11 +- Lib/tokenize.py | 2 + Lib/trace.py | 2 +- Lib/traceback.py | 225 +- Lib/turtle.py | 21 +- Lib/types.py | 14 +- Lib/typing.py | 594 +- Lib/unittest/_log.py | 29 +- Lib/unittest/async_case.py | 24 +- Lib/unittest/case.py | 30 +- Lib/unittest/main.py | 2 +- Lib/unittest/mock.py | 103 +- Lib/unittest/result.py | 54 +- Lib/unittest/runner.py | 9 - Lib/unittest/test/test_assertions.py | 3 - Lib/unittest/test/test_async_case.py | 165 +- Lib/unittest/test/test_case.py | 92 +- Lib/unittest/test/test_discovery.py | 5 +- Lib/unittest/test/test_program.py | 20 +- Lib/unittest/test/test_result.py | 83 +- Lib/unittest/test/test_skipping.py | 66 - Lib/unittest/test/testmock/testasync.py | 4 +- Lib/unittest/test/testmock/testmock.py | 89 +- Lib/unittest/test/testmock/testpatch.py | 12 +- Lib/unittest/test/testmock/testsealable.py | 63 +- Lib/urllib/parse.py | 3 +- Lib/urllib/request.py | 46 +- Lib/venv/__init__.py | 29 +- Lib/venv/scripts/common/Activate.ps1 | 8 +- Lib/venv/scripts/common/activate | 3 + Lib/venv/scripts/nt/activate.bat | 1 + Lib/venv/scripts/nt/deactivate.bat | 1 + Lib/venv/scripts/posix/activate.csh | 3 +- Lib/venv/scripts/posix/activate.fish | 2 + Lib/webbrowser.py | 6 +- Lib/wsgiref/validate.py | 2 +- Lib/xml/etree/ElementPath.py | 32 +- Lib/xml/etree/ElementTree.py | 47 +- Lib/xml/sax/handler.py | 45 + Lib/xmlrpc/client.py | 10 +- Lib/zipfile.py | 82 +- Lib/zipimport.py | 170 +- Lib/zoneinfo/_common.py | 3 +- Lib/zoneinfo/_zoneinfo.py | 2 +- ...allows-to-build-on-releases-before-Y.patch | 59 + Mac/BuildScript/build-installer.py | 38 +- Mac/BuildScript/resources/License.rtf | 4 +- Mac/BuildScript/resources/ReadMe.rtf | 44 +- Mac/BuildScript/resources/Welcome.rtf | 4 +- Mac/IDLE/IDLE.app/Contents/Info.plist | 2 +- .../IDLE.app/Contents/Resources/idlemain.py | 2 +- Mac/PythonLauncher/Info.plist.in | 8 +- Mac/PythonLauncher/MyAppDelegate.m | 2 +- Mac/PythonLauncher/doscript.m | 2 +- Mac/README.rst | 4 +- Mac/Resources/app/Info.plist.in | 2 +- Mac/Resources/framework/Info.plist.in | 4 +- Makefile.pre.in | 320 +- Misc/ACKS | 46 +- Misc/HISTORY | 14 +- Misc/NEWS | 6631 +-- Misc/README.AIX | 5 - Misc/README.valgrind | 9 +- Misc/SpecialBuilds.txt | 82 +- Misc/python.man | 121 +- Misc/requirements-test.txt | 2 +- Misc/stable_abi.txt | 2160 + Modules/Setup | 51 +- Modules/_abc.c | 84 +- Modules/_asynciomodule.c | 246 +- Modules/_bisectmodule.c | 102 +- Modules/_blake2/blake2b_impl.c | 59 +- Modules/_blake2/blake2module.c | 121 +- Modules/_blake2/blake2s_impl.c | 60 +- Modules/_blake2/clinic/blake2b_impl.c.h | 27 +- Modules/_blake2/clinic/blake2s_impl.c.h | 27 +- Modules/_bz2module.c | 461 +- Modules/_codecsmodule.c | 68 +- Modules/_collectionsmodule.c | 104 +- Modules/_contextvarsmodule.c | 21 +- Modules/_cryptmodule.c | 3 - Modules/_csv.c | 618 +- Modules/_ctypes/_ctypes.c | 441 +- Modules/_ctypes/callbacks.c | 7 +- Modules/_ctypes/callproc.c | 53 +- Modules/_ctypes/cfield.c | 62 +- Modules/_ctypes/ctypes.h | 6 +- Modules/_ctypes/libffi_osx/README | 2 +- Modules/_ctypes/stgdict.c | 2 - Modules/_curses_panel.c | 270 +- Modules/_cursesmodule.c | 337 +- Modules/_datetimemodule.c | 333 +- Modules/_dbmmodule.c | 318 +- Modules/_decimal/_decimal.c | 58 +- Modules/_decimal/libmpdec/README.txt | 1 - Modules/_decimal/libmpdec/bench.c | 137 + Modules/_decimal/libmpdec/bench_full.c | 193 + Modules/_decimal/libmpdec/constants.c | 5 +- Modules/_decimal/libmpdec/context.c | 6 +- Modules/_decimal/libmpdec/crt.c | 18 +- Modules/_decimal/libmpdec/crt.h | 2 +- Modules/_decimal/libmpdec/examples/README.txt | 8 + Modules/_decimal/libmpdec/examples/compare.c | 77 + Modules/_decimal/libmpdec/examples/div.c | 77 + Modules/_decimal/libmpdec/examples/divmod.c | 82 + Modules/_decimal/libmpdec/examples/multiply.c | 77 + Modules/_decimal/libmpdec/examples/pow.c | 77 + Modules/_decimal/libmpdec/examples/powmod.c | 80 + Modules/_decimal/libmpdec/examples/shift.c | 77 + .../libmpdec/{vccompat.h => examples/sqrt.c} | 74 +- Modules/_decimal/libmpdec/io.c | 28 +- Modules/_decimal/libmpdec/mpalloc.c | 7 - Modules/_decimal/libmpdec/mpalloc.h | 10 +- Modules/_decimal/libmpdec/mpdecimal.c | 359 +- Modules/_decimal/libmpdec/mpdecimal.h | 84 +- Modules/_decimal/libmpdec/mpsignal.c | 967 + Modules/_decimal/libmpdec/typearith.h | 6 +- Modules/_decimal/tests/deccheck.py | 16 +- Modules/_elementtree.c | 31 +- Modules/_functoolsmodule.c | 558 +- Modules/_gdbmmodule.c | 385 +- Modules/_hashopenssl.c | 866 +- Modules/_heapqmodule.c | 67 +- Modules/_io/_iomodule.c | 74 +- Modules/_io/_iomodule.h | 1 - Modules/_io/bufferedio.c | 17 +- Modules/_io/clinic/_iomodule.c.h | 58 +- Modules/_io/clinic/bufferedio.c.h | 49 +- Modules/_io/clinic/bytesio.c.h | 14 +- Modules/_io/clinic/fileio.c.h | 12 +- Modules/_io/clinic/iobase.c.h | 9 +- Modules/_io/clinic/stringio.c.h | 14 +- Modules/_io/clinic/textio.c.h | 34 +- Modules/_io/clinic/winconsoleio.c.h | 18 +- Modules/_io/fileio.c | 19 +- Modules/_io/iobase.c | 9 +- Modules/_io/textio.c | 58 +- Modules/_io/winconsoleio.c | 139 +- Modules/_json.c | 77 +- Modules/_localemodule.c | 315 +- Modules/_lsprof.c | 290 +- Modules/_lzmamodule.c | 773 +- .../clinic/multiprocessing.c.h | 151 + .../_multiprocessing/clinic/posixshmem.c.h | 12 +- Modules/_multiprocessing/clinic/semaphore.c.h | 402 + Modules/_multiprocessing/multiprocessing.c | 193 +- Modules/_multiprocessing/multiprocessing.h | 2 +- Modules/_multiprocessing/posixshmem.c | 22 +- Modules/_multiprocessing/semaphore.c | 246 +- Modules/_opcode.c | 21 +- Modules/_operator.c | 342 +- Modules/_peg_parser.c | 153 - Modules/_pickle.c | 163 +- Modules/_posixsubprocess.c | 408 +- Modules/_queuemodule.c | 224 +- Modules/_randommodule.c | 111 +- Modules/_scproxy.c | 22 +- Modules/_sha3/kcp/KeccakSponge.inc | 15 +- Modules/_sha3/sha3module.c | 335 +- Modules/_sqlite/cache.c | 231 +- Modules/_sqlite/cache.h | 14 +- Modules/_sqlite/clinic/connection.c.h | 713 + Modules/_sqlite/clinic/cursor.c.h | 262 + Modules/_sqlite/clinic/module.c.h | 222 + Modules/_sqlite/clinic/row.c.h | 56 + Modules/_sqlite/connection.c | 974 +- Modules/_sqlite/connection.h | 14 +- Modules/_sqlite/cursor.c | 521 +- Modules/_sqlite/cursor.h | 14 +- Modules/_sqlite/microprotocols.c | 25 +- Modules/_sqlite/microprotocols.h | 7 +- Modules/_sqlite/module.c | 451 +- Modules/_sqlite/module.h | 1 + Modules/_sqlite/prepare_protocol.c | 85 +- Modules/_sqlite/prepare_protocol.h | 10 +- Modules/_sqlite/row.c | 196 +- Modules/_sqlite/row.h | 4 +- Modules/_sqlite/statement.c | 181 +- Modules/_sqlite/statement.h | 10 +- Modules/_sqlite/util.c | 12 +- Modules/_sqlite/util.h | 6 - Modules/_sre.c | 612 +- Modules/_ssl.c | 1807 +- Modules/_ssl.h | 74 + Modules/_ssl/cert.c | 245 + Modules/_ssl/clinic/cert.c.h | 60 + Modules/_ssl/debughelpers.c | 10 +- Modules/_ssl/misc.c | 34 + Modules/_struct.c | 512 +- Modules/_testbuffer.c | 4 +- Modules/_testcapimodule.c | 443 +- Modules/_testinternalcapi.c | 269 +- Modules/_testmultiphase.c | 36 +- Modules/_threadmodule.c | 782 +- Modules/_tkinter.c | 25 +- Modules/_tracemalloc.c | 5 +- Modules/_winapi.c | 320 +- Modules/_xxsubinterpretersmodule.c | 37 +- Modules/_xxtestfuzz/fuzzer.c | 14 +- Modules/_zoneinfo.c | 33 +- Modules/arraymodule.c | 430 +- Modules/atexitmodule.c | 314 +- Modules/audioop.c | 7 + Modules/binascii.c | 22 +- Modules/cjkcodecs/cjkcodecs.h | 69 +- Modules/cjkcodecs/clinic/multibytecodec.c.h | 12 +- Modules/cjkcodecs/multibytecodec.c | 498 +- Modules/cjkcodecs/multibytecodec.h | 2 +- Modules/clinic/_asynciomodule.c.h | 41 +- Modules/clinic/_bisectmodule.c.h | 138 +- Modules/clinic/_bz2module.c.h | 85 +- Modules/clinic/_codecsmodule.c.h | 187 +- Modules/clinic/_collectionsmodule.c.h | 9 +- Modules/clinic/_curses_panel.c.h | 168 +- Modules/clinic/_cursesmodule.c.h | 531 +- Modules/clinic/_datetimemodule.c.h | 17 +- Modules/clinic/_dbmmodule.c.h | 50 +- Modules/clinic/_elementtree.c.h | 11 +- Modules/clinic/_gdbmmodule.c.h | 108 +- Modules/clinic/_hashopenssl.c.h | 79 +- Modules/clinic/_heapqmodule.c.h | 98 +- Modules/clinic/_localemodule.c.h | 605 + Modules/clinic/_lsprof.c.h | 55 + Modules/clinic/_lzmamodule.c.h | 52 +- Modules/clinic/_opcode.c.h | 7 +- Modules/clinic/_operator.c.h | 9 +- Modules/clinic/_queuemodule.c.h | 58 +- Modules/clinic/_randommodule.c.h | 7 +- Modules/clinic/_sre.c.h | 491 +- Modules/clinic/_ssl.c.h | 224 +- Modules/clinic/_struct.c.h | 24 +- Modules/clinic/_testmultiphase.c.h | 71 +- Modules/clinic/_tkinter.c.h | 47 +- Modules/clinic/_tracemalloc.c.h | 7 +- Modules/clinic/_winapi.c.h | 113 +- Modules/clinic/arraymodule.c.h | 94 +- Modules/clinic/audioop.c.h | 166 +- Modules/clinic/binascii.c.h | 52 +- Modules/clinic/fcntlmodule.c.h | 35 +- Modules/clinic/gcmodule.c.h | 12 +- Modules/clinic/itertoolsmodule.c.h | 56 +- Modules/clinic/md5module.c.h | 21 +- Modules/clinic/overlapped.c.h | 908 + Modules/clinic/posixmodule.c.h | 962 +- Modules/clinic/pyexpat.c.h | 134 +- Modules/clinic/readline.c.h | 688 + Modules/clinic/resource.c.h | 17 +- Modules/clinic/selectmodule.c.h | 72 +- Modules/clinic/sha1module.c.h | 21 +- Modules/clinic/sha256module.c.h | 21 +- Modules/clinic/sha512module.c.h | 21 +- Modules/clinic/signalmodule.c.h | 132 +- Modules/clinic/termios.c.h | 225 + Modules/clinic/zlibmodule.c.h | 286 +- Modules/cmathmodule.c | 78 +- Modules/expat/COPYING | 2 +- Modules/expat/expat.h | 26 +- Modules/expat/internal.h | 6 +- Modules/expat/pyexpatns.h | 5 - Modules/expat/siphash.h | 2 +- Modules/expat/xmlparse.c | 596 +- Modules/expat/xmlrole.c | 7 +- Modules/expat/xmltok.c | 21 +- Modules/expat/xmltok_impl.c | 26 +- Modules/expat/xmltok_impl.h | 2 +- Modules/expat/xmltok_ns.c | 4 +- Modules/faulthandler.c | 149 +- Modules/fcntlmodule.c | 77 +- Modules/gc_weakref.txt | 2 +- Modules/gcmodule.c | 316 +- Modules/getbuildinfo.c | 5 +- Modules/getpath.c | 7 +- Modules/grpmodule.c | 91 +- Modules/itertoolsmodule.c | 154 +- Modules/main.c | 145 +- Modules/makesetup | 2 +- Modules/makexp_aix | 44 +- Modules/mathmodule.c | 297 +- Modules/md5module.c | 173 +- Modules/mmapmodule.c | 322 +- Modules/nismodule.c | 148 +- Modules/ossaudiodev.c | 8 +- Modules/overlapped.c | 1106 +- Modules/parsermodule.c | 1222 - Modules/posixmodule.c | 555 +- Modules/posixmodule.h | 2 + Modules/pwdmodule.c | 65 +- Modules/pyexpat.c | 765 +- Modules/readline.c | 623 +- Modules/resource.c | 67 +- Modules/selectmodule.c | 278 +- Modules/sha1module.c | 171 +- Modules/sha256module.c | 268 +- Modules/sha512module.c | 254 +- Modules/signalmodule.c | 755 +- Modules/socketmodule.c | 238 +- Modules/socketmodule.h | 3 +- Modules/spwdmodule.c | 84 +- Modules/sre.h | 1 - Modules/sre_lib.h | 33 +- Modules/symtablemodule.c | 102 +- Modules/syslogmodule.c | 2 +- Modules/termios.c | 344 +- Modules/timemodule.c | 79 +- Modules/unicodedata.c | 312 +- Modules/xxlimited.c | 389 +- Modules/xxlimited_35.c | 311 + Modules/xxmodule.c | 2 +- Modules/zlibmodule.c | 818 +- Objects/abstract.c | 755 +- Objects/boolobject.c | 25 + Objects/bytearrayobject.c | 95 +- Objects/bytes_methods.c | 21 +- Objects/bytesobject.c | 379 +- Objects/call.c | 144 +- Objects/capsule.c | 6 +- Objects/clinic/bytearrayobject.c.h | 123 +- Objects/clinic/bytesobject.c.h | 104 +- Objects/clinic/codeobject.c.h | 187 +- Objects/clinic/complexobject.c.h | 71 +- Objects/clinic/dictobject.c.h | 5 +- Objects/clinic/floatobject.c.h | 26 +- Objects/clinic/listobject.c.h | 21 +- Objects/clinic/longobject.c.h | 68 +- Objects/clinic/memoryobject.c.h | 199 +- Objects/clinic/odictobject.c.h | 45 +- Objects/clinic/typeobject.c.h | 7 +- Objects/clinic/unicodeobject.c.h | 130 +- Objects/codeobject.c | 485 +- Objects/complexobject.c | 135 +- Objects/descrobject.c | 162 +- Objects/dictobject.c | 587 +- Objects/enumobject.c | 22 +- Objects/exceptions.c | 472 +- Objects/fileobject.c | 42 +- Objects/floatobject.c | 165 +- Objects/frameobject.c | 440 +- Objects/funcobject.c | 232 +- Objects/genericaliasobject.c | 73 +- Objects/genobject.c | 394 +- Objects/interpreteridobject.c | 12 +- Objects/iterobject.c | 215 +- Objects/listobject.c | 137 +- Objects/listsort.txt | 2 +- Objects/lnotab_notes.txt | 104 +- Objects/longobject.c | 430 +- Objects/memoryobject.c | 270 +- Objects/moduleobject.c | 153 +- Objects/object.c | 346 +- Objects/obmalloc.c | 367 +- Objects/odictobject.c | 57 +- Objects/picklebufobject.c | 2 +- Objects/rangeobject.c | 91 +- Objects/setobject.c | 115 +- Objects/sliceobject.c | 57 +- Objects/stringlib/README.txt | 6 +- Objects/stringlib/asciilib.h | 1 - Objects/stringlib/clinic/transmogrify.h.h | 35 +- Objects/stringlib/codecs.h | 54 +- Objects/stringlib/fastsearch.h | 493 +- Objects/stringlib/find_max_char.h | 22 +- Objects/stringlib/join.h | 2 +- Objects/stringlib/partition.h | 27 +- Objects/stringlib/stringdefs.h | 1 - .../stringlib_find_two_way_notes.txt | 431 + Objects/stringlib/ucs1lib.h | 1 - Objects/stringlib/ucs2lib.h | 1 - Objects/stringlib/ucs4lib.h | 1 - Objects/stringlib/unicode_format.h | 4 +- Objects/stringlib/unicodedefs.h | 1 - Objects/structseq.c | 163 +- Objects/tupleobject.c | 210 +- Objects/typeobject.c | 2555 +- Objects/typeslots.inc | 161 +- Objects/typeslots.py | 24 +- Objects/unicodeobject.c | 1325 +- Objects/unionobject.c | 496 + PC/_msi.c | 599 +- PC/_testconsole.c | 9 +- PC/bdist_wininst/PythonPowered.bmp | Bin 2582 -> 0 bytes PC/bdist_wininst/README.txt | 5 - PC/bdist_wininst/archive.h | 104 - .../bdist_wininst.vcxproj.filters | 67 - PC/bdist_wininst/build.bat | 19 - PC/bdist_wininst/extract.c | 320 - PC/bdist_wininst/install.c | 2700 -- PC/bdist_wininst/install.rc | 77 - PC/bdist_wininst/resource.h | 31 - PC/classicAppCompat.can.xml | 2 +- PC/classicAppCompat.sccd | 69 +- PC/clinic/_msi.c.h | 716 + PC/clinic/msvcrtmodule.c.h | 70 +- PC/clinic/winreg.c.h | 315 +- PC/clinic/winsound.c.h | 22 +- PC/config.c | 4 - PC/getpathp.c | 3 +- PC/icons/logox128.png | Bin 1189 -> 1203 bytes PC/icons/py.png | Bin 8534 -> 14151 bytes PC/icons/pythonwx150.png | Bin 5085 -> 8187 bytes PC/icons/pythonwx44.png | Bin 1844 -> 2232 bytes PC/icons/pythonx150.png | Bin 5232 -> 8271 bytes PC/icons/pythonx44.png | Bin 1789 -> 2178 bytes PC/icons/pythonx50.png | Bin 2154 -> 2190 bytes PC/launcher.c | 27 +- PC/layout/main.py | 11 +- PC/layout/support/appxmanifest.py | 18 +- PC/layout/support/constants.py | 2 +- .../distutils.command.bdist_wininst.py | 25 - PC/layout/support/options.py | 2 - PC/msvcrtmodule.c | 40 +- PC/pyconfig.h | 13 +- PC/pylauncher.rc | 6 +- PC/pyshellext.cpp | 10 +- PC/pyshellext.def | 1 - PC/pyshellext.idl | 12 - PC/pyshellext.rc | 7 +- PC/pyshellext_d.def | 6 - PC/python3.def | 811 - PC/python3dll.c | 864 +- PC/python_exe.rc | 7 +- PC/python_nt.rc | 7 +- PC/python_ver_rc.h | 2 +- PC/pythonw_exe.rc | 7 +- PC/readme.txt | 6 +- PC/sqlite3.rc | 7 +- PC/store_info.txt | 2 +- PC/winreg.c | 79 +- PCbuild/Directory.Build.props | 4 - PCbuild/Directory.Build.targets | 4 - PCbuild/_decimal.vcxproj | 6 +- PCbuild/_freeze_importlib.vcxproj | 22 +- PCbuild/_sqlite3.vcxproj | 1 - PCbuild/blurb.bat | 28 + PCbuild/build.bat | 27 +- PCbuild/get_external.py | 19 +- PCbuild/get_externals.bat | 18 +- PCbuild/lib.pyproj | 6 +- PCbuild/liblzma.vcxproj | 4 +- PCbuild/liblzma.vcxproj.filters | 2 +- PCbuild/pcbuild.proj | 1 + PCbuild/pcbuild.sln | 2 - PCbuild/pyproject.props | 1 + PCbuild/pyshellext.vcxproj | 4 +- PCbuild/pyshellext.vcxproj.filters | 8 - PCbuild/python.props | 16 +- PCbuild/python.vcxproj | 36 +- PCbuild/python3dll.vcxproj | 77 +- PCbuild/python3dll.vcxproj.filters | 5 - PCbuild/pythoncore.vcxproj | 79 +- PCbuild/pythoncore.vcxproj.filters | 353 +- PCbuild/readme.txt | 29 +- PCbuild/regen.targets | 114 + PCbuild/regen.vcxproj | 230 - PCbuild/sqlite3.vcxproj | 2 +- PCbuild/tcltk.props | 5 +- PCbuild/xxlimited.vcxproj | 5 +- .../xxlimited_35.vcxproj | 80 +- PCbuild/xxlimited_35.vcxproj.filters | 13 + Parser/Python.asdl | 19 + Parser/acceler.c | 123 - Parser/asdl.py | 2 +- Parser/asdl_c.py | 459 +- Parser/grammar1.c | 47 - Parser/listnode.c | 71 - Parser/myreadline.c | 6 +- Parser/node.c | 189 - Parser/parser.c | 33422 +++++++++++++++- Parser/parser.h | 49 - Parser/parsetok.c | 486 - Parser/peg_api.c | 28 + Parser/{pegen => }/pegen.c | 1000 +- Parser/{pegen => }/pegen.h | 101 +- Parser/pegen/parse.c | 25594 ------------ Parser/pegen/peg_api.c | 54 - Parser/pgen/__main__.py | 43 - Parser/pgen/automata.py | 400 - Parser/pgen/grammar.py | 147 - Parser/pgen/keywordgen.py | 59 - Parser/pgen/metaparser.py | 152 - Parser/pgen/pgen.py | 310 - Parser/pgen/token.py | 38 - .../{pegen/parse_string.c => string_parser.c} | 86 +- .../{pegen/parse_string.h => string_parser.h} | 2 +- Parser/token.c | 1 + Parser/tokenizer.c | 1000 +- Parser/tokenizer.h | 19 +- Programs/_testembed.c | 129 +- Python/Python-ast.c | 3370 +- Python/_warnings.c | 125 +- Python/asdl.c | 66 +- Python/ast.c | 6019 +-- Python/ast_opt.c | 275 +- Python/ast_unparse.c | 27 +- Python/bltinmodule.c | 300 +- Python/ceval.c | 1896 +- Python/ceval_gil.h | 20 +- Python/clinic/_warnings.c.h | 9 +- Python/clinic/bltinmodule.c.h | 75 +- Python/clinic/import.c.h | 7 +- Python/clinic/marshal.c.h | 12 +- Python/clinic/sysmodule.c.h | 123 +- Python/clinic/traceback.c.h | 12 +- Python/codecs.c | 65 +- Python/compile.c | 3352 +- Python/condvar.h | 2 +- Python/context.c | 63 +- Python/dynload_aix.c | 190 - Python/dynload_dl.c | 23 - Python/dynload_hpux.c | 2 +- Python/dynload_win.c | 13 +- Python/errors.c | 134 +- Python/fileutils.c | 302 +- Python/formatter_unicode.c | 2 +- Python/frozen.c | 29 +- Python/frozen_hello.h | 12 + Python/future.c | 28 +- Python/getargs.c | 190 +- Python/getcompiler.c | 4 +- Python/getcopyright.c | 2 +- Python/graminit.c | 2688 -- Python/hamt.c | 39 +- Python/import.c | 655 +- Python/importdl.c | 12 +- Python/importlib.h | 3652 +- Python/importlib_external.h | 5375 ++- Python/importlib_zipimport.h | 1998 +- Python/initconfig.c | 695 +- Python/marshal.c | 64 +- Python/modsupport.c | 103 +- Python/mysnprintf.c | 42 +- Python/opcode_targets.h | 18 +- Python/pathconfig.c | 165 +- Python/peephole.c | 538 - Python/preconfig.c | 49 +- Python/pyarena.c | 9 +- Python/pyhash.c | 26 +- Python/pylifecycle.c | 1054 +- Python/pymath.c | 15 - Python/pystate.c | 275 +- Python/pystrtod.c | 4 +- Python/pythonrun.c | 713 +- Python/pytime.c | 250 +- Python/stdlib_module_names.h | 307 + Python/strdup.c | 12 - Python/structmember.c | 13 +- Python/suggestions.c | 281 + Python/symtable.c | 402 +- Python/sysmodule.c | 631 +- Python/thread.c | 19 + Python/thread_pthread.h | 57 +- Python/traceback.c | 56 +- README.rst | 43 +- Tools/c-analyzer/README | 4 + Tools/c-analyzer/TODO | 5 - Tools/c-analyzer/c-analyzer.py | 7 + Tools/c-analyzer/c-globals.py | 9 - Tools/c-analyzer/c_analyzer/__init__.py | 105 + Tools/c-analyzer/c_analyzer/__main__.py | 540 + Tools/c-analyzer/c_analyzer/analyze.py | 311 + Tools/c-analyzer/c_analyzer/common/files.py | 124 - Tools/c-analyzer/c_analyzer/common/info.py | 138 - Tools/c-analyzer/c_analyzer/common/show.py | 11 - Tools/c-analyzer/c_analyzer/datafiles.py | 125 + Tools/c-analyzer/c_analyzer/info.py | 324 + Tools/c-analyzer/c_analyzer/match.py | 212 + .../c-analyzer/c_analyzer/parser/__init__.py | 0 .../c_analyzer/parser/declarations.py | 339 - Tools/c-analyzer/c_analyzer/parser/find.py | 107 - Tools/c-analyzer/c_analyzer/parser/naive.py | 179 - .../c_analyzer/parser/preprocessor.py | 511 - Tools/c-analyzer/c_analyzer/parser/source.py | 34 - .../c-analyzer/c_analyzer/symbols/__init__.py | 0 Tools/c-analyzer/c_analyzer/symbols/_nm.py | 117 - Tools/c-analyzer/c_analyzer/symbols/find.py | 175 - Tools/c-analyzer/c_analyzer/symbols/info.py | 51 - .../c_analyzer/variables/__init__.py | 0 Tools/c-analyzer/c_analyzer/variables/find.py | 75 - Tools/c-analyzer/c_analyzer/variables/info.py | 93 - .../c-analyzer/c_analyzer/variables/known.py | 91 - Tools/c-analyzer/c_common/__init__.py | 2 + .../common/util.py => c_common/clsutil.py} | 126 - Tools/c-analyzer/c_common/fsutil.py | 458 + .../c-analyzer/c_common/info.py | 0 Tools/c-analyzer/c_common/iterutil.py | 48 + Tools/c-analyzer/c_common/logging.py | 63 + Tools/c-analyzer/c_common/misc.py | 7 + Tools/c-analyzer/c_common/scriptutil.py | 628 + .../common/__init__.py => c_common/show.py} | 0 Tools/c-analyzer/c_common/strutil.py | 42 + Tools/c-analyzer/c_common/tables.py | 390 + Tools/c-analyzer/c_parser/__init__.py | 46 + Tools/c-analyzer/c_parser/__main__.py | 266 + Tools/c-analyzer/c_parser/_state_machine.py | 244 + Tools/c-analyzer/c_parser/datafiles.py | 153 + Tools/c-analyzer/c_parser/info.py | 1604 + Tools/c-analyzer/c_parser/match.py | 177 + Tools/c-analyzer/c_parser/parser/__init__.py | 212 + Tools/c-analyzer/c_parser/parser/_alt.py | 6 + Tools/c-analyzer/c_parser/parser/_common.py | 115 + .../c_parser/parser/_compound_decl_body.py | 158 + Tools/c-analyzer/c_parser/parser/_delim.py | 54 + .../c-analyzer/c_parser/parser/_func_body.py | 278 + Tools/c-analyzer/c_parser/parser/_global.py | 179 + Tools/c-analyzer/c_parser/parser/_info.py | 183 + Tools/c-analyzer/c_parser/parser/_regexes.py | 797 + .../c_parser/preprocessor/__init__.py | 190 + .../c_parser/preprocessor/__main__.py | 197 + .../c_parser/preprocessor/common.py | 173 + .../c_parser/preprocessor/errors.py | 110 + Tools/c-analyzer/c_parser/preprocessor/gcc.py | 123 + .../c-analyzer/c_parser/preprocessor/pure.py | 23 + Tools/c-analyzer/c_parser/source.py | 64 + Tools/c-analyzer/check-c-globals.py | 476 +- Tools/c-analyzer/cpython/README | 72 - Tools/c-analyzer/cpython/__init__.py | 29 +- Tools/c-analyzer/cpython/__main__.py | 578 +- Tools/c-analyzer/cpython/_analyzer.py | 353 + Tools/c-analyzer/cpython/_capi.py | 665 + Tools/c-analyzer/cpython/_files.py | 69 + Tools/c-analyzer/cpython/_generate.py | 329 - Tools/c-analyzer/cpython/_parser.py | 322 + Tools/c-analyzer/cpython/files.py | 29 - Tools/c-analyzer/cpython/find.py | 101 - Tools/c-analyzer/cpython/ignored.tsv | 2938 ++ Tools/c-analyzer/cpython/known.py | 66 - Tools/c-analyzer/cpython/known.tsv | 3 + Tools/c-analyzer/cpython/supported.py | 398 - Tools/c-analyzer/ignored-globals.txt | 492 - Tools/c-analyzer/ignored.tsv | 1 - Tools/c-analyzer/known.tsv | 1930 - Tools/c-analyzer/must-resolve.sh | 75 + Tools/ccbench/ccbench.py | 6 +- Tools/clinic/clinic.py | 207 +- Tools/demo/rpythond.py | 2 +- Tools/demo/vector.py | 30 +- Tools/freeze/regen_frozen.py | 51 + Tools/gdb/libpython.py | 26 +- Tools/i18n/pygettext.py | 53 + Tools/msi/README.txt | 11 +- Tools/msi/build.bat | 21 +- Tools/msi/buildrelease.bat | 29 +- Tools/msi/bundle/SideBar.png | Bin 51948 -> 57891 bytes Tools/msi/bundle/bootstrap/pythonba.vcxproj | 5 + Tools/msi/bundle/bundle.wxs | 2 +- Tools/msi/common.wxs | 18 +- Tools/msi/dev/dev.wxs | 1 - Tools/msi/distutils.command.bdist_wininst.py | 23 - Tools/msi/doc/doc.wxs | 1 - Tools/msi/lib/lib.wxs | 1 - Tools/msi/path/path.wxs | 3 +- Tools/msi/purge.py | 2 +- Tools/msi/tcltk/tcltk.wxs | 1 - Tools/msi/test/test.wxs | 1 - Tools/msi/tools/tools.wxs | 1 - Tools/msi/ucrt/ucrt.wxs | 1 - Tools/peg_generator/Makefile | 14 +- .../peg_extension/peg_extension.c | 31 +- Tools/peg_generator/pegen/__main__.py | 3 + Tools/peg_generator/pegen/build.py | 18 +- Tools/peg_generator/pegen/c_generator.py | 80 +- Tools/peg_generator/pegen/first_sets.py | 2 +- Tools/peg_generator/pegen/grammar.py | 22 +- Tools/peg_generator/pegen/grammar_parser.py | 76 +- Tools/peg_generator/pegen/keywordgen.py | 6 +- Tools/peg_generator/pegen/metagrammar.gram | 7 + Tools/peg_generator/pegen/python_generator.py | 9 +- Tools/peg_generator/pegen/validator.py | 52 + Tools/peg_generator/scripts/benchmark.py | 66 +- .../scripts/download_pypi_packages.py | 2 +- .../peg_generator/scripts/find_max_nesting.py | 6 +- Tools/peg_generator/scripts/show_parse.py | 121 - .../scripts/test_parse_directory.py | 120 +- Tools/pynche/ColorDB.py | 2 +- Tools/pynche/README | 4 +- Tools/scripts/README | 1 + Tools/scripts/combinerefs.py | 2 +- Tools/scripts/dutree.doc | 2 +- Tools/scripts/generate_opcode_h.py | 19 + Tools/scripts/generate_stdlib_module_names.py | 170 + Tools/scripts/generate_symbol_py.py | 53 - Tools/scripts/get-remote-certificate.py | 25 +- Tools/scripts/pdeps.py | 2 +- Tools/scripts/pep384_macrocheck.py | 4 +- Tools/scripts/run_tests.py | 3 +- Tools/scripts/smelly.py | 157 +- Tools/scripts/stable_abi.py | 626 + Tools/scripts/verify_ensurepip_wheels.py | 98 - Tools/ssl/multissltests.py | 22 +- aclocal.m4 | 398 +- config.guess | 1486 +- config.sub | 2605 +- configure | 965 +- configure.ac | 454 +- pyconfig.h.in | 54 +- setup.py | 415 +- 1958 files changed, 185847 insertions(+), 146883 deletions(-) create mode 100644 Doc/data/python3.10.abi delete mode 100644 Doc/data/python3.9.abi create mode 100644 Doc/data/stable_abi.dat create mode 100644 Doc/howto/annotations.rst delete mode 100644 Doc/library/formatter.rst delete mode 100644 Doc/library/misc.rst delete mode 100644 Doc/library/parser.rst delete mode 100644 Doc/library/symbol.rst create mode 100644 Doc/library/undoc.rst create mode 100644 Doc/tools/extensions/glossary_search.py create mode 100644 Doc/tools/templates/search.html create mode 100644 Doc/using/configure.rst create mode 100644 Doc/whatsnew/3.10.rst delete mode 100644 Grammar/Grammar delete mode 100644 Include/Python-ast.h create mode 100644 Include/README.rst delete mode 100644 Include/asdl.h delete mode 100644 Include/ast.h delete mode 100644 Include/bitset.h create mode 100644 Include/cpython/compile.h rename Include/{ => cpython}/odictobject.h (100%) rename Include/{ => cpython}/picklebufobject.h (100%) rename Include/{ => cpython}/pyctype.h (100%) rename Include/{ => cpython}/pydebug.h (100%) rename Include/{ => cpython}/pyfpe.h (100%) create mode 100644 Include/cpython/pythonrun.h rename Include/{ => cpython}/pytime.h (89%) delete mode 100644 Include/graminit.h delete mode 100644 Include/grammar.h delete mode 100644 Include/internal/pegen_interface.h create mode 100644 Include/internal/pycore_asdl.h create mode 100644 Include/internal/pycore_ast.h create mode 100644 Include/internal/pycore_ast_state.h create mode 100644 Include/internal/pycore_atomic_funcs.h create mode 100644 Include/internal/pycore_bitutils.h create mode 100644 Include/internal/pycore_blocks_output_buffer.h delete mode 100644 Include/internal/pycore_byteswap.h create mode 100644 Include/internal/pycore_compile.h create mode 100644 Include/internal/pycore_format.h create mode 100644 Include/internal/pycore_list.h create mode 100644 Include/internal/pycore_moduleobject.h create mode 100644 Include/internal/pycore_parser.h create mode 100644 Include/internal/pycore_pyarena.h create mode 100644 Include/internal/pycore_structseq.h rename Include/{symtable.h => internal/pycore_symtable.h} (86%) rename Include/internal/{pycore_tupleobject.h => pycore_tuple.h} (75%) create mode 100644 Include/internal/pycore_ucnhash.h create mode 100644 Include/internal/pycore_unionobject.h delete mode 100644 Include/node.h delete mode 100644 Include/parsetok.h delete mode 100644 Include/pyarena.h delete mode 100644 Include/ucnhash.h delete mode 100644 Lib/_bootlocale.py create mode 100644 Lib/asyncio/mixins.py delete mode 100644 Lib/distutils/command/bdist_wininst.py delete mode 100644 Lib/distutils/command/wininst-10.0-amd64.exe delete mode 100644 Lib/distutils/command/wininst-10.0.exe delete mode 100644 Lib/distutils/command/wininst-14.0-amd64.exe delete mode 100644 Lib/distutils/command/wininst-14.0.exe delete mode 100644 Lib/distutils/command/wininst-6.0.exe delete mode 100644 Lib/distutils/command/wininst-7.1.exe delete mode 100644 Lib/distutils/command/wininst-8.0.exe delete mode 100644 Lib/distutils/command/wininst-9.0-amd64.exe delete mode 100644 Lib/distutils/command/wininst-9.0.exe delete mode 100644 Lib/distutils/tests/test_bdist_wininst.py create mode 100644 Lib/ensurepip/_bundled/pip-21.2.3-py3-none-any.whl delete mode 100644 Lib/ensurepip/_bundled/pip-22.0.4-py3-none-any.whl rename Lib/ensurepip/_bundled/{setuptools-58.1.0-py3-none-any.whl => setuptools-57.4.0-py3-none-any.whl} (80%) delete mode 100644 Lib/formatter.py delete mode 100644 Lib/idlelib/idle_test/example_noext delete mode 100644 Lib/idlelib/idle_test/example_stub.pyi delete mode 100644 Lib/idlelib/idle_test/test_util.py create mode 100644 Lib/idlelib/idle_test/tkinter_testing_utils.py delete mode 100644 Lib/idlelib/util.py create mode 100644 Lib/importlib/_abc.py create mode 100644 Lib/importlib/_adapters.py delete mode 100644 Lib/importlib/metadata.py create mode 100644 Lib/importlib/metadata/__init__.py create mode 100644 Lib/importlib/metadata/_adapters.py create mode 100644 Lib/importlib/metadata/_collections.py create mode 100644 Lib/importlib/metadata/_functools.py create mode 100644 Lib/importlib/metadata/_itertools.py create mode 100644 Lib/importlib/metadata/_meta.py create mode 100644 Lib/importlib/metadata/_text.py create mode 100644 Lib/importlib/readers.py delete mode 100644 Lib/symbol.py create mode 100644 Lib/test/_test_atexit.py rename Lib/test/{eintrdata/eintr_tester.py => _test_eintr.py} (98%) create mode 100644 Lib/test/_test_embed_set_config.py create mode 100644 Lib/test/ann_module4.py delete mode 100644 Lib/test/ann_module5.py delete mode 100644 Lib/test/ann_module6.py delete mode 100644 Lib/test/ann_module7.py create mode 100644 Lib/test/inspect_stock_annotations.py create mode 100644 Lib/test/inspect_stringized_annotations.py create mode 100644 Lib/test/inspect_stringized_annotations_2.py create mode 100644 Lib/test/support/import_helper.py create mode 100644 Lib/test/support/interpreters.py create mode 100644 Lib/test/support/os_helper.py create mode 100644 Lib/test/support/threading_helper.py mode change 100755 => 100644 Lib/test/test_array.py create mode 100644 Lib/test/test_asyncio/test_asyncio_waitfor.py delete mode 100644 Lib/test/test_asyncio/test_waitfor.py create mode 100644 Lib/test/test_importlib/namespacedata01/binary.file create mode 100644 Lib/test/test_importlib/namespacedata01/utf-16.file create mode 100644 Lib/test/test_importlib/namespacedata01/utf-8.file create mode 100644 Lib/test/test_importlib/test_reader.py create mode 100755 Lib/test/test_importlib/update-zips.py create mode 100644 Lib/test/test_interpreters.py create mode 100644 Lib/test/test_opcache.py delete mode 100644 Lib/test/test_parser.py create mode 100644 Lib/test/test_patma.py create mode 100644 Lib/test/test_peg_generator/test_grammar_validator.py delete mode 100644 Lib/test/test_peg_parser.py delete mode 100644 Lib/test/test_symbol.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/__main__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/test_files.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/test_info.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_common/test_show.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/test___main__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/test_functional.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_cpython/test_supported.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_parser/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_parser/test_declarations.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_parser/test_preprocessor.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_symbols/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_symbols/test_info.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/__init__.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/test_find.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/test_info.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/test_variables/test_known.py delete mode 100644 Lib/test/test_tools/test_c_analyzer/util.py create mode 100644 Lib/test/test_type_annotations.py mode change 100644 => 100755 Lib/test/test_uuid.py create mode 100644 Lib/test/test_xxlimited.py create mode 100644 Lib/test/testtar.tar.xz create mode 100644 Lib/tkinter/test/runtktests.py create mode 100644 Lib/tkinter/test/test_tkinter/test_messagebox.py create mode 100644 Lib/tkinter/test/test_ttk/test_functions.py create mode 100644 Mac/BuildScript/0001-Darwin-platform-allows-to-build-on-releases-before-Y.patch create mode 100644 Misc/stable_abi.txt create mode 100644 Modules/_decimal/libmpdec/bench.c create mode 100644 Modules/_decimal/libmpdec/bench_full.c create mode 100644 Modules/_decimal/libmpdec/examples/README.txt create mode 100644 Modules/_decimal/libmpdec/examples/compare.c create mode 100644 Modules/_decimal/libmpdec/examples/div.c create mode 100644 Modules/_decimal/libmpdec/examples/divmod.c create mode 100644 Modules/_decimal/libmpdec/examples/multiply.c create mode 100644 Modules/_decimal/libmpdec/examples/pow.c create mode 100644 Modules/_decimal/libmpdec/examples/powmod.c create mode 100644 Modules/_decimal/libmpdec/examples/shift.c rename Modules/_decimal/libmpdec/{vccompat.h => examples/sqrt.c} (62%) create mode 100644 Modules/_decimal/libmpdec/mpsignal.c create mode 100644 Modules/_multiprocessing/clinic/multiprocessing.c.h create mode 100644 Modules/_multiprocessing/clinic/semaphore.c.h delete mode 100644 Modules/_peg_parser.c create mode 100644 Modules/_sqlite/clinic/connection.c.h create mode 100644 Modules/_sqlite/clinic/cursor.c.h create mode 100644 Modules/_sqlite/clinic/module.c.h create mode 100644 Modules/_sqlite/clinic/row.c.h create mode 100644 Modules/_ssl.h create mode 100644 Modules/_ssl/cert.c create mode 100644 Modules/_ssl/clinic/cert.c.h create mode 100644 Modules/_ssl/misc.c create mode 100644 Modules/clinic/_localemodule.c.h create mode 100644 Modules/clinic/_lsprof.c.h create mode 100644 Modules/clinic/overlapped.c.h create mode 100644 Modules/clinic/readline.c.h create mode 100644 Modules/clinic/termios.c.h delete mode 100644 Modules/parsermodule.c create mode 100644 Modules/xxlimited_35.c create mode 100644 Objects/stringlib/stringlib_find_two_way_notes.txt create mode 100644 Objects/unionobject.c delete mode 100644 PC/bdist_wininst/PythonPowered.bmp delete mode 100644 PC/bdist_wininst/README.txt delete mode 100644 PC/bdist_wininst/archive.h delete mode 100644 PC/bdist_wininst/bdist_wininst.vcxproj.filters delete mode 100644 PC/bdist_wininst/build.bat delete mode 100644 PC/bdist_wininst/extract.c delete mode 100644 PC/bdist_wininst/install.c delete mode 100644 PC/bdist_wininst/install.rc delete mode 100644 PC/bdist_wininst/resource.h create mode 100644 PC/clinic/_msi.c.h delete mode 100644 PC/layout/support/distutils.command.bdist_wininst.py delete mode 100644 PC/pyshellext.idl delete mode 100644 PC/pyshellext_d.def delete mode 100644 PC/python3.def mode change 100644 => 100755 PC/python3dll.c delete mode 100644 PCbuild/Directory.Build.props delete mode 100644 PCbuild/Directory.Build.targets create mode 100644 PCbuild/blurb.bat create mode 100644 PCbuild/regen.targets delete mode 100644 PCbuild/regen.vcxproj rename PC/bdist_wininst/bdist_wininst.vcxproj => PCbuild/xxlimited_35.vcxproj (54%) create mode 100644 PCbuild/xxlimited_35.vcxproj.filters delete mode 100644 Parser/acceler.c delete mode 100644 Parser/grammar1.c delete mode 100644 Parser/listnode.c delete mode 100644 Parser/node.c delete mode 100644 Parser/parser.h delete mode 100644 Parser/parsetok.c create mode 100644 Parser/peg_api.c rename Parser/{pegen => }/pegen.c (65%) rename Parser/{pegen => }/pegen.h (68%) delete mode 100644 Parser/pegen/parse.c delete mode 100644 Parser/pegen/peg_api.c delete mode 100644 Parser/pgen/__main__.py delete mode 100644 Parser/pgen/automata.py delete mode 100644 Parser/pgen/grammar.py delete mode 100644 Parser/pgen/keywordgen.py delete mode 100644 Parser/pgen/metaparser.py delete mode 100644 Parser/pgen/pgen.py delete mode 100644 Parser/pgen/token.py rename Parser/{pegen/parse_string.c => string_parser.c} (93%) rename Parser/{pegen/parse_string.h => string_parser.h} (98%) delete mode 100644 Python/dynload_aix.c delete mode 100644 Python/dynload_dl.c create mode 100644 Python/frozen_hello.h delete mode 100644 Python/graminit.c delete mode 100644 Python/peephole.c create mode 100644 Python/stdlib_module_names.h delete mode 100644 Python/strdup.c create mode 100644 Python/suggestions.c create mode 100644 Tools/c-analyzer/c-analyzer.py delete mode 100644 Tools/c-analyzer/c-globals.py create mode 100644 Tools/c-analyzer/c_analyzer/__main__.py create mode 100644 Tools/c-analyzer/c_analyzer/analyze.py delete mode 100644 Tools/c-analyzer/c_analyzer/common/files.py delete mode 100644 Tools/c-analyzer/c_analyzer/common/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/common/show.py create mode 100644 Tools/c-analyzer/c_analyzer/datafiles.py create mode 100644 Tools/c-analyzer/c_analyzer/info.py create mode 100644 Tools/c-analyzer/c_analyzer/match.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/__init__.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/declarations.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/find.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/naive.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/preprocessor.py delete mode 100644 Tools/c-analyzer/c_analyzer/parser/source.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/__init__.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/_nm.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/find.py delete mode 100644 Tools/c-analyzer/c_analyzer/symbols/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/__init__.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/find.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/info.py delete mode 100644 Tools/c-analyzer/c_analyzer/variables/known.py create mode 100644 Tools/c-analyzer/c_common/__init__.py rename Tools/c-analyzer/{c_analyzer/common/util.py => c_common/clsutil.py} (51%) create mode 100644 Tools/c-analyzer/c_common/fsutil.py rename Parser/pgen/__init__.py => Tools/c-analyzer/c_common/info.py (100%) create mode 100644 Tools/c-analyzer/c_common/iterutil.py create mode 100644 Tools/c-analyzer/c_common/logging.py create mode 100644 Tools/c-analyzer/c_common/misc.py create mode 100644 Tools/c-analyzer/c_common/scriptutil.py rename Tools/c-analyzer/{c_analyzer/common/__init__.py => c_common/show.py} (100%) create mode 100644 Tools/c-analyzer/c_common/strutil.py create mode 100644 Tools/c-analyzer/c_common/tables.py create mode 100644 Tools/c-analyzer/c_parser/__init__.py create mode 100644 Tools/c-analyzer/c_parser/__main__.py create mode 100644 Tools/c-analyzer/c_parser/_state_machine.py create mode 100644 Tools/c-analyzer/c_parser/datafiles.py create mode 100644 Tools/c-analyzer/c_parser/info.py create mode 100644 Tools/c-analyzer/c_parser/match.py create mode 100644 Tools/c-analyzer/c_parser/parser/__init__.py create mode 100644 Tools/c-analyzer/c_parser/parser/_alt.py create mode 100644 Tools/c-analyzer/c_parser/parser/_common.py create mode 100644 Tools/c-analyzer/c_parser/parser/_compound_decl_body.py create mode 100644 Tools/c-analyzer/c_parser/parser/_delim.py create mode 100644 Tools/c-analyzer/c_parser/parser/_func_body.py create mode 100644 Tools/c-analyzer/c_parser/parser/_global.py create mode 100644 Tools/c-analyzer/c_parser/parser/_info.py create mode 100644 Tools/c-analyzer/c_parser/parser/_regexes.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/__init__.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/__main__.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/common.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/errors.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/gcc.py create mode 100644 Tools/c-analyzer/c_parser/preprocessor/pure.py create mode 100644 Tools/c-analyzer/c_parser/source.py delete mode 100644 Tools/c-analyzer/cpython/README create mode 100644 Tools/c-analyzer/cpython/_analyzer.py create mode 100644 Tools/c-analyzer/cpython/_capi.py create mode 100644 Tools/c-analyzer/cpython/_files.py delete mode 100644 Tools/c-analyzer/cpython/_generate.py create mode 100644 Tools/c-analyzer/cpython/_parser.py delete mode 100644 Tools/c-analyzer/cpython/files.py delete mode 100644 Tools/c-analyzer/cpython/find.py create mode 100644 Tools/c-analyzer/cpython/ignored.tsv delete mode 100644 Tools/c-analyzer/cpython/known.py create mode 100644 Tools/c-analyzer/cpython/known.tsv delete mode 100644 Tools/c-analyzer/cpython/supported.py delete mode 100644 Tools/c-analyzer/ignored-globals.txt delete mode 100644 Tools/c-analyzer/ignored.tsv delete mode 100644 Tools/c-analyzer/known.tsv create mode 100755 Tools/c-analyzer/must-resolve.sh create mode 100644 Tools/freeze/regen_frozen.py delete mode 100644 Tools/msi/distutils.command.bdist_wininst.py create mode 100644 Tools/peg_generator/pegen/validator.py delete mode 100755 Tools/peg_generator/scripts/show_parse.py create mode 100644 Tools/scripts/generate_stdlib_module_names.py delete mode 100755 Tools/scripts/generate_symbol_py.py create mode 100755 Tools/scripts/stable_abi.py delete mode 100755 Tools/scripts/verify_ensurepip_wheels.py diff --git a/Doc/Makefile b/Doc/Makefile index 3cf2040f..24528a1c 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -210,6 +210,7 @@ dist: check: $(PYTHON) tools/rstlint.py -i tools -i $(VENVDIR) -i README.rst + $(PYTHON) tools/rstlint.py ../Misc/NEWS.d/next/ serve: $(PYTHON) ../Tools/scripts/serve.py build/html @@ -224,7 +225,6 @@ serve: # for development releases: always build autobuild-dev: make dist SPHINXOPTS='$(SPHINXOPTS) -Ea -A daily=1' - -make suspicious # for quick rebuilds (HTML only) autobuild-dev-html: diff --git a/Doc/about.rst b/Doc/about.rst index f0b90848..3ea311fa 100644 --- a/Doc/about.rst +++ b/Doc/about.rst @@ -23,8 +23,9 @@ Many thanks go to: and writer of much of the content; * the `Docutils `_ project for creating reStructuredText and the Docutils suite; -* Fredrik Lundh for his Alternative Python Reference project from which Sphinx - got many good ideas. +* Fredrik Lundh for his `Alternative Python Reference + `_ project from which Sphinx got many good + ideas. Contributors to the Python Documentation diff --git a/Doc/bugs.rst b/Doc/bugs.rst index 69d7c274..b3d05779 100644 --- a/Doc/bugs.rst +++ b/Doc/bugs.rst @@ -35,48 +35,43 @@ though it may take a while to be processed. `Helping with Documentation `_ Comprehensive guide for individuals that are interested in contributing to Python documentation. - `Documentation Translations `_ - A list of GitHub pages for documentation translation and their primary contacts. - - .. _using-the-tracker: Using the Python issue tracker ============================== -Issue reports for Python itself should be submitted via the GitHub issues -tracker (https://github.com/python/cpython/issues). -The GitHub issues tracker offers a web form which allows pertinent information -to be entered and submitted to the developers. +Bug reports for Python itself should be submitted via the Python Bug Tracker +(https://bugs.python.org/). The bug tracker offers a web form which allows +pertinent information to be entered and submitted to the developers. The first step in filing a report is to determine whether the problem has already been reported. The advantage in doing so, aside from saving the -developers' time, is that you learn what has been done to fix it; it may be that +developers time, is that you learn what has been done to fix it; it may be that the problem has already been fixed for the next release, or additional information is needed (in which case you are welcome to provide it if you can!). -To do this, search the tracker using the search box at the top of the page. - -If the problem you're reporting is not already in the list, log in to GitHub. -If you don't already have a GitHub account, create a new account using the -"Sign up" link. -It is not possible to submit a bug report anonymously. +To do this, search the bug database using the search box on the top of the page. -Being now logged in, you can submit an issue. -Click on the "New issue" button in the top bar to report a new issue. +If the problem you're reporting is not already in the bug tracker, go back to +the Python Bug Tracker and log in. If you don't already have a tracker account, +select the "Register" link or, if you use OpenID, one of the OpenID provider +logos in the sidebar. It is not possible to submit a bug report anonymously. -The submission form has two fields, "Title" and "Comment". +Being now logged in, you can submit a bug. Select the "Create New" link in the +sidebar to open the bug reporting form. -For the "Title" field, enter a *very* short description of the problem; -less than ten words is good. +The submission form has a number of fields. For the "Title" field, enter a +*very* short description of the problem; less than ten words is good. In the +"Type" field, select the type of your problem; also select the "Component" and +"Versions" to which the bug relates. In the "Comment" field, describe the problem in detail, including what you expected to happen and what did happen. Be sure to include whether any extension modules were involved, and what hardware and software platform you were using (including version information as appropriate). -Each issue report will be reviewed by a developer who will determine what needs to -be done to correct the problem. You will receive an update each time an action is -taken on the issue. +Each bug report will be assigned to a developer who will determine what needs to +be done to correct the problem. You will receive an update each time action is +taken on the bug. .. seealso:: @@ -100,6 +95,6 @@ patching Python in the `Python Developer's Guide`_. If you have questions, the `core-mentorship mailing list`_ is a friendly place to get answers to any and all questions pertaining to the process of fixing issues in Python. -.. _Documentation bugs: https://github.com/python/cpython/issues?q=is%3Aissue+is%3Aopen+label%3Adocs +.. _Documentation bugs: https://bugs.python.org/issue?@filter=status&@filter=components&components=4&status=1&@columns=id,activity,title,status&@sort=-activity .. _Python Developer's Guide: https://devguide.python.org/ .. _core-mentorship mailing list: https://mail.python.org/mailman3/lists/core-mentorship.python.org/ diff --git a/Doc/c-api/apiabiversion.rst b/Doc/c-api/apiabiversion.rst index b8a8f2ff..04050f7d 100644 --- a/Doc/c-api/apiabiversion.rst +++ b/Doc/c-api/apiabiversion.rst @@ -6,34 +6,57 @@ API and ABI Versioning *********************** -``PY_VERSION_HEX`` is the Python version number encoded in a single integer. - -For example if the ``PY_VERSION_HEX`` is set to ``0x030401a2``, the underlying -version information can be found by treating it as a 32 bit number in -the following manner: - - +-------+-------------------------+------------------------------------------------+ - | Bytes | Bits (big endian order) | Meaning | - +=======+=========================+================================================+ - | ``1`` | ``1-8`` | ``PY_MAJOR_VERSION`` (the ``3`` in | - | | | ``3.4.1a2``) | - +-------+-------------------------+------------------------------------------------+ - | ``2`` | ``9-16`` | ``PY_MINOR_VERSION`` (the ``4`` in | - | | | ``3.4.1a2``) | - +-------+-------------------------+------------------------------------------------+ - | ``3`` | ``17-24`` | ``PY_MICRO_VERSION`` (the ``1`` in | - | | | ``3.4.1a2``) | - +-------+-------------------------+------------------------------------------------+ - | ``4`` | ``25-28`` | ``PY_RELEASE_LEVEL`` (``0xA`` for alpha, | - | | | ``0xB`` for beta, ``0xC`` for release | - | | | candidate and ``0xF`` for final), in this | - | | | case it is alpha. | - +-------+-------------------------+------------------------------------------------+ - | | ``29-32`` | ``PY_RELEASE_SERIAL`` (the ``2`` in | - | | | ``3.4.1a2``, zero for final releases) | - +-------+-------------------------+------------------------------------------------+ - -Thus ``3.4.1a2`` is hexversion ``0x030401a2``. +CPython exposes its version number in the following macros. +Note that these correspond to the version code is **built** with, +not necessarily the version used at **run time**. -All the given macros are defined in :source:`Include/patchlevel.h`. +See :ref:`stable` for a discussion of API and ABI stability across versions. + +.. c:macro:: PY_MAJOR_VERSION + + The ``3`` in ``3.4.1a2``. + +.. c:macro:: PY_MINOR_VERSION + + The ``4`` in ``3.4.1a2``. + +.. c:macro:: PY_MICRO_VERSION + + The ``1`` in ``3.4.1a2``. + +.. c:macro:: PY_RELEASE_LEVEL + + The ``a`` in ``3.4.1a2``. + This can be ``0xA`` for alpha, ``0xB`` for beta, ``0xC`` for release + candidate or ``0xF`` for final. +.. c:macro:: PY_RELEASE_SERIAL + + The ``2`` in ``3.4.1a2``. Zero for final releases. + +.. c:macro:: PY_VERSION_HEX + + The Python version number encoded in a single integer. + + The underlying version information can be found by treating it as a 32 bit + number in the following manner: + + +-------+-------------------------+-------------------------+--------------------------+ + | Bytes | Bits (big endian order) | Meaning | Value for ``3.4.1a2`` | + +=======+=========================+=========================+==========================+ + | 1 | 1-8 | ``PY_MAJOR_VERSION`` | ``0x03`` | + +-------+-------------------------+-------------------------+--------------------------+ + | 2 | 9-16 | ``PY_MINOR_VERSION`` | ``0x04`` | + +-------+-------------------------+-------------------------+--------------------------+ + | 3 | 17-24 | ``PY_MICRO_VERSION`` | ``0x01`` | + +-------+-------------------------+-------------------------+--------------------------+ + | 4 | 25-28 | ``PY_RELEASE_LEVEL`` | ``0xA`` | + + +-------------------------+-------------------------+--------------------------+ + | | 29-32 | ``PY_RELEASE_SERIAL`` | ``0x2`` | + +-------+-------------------------+-------------------------+--------------------------+ + + Thus ``3.4.1a2`` is hexversion ``0x030401a2`` and ``3.10.0`` is + hexversion ``0x030a00f0``. + + +All the given macros are defined in :source:`Include/patchlevel.h`. diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 6b60344a..1d93b35d 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -55,13 +55,11 @@ which disallows mutable objects such as :class:`bytearray`. .. note:: - For all ``#`` variants of formats (``s#``, ``y#``, etc.), the type of - the length argument (int or :c:type:`Py_ssize_t`) is controlled by - defining the macro :c:macro:`PY_SSIZE_T_CLEAN` before including - :file:`Python.h`. If the macro was defined, length is a - :c:type:`Py_ssize_t` rather than an :c:type:`int`. This behavior will change - in a future Python version to only support :c:type:`Py_ssize_t` and - drop :c:type:`int` support. It is best to always define :c:macro:`PY_SSIZE_T_CLEAN`. + For all ``#`` variants of formats (``s#``, ``y#``, etc.), the macro + :c:macro:`PY_SSIZE_T_CLEAN` must be defined before including + :file:`Python.h`. On Python 3.9 and older, the type of the length argument + is :c:type:`Py_ssize_t` if the :c:macro:`PY_SSIZE_T_CLEAN` macro is defined, + or int otherwise. ``s`` (:class:`str`) [const char \*] @@ -90,7 +88,7 @@ which disallows mutable objects such as :class:`bytearray`. In this case the resulting C string may contain embedded NUL bytes. Unicode objects are converted to C strings using ``'utf-8'`` encoding. -``s#`` (:class:`str`, read-only :term:`bytes-like object`) [const char \*, int or :c:type:`Py_ssize_t`] +``s#`` (:class:`str`, read-only :term:`bytes-like object`) [const char \*, :c:type:`Py_ssize_t`] Like ``s*``, except that it doesn't accept mutable objects. The result is stored into two C variables, the first one a pointer to a C string, the second one its length. @@ -105,7 +103,7 @@ which disallows mutable objects such as :class:`bytearray`. Like ``s*``, but the Python object may also be ``None``, in which case the ``buf`` member of the :c:type:`Py_buffer` structure is set to ``NULL``. -``z#`` (:class:`str`, read-only :term:`bytes-like object` or ``None``) [const char \*, int or :c:type:`Py_ssize_t`] +``z#`` (:class:`str`, read-only :term:`bytes-like object` or ``None``) [const char \*, :c:type:`Py_ssize_t`] Like ``s#``, but the Python object may also be ``None``, in which case the C pointer is set to ``NULL``. @@ -124,7 +122,7 @@ which disallows mutable objects such as :class:`bytearray`. bytes-like objects. **This is the recommended way to accept binary data.** -``y#`` (read-only :term:`bytes-like object`) [const char \*, int or :c:type:`Py_ssize_t`] +``y#`` (read-only :term:`bytes-like object`) [const char \*, :c:type:`Py_ssize_t`] This variant on ``s#`` doesn't accept Unicode objects, only bytes-like objects. @@ -155,7 +153,7 @@ which disallows mutable objects such as :class:`bytearray`. Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using :c:func:`PyUnicode_AsWideCharString`. -``u#`` (:class:`str`) [const Py_UNICODE \*, int or :c:type:`Py_ssize_t`] +``u#`` (:class:`str`) [const Py_UNICODE \*, :c:type:`Py_ssize_t`] This variant on ``u`` stores into two C variables, the first one a pointer to a Unicode data buffer, the second one its length. This variant allows null code points. @@ -172,7 +170,7 @@ which disallows mutable objects such as :class:`bytearray`. Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using :c:func:`PyUnicode_AsWideCharString`. -``Z#`` (:class:`str` or ``None``) [const Py_UNICODE \*, int or :c:type:`Py_ssize_t`] +``Z#`` (:class:`str` or ``None``) [const Py_UNICODE \*, :c:type:`Py_ssize_t`] Like ``u#``, but the Python object may also be ``None``, in which case the :c:type:`Py_UNICODE` pointer is set to ``NULL``. @@ -213,7 +211,7 @@ which disallows mutable objects such as :class:`bytearray`. recoding them. Instead, the implementation assumes that the byte string object uses the encoding passed in as parameter. -``es#`` (:class:`str`) [const char \*encoding, char \*\*buffer, int or :c:type:`Py_ssize_t` \*buffer_length] +``es#`` (:class:`str`) [const char \*encoding, char \*\*buffer, :c:type:`Py_ssize_t` \*buffer_length] This variant on ``s#`` is used for encoding Unicode into a character buffer. Unlike the ``es`` format, this variant allows input data which contains NUL characters. @@ -244,7 +242,7 @@ which disallows mutable objects such as :class:`bytearray`. In both cases, *\*buffer_length* is set to the length of the encoded data without the trailing NUL byte. -``et#`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char \*encoding, char \*\*buffer, int or :c:type:`Py_ssize_t` \*buffer_length] +``et#`` (:class:`str`, :class:`bytes` or :class:`bytearray`) [const char \*encoding, char \*\*buffer, :c:type:`Py_ssize_t` \*buffer_length] Same as ``es#`` except that byte string objects are passed through without recoding them. Instead, the implementation assumes that the byte string object uses the encoding passed in as parameter. @@ -288,7 +286,7 @@ Numbers Convert a Python integer to a C :c:type:`unsigned long long` without overflow checking. -``n`` (:class:`int`) [:c:type:`Py_ssize_t`] +``n`` (:class:`int`) [Py_ssize_t] Convert a Python integer to a C :c:type:`Py_ssize_t`. ``c`` (:class:`bytes` or :class:`bytearray` of length 1) [char] @@ -484,7 +482,8 @@ API Functions *min* and no more than *max*; *min* and *max* may be equal. Additional arguments must be passed to the function, each of which should be a pointer to a :c:type:`PyObject*` variable; these will be filled in with the values from - *args*; they will contain borrowed references. The variables which correspond + *args*; they will contain :term:`borrowed references `. + The variables which correspond to optional parameters not given by *args* will not be filled in; these should be initialized by the caller. This function returns true on success and false if *args* is not a tuple or contains the wrong number of elements; an exception @@ -549,7 +548,7 @@ Building values Convert a null-terminated C string to a Python :class:`str` object using ``'utf-8'`` encoding. If the C string pointer is ``NULL``, ``None`` is used. - ``s#`` (:class:`str` or ``None``) [const char \*, int or :c:type:`Py_ssize_t`] + ``s#`` (:class:`str` or ``None``) [const char \*, :c:type:`Py_ssize_t`] Convert a C string and its length to a Python :class:`str` object using ``'utf-8'`` encoding. If the C string pointer is ``NULL``, the length is ignored and ``None`` is returned. @@ -558,14 +557,14 @@ Building values This converts a C string to a Python :class:`bytes` object. If the C string pointer is ``NULL``, ``None`` is returned. - ``y#`` (:class:`bytes`) [const char \*, int or :c:type:`Py_ssize_t`] + ``y#`` (:class:`bytes`) [const char \*, :c:type:`Py_ssize_t`] This converts a C string and its lengths to a Python object. If the C string pointer is ``NULL``, ``None`` is returned. ``z`` (:class:`str` or ``None``) [const char \*] Same as ``s``. - ``z#`` (:class:`str` or ``None``) [const char \*, int or :c:type:`Py_ssize_t`] + ``z#`` (:class:`str` or ``None``) [const char \*, :c:type:`Py_ssize_t`] Same as ``s#``. ``u`` (:class:`str`) [const wchar_t \*] @@ -573,7 +572,7 @@ Building values data to a Python Unicode object. If the Unicode buffer pointer is ``NULL``, ``None`` is returned. - ``u#`` (:class:`str`) [const wchar_t \*, int or :c:type:`Py_ssize_t`] + ``u#`` (:class:`str`) [const wchar_t \*, :c:type:`Py_ssize_t`] Convert a Unicode (UTF-16 or UCS-4) data buffer and its length to a Python Unicode object. If the Unicode buffer pointer is ``NULL``, the length is ignored and ``None`` is returned. @@ -581,7 +580,7 @@ Building values ``U`` (:class:`str` or ``None``) [const char \*] Same as ``s``. - ``U#`` (:class:`str` or ``None``) [const char \*, int or :c:type:`Py_ssize_t`] + ``U#`` (:class:`str` or ``None``) [const char \*, :c:type:`Py_ssize_t`] Same as ``s#``. ``i`` (:class:`int`) [int] @@ -614,7 +613,7 @@ Building values ``K`` (:class:`int`) [unsigned long long] Convert a C :c:type:`unsigned long long` to a Python integer object. - ``n`` (:class:`int`) [:c:type:`Py_ssize_t`] + ``n`` (:class:`int`) [Py_ssize_t] Convert a C :c:type:`Py_ssize_t` to a Python integer. ``c`` (:class:`bytes` of length 1) [char] diff --git a/Doc/c-api/bytearray.rst b/Doc/c-api/bytearray.rst index 85a7d137..30bcfc7c 100644 --- a/Doc/c-api/bytearray.rst +++ b/Doc/c-api/bytearray.rst @@ -42,6 +42,8 @@ Direct API functions Return a new bytearray object from any object, *o*, that implements the :ref:`buffer protocol `. + .. XXX expand about the buffer protocol, at least somewhere + .. c:function:: PyObject* PyByteArray_FromStringAndSize(const char *string, Py_ssize_t len) diff --git a/Doc/c-api/bytes.rst b/Doc/c-api/bytes.rst index ffbfb5a6..de657010 100644 --- a/Doc/c-api/bytes.rst +++ b/Doc/c-api/bytes.rst @@ -5,7 +5,7 @@ Bytes Objects ------------- -These functions raise :exc:`TypeError` when expecting a bytes parameter and +These functions raise :exc:`TypeError` when expecting a bytes parameter and are called with a non-bytes parameter. .. index:: object: bytes @@ -84,8 +84,8 @@ called with a non-bytes parameter. | :attr:`%lu` | unsigned long | Equivalent to | | | | ``printf("%lu")``. [1]_ | +-------------------+---------------+--------------------------------+ - | :attr:`%zd` | :c:type:`\ | Equivalent to | - | | Py_ssize_t` | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | Py_ssize_t | Equivalent to | + | | | ``printf("%zd")``. [1]_ | +-------------------+---------------+--------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | diff --git a/Doc/c-api/call.rst b/Doc/c-api/call.rst index cdf72bc1..31dc9c80 100644 --- a/Doc/c-api/call.rst +++ b/Doc/c-api/call.rst @@ -26,7 +26,7 @@ This convention is not only used by *tp_call*: :c:member:`~PyTypeObject.tp_new` and :c:member:`~PyTypeObject.tp_init` also pass arguments this way. -To call an object, use :c:func:`PyObject_Call` or another +To call an object, use :c:func:`PyObject_Call` or other :ref:`call API `. @@ -185,7 +185,7 @@ Object Calling API Various functions are available for calling a Python object. Each converts its arguments to a convention supported by the called object – either *tp_call* or vectorcall. -In order to do as little conversion as possible, pick one that best fits +In order to do as litle conversion as possible, pick one that best fits the format of data you have available. The following table summarizes the available functions; diff --git a/Doc/c-api/code.rst b/Doc/c-api/code.rst index b3a17f18..6e18a422 100644 --- a/Doc/c-api/code.rst +++ b/Doc/c-api/code.rst @@ -51,3 +51,11 @@ bound into a function. Return a new empty code object with the specified filename, function name, and first line number. It is illegal to :func:`exec` or :func:`eval` the resulting code object. + +.. c:function:: int PyCode_Addr2Line(PyCodeObject *co, int byte_offset) + + Return the line number of the instruction that occurs on or before ``byte_offset`` and ends after it. + If you just need the line number of a frame, use :c:func:`PyFrame_GetLineNumber` instead. + + For efficiently iterating over the line numbers in a code object, use `the API described in PEP 626 + `_. diff --git a/Doc/c-api/codec.rst b/Doc/c-api/codec.rst index 172dcb32..235c77c9 100644 --- a/Doc/c-api/codec.rst +++ b/Doc/c-api/codec.rst @@ -10,6 +10,14 @@ Codec registry and support functions As side effect, this tries to load the :mod:`encodings` package, if not yet done, to make sure that it is always first in the list of search functions. +.. c:function:: int PyCodec_Unregister(PyObject *search_function) + + Unregister a codec search function and clear the registry's cache. + If the search function is not registered, do nothing. + Return 0 on success. Raise an exception and return -1 on error. + + .. versionadded:: 3.10 + .. c:function:: int PyCodec_KnownEncoding(const char *encoding) Return ``1`` or ``0`` depending on whether there is a registered codec for diff --git a/Doc/c-api/conversion.rst b/Doc/c-api/conversion.rst index 0cc836b7..7b4cc1ca 100644 --- a/Doc/c-api/conversion.rst +++ b/Doc/c-api/conversion.rst @@ -27,12 +27,8 @@ not. The wrappers ensure that ``str[size-1]`` is always ``'\0'`` upon return. They never write more than *size* bytes (including the trailing ``'\0'``) into str. -Both functions require that ``str != NULL``, ``size > 0`` and ``format != -NULL``. - -If the platform doesn't have :c:func:`vsnprintf` and the buffer size needed to -avoid truncation exceeds *size* by more than 512 bytes, Python aborts with a -:c:func:`Py_FatalError`. +Both functions require that ``str != NULL``, ``size > 0``, ``format != NULL`` +and ``size < INT_MAX``. The return value (*rv*) for these functions should be interpreted as follows: @@ -48,8 +44,8 @@ The return value (*rv*) for these functions should be interpreted as follows: this case too, but the rest of *str* is undefined. The exact cause of the error depends on the underlying platform. -The following functions provide locale-independent string to number conversions. +The following functions provide locale-independent string to number conversions. .. c:function:: double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception) diff --git a/Doc/c-api/datetime.rst b/Doc/c-api/datetime.rst index ad6ae653..4c4e4bcf 100644 --- a/Doc/c-api/datetime.rst +++ b/Doc/c-api/datetime.rst @@ -190,13 +190,11 @@ must not be ``NULL``, and the type is not checked: Return the microsecond, as an int from 0 through 999999. +.. c:function:: PyObject* PyDateTime_DATE_GET_TZINFO(PyDateTime_DateTime *o) -.. c:function:: int PyDateTime_DATE_GET_FOLD(PyDateTime_DateTime *o) - - Return the fold, as an int from 0 through 1. - - .. versionadded:: 3.6 + Return the tzinfo (which may be ``None``). + .. versionadded:: 3.10 Macros to extract fields from time objects. The argument must be an instance of :c:data:`PyDateTime_Time`, including subclasses. The argument must not be ``NULL``, @@ -221,12 +219,11 @@ and the type is not checked: Return the microsecond, as an int from 0 through 999999. +.. c:function:: PyObject* PyDateTime_TIME_GET_TZINFO(PyDateTime_Time *o) -.. c:function:: int PyDateTime_TIME_GET_FOLD(PyDateTime_Time *o) + Return the tzinfo (which may be ``None``). - Return the fold, as an int from 0 through 1. - - .. versionadded:: 3.6 + .. versionadded:: 3.10 Macros to extract fields from time delta objects. The argument must be an diff --git a/Doc/c-api/descriptor.rst b/Doc/c-api/descriptor.rst index 1005140c..b32c113e 100644 --- a/Doc/c-api/descriptor.rst +++ b/Doc/c-api/descriptor.rst @@ -32,8 +32,8 @@ found in the dictionary of type objects. .. c:function:: int PyDescr_IsData(PyObject *descr) - Return true if the descriptor objects *descr* describes a data attribute, or - false if it describes a method. *descr* must be a descriptor object; there is + Return non-zero if the descriptor objects *descr* describes a data attribute, or + ``0`` if it describes a method. *descr* must be a descriptor object; there is no error checking. diff --git a/Doc/c-api/dict.rst b/Doc/c-api/dict.rst index 5803ac2a..d257c9b5 100644 --- a/Doc/c-api/dict.rst +++ b/Doc/c-api/dict.rst @@ -102,6 +102,10 @@ Dictionary Objects :meth:`__eq__` methods will get suppressed. To get error reporting use :c:func:`PyDict_GetItemWithError()` instead. + .. versionchanged:: 3.10 + Calling this API without :term:`GIL` held had been allowed for historical + reason. It is no longer allowed. + .. c:function:: PyObject* PyDict_GetItemWithError(PyObject *p, PyObject *key) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst index 0e35590c..dc056590 100644 --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -182,8 +182,8 @@ For convenience, some of these functions will always return a .. c:function:: PyObject* PyErr_SetFromErrnoWithFilename(PyObject *type, const char *filename) Similar to :c:func:`PyErr_SetFromErrnoWithFilenameObject`, but the filename - is given as a C string. *filename* is decoded from the filesystem encoding - (:func:`os.fsdecode`). + is given as a C string. *filename* is decoded from the :term:`filesystem + encoding and error handler`. .. c:function:: PyObject* PyErr_SetFromWindowsErr(int ierr) @@ -253,14 +253,6 @@ For convenience, some of these functions will always return a .. versionadded:: 3.3 -.. c:function:: PyObject* PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path) - - Much like :c:func:`PyErr_SetImportError` but this function allows for - specifying a subclass of :exc:`ImportError` to raise. - - .. versionadded:: 3.6 - - .. c:function:: void PyErr_SyntaxLocationObject(PyObject *filename, int lineno, int col_offset) Set file, line, and offset information for the current exception. If the @@ -274,14 +266,14 @@ For convenience, some of these functions will always return a .. c:function:: void PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) Like :c:func:`PyErr_SyntaxLocationObject`, but *filename* is a byte string - decoded from the filesystem encoding (:func:`os.fsdecode`). + decoded from the :term:`filesystem encoding and error handler`. .. versionadded:: 3.2 .. c:function:: void PyErr_SyntaxLocation(const char *filename, int lineno) - Like :c:func:`PyErr_SyntaxLocationEx`, but the *col_offset* parameter is + Like :c:func:`PyErr_SyntaxLocationEx`, but the col_offset parameter is omitted. @@ -328,12 +320,19 @@ an error value). :mod:`warnings` module and the :option:`-W` option in the command line documentation. There is no C API for warning control. +.. c:function:: PyObject* PyErr_SetImportErrorSubclass(PyObject *exception, PyObject *msg, PyObject *name, PyObject *path) + + Much like :c:func:`PyErr_SetImportError` but this function allows for + specifying a subclass of :exc:`ImportError` to raise. + + .. versionadded:: 3.6 + .. c:function:: int PyErr_WarnExplicitObject(PyObject *category, PyObject *message, PyObject *filename, int lineno, PyObject *module, PyObject *registry) Issue a warning message with explicit control over all warning attributes. This is a straightforward wrapper around the Python function - :func:`warnings.warn_explicit`; see there for more information. The *module* + :func:`warnings.warn_explicit`, see there for more information. The *module* and *registry* arguments may be set to ``NULL`` to get the default effect described there. @@ -344,7 +343,7 @@ an error value). Similar to :c:func:`PyErr_WarnExplicitObject` except that *message* and *module* are UTF-8 encoded strings, and *filename* is decoded from the - filesystem encoding (:func:`os.fsdecode`). + :term:`filesystem encoding and error handler`. .. c:function:: int PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level, const char *format, ...) @@ -441,7 +440,7 @@ Querying the error indicator error indicator. -.. c:function:: void PyErr_NormalizeException(PyObject **exc, PyObject **val, PyObject **tb) +.. c:function:: void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb) Under certain circumstances, the values returned by :c:func:`PyErr_Fetch` below can be "unnormalized", meaning that ``*exc`` is a class object but ``*val`` is @@ -506,29 +505,73 @@ Signal Handling single: SIGINT single: KeyboardInterrupt (built-in exception) - This function interacts with Python's signal handling. It checks whether a - signal has been sent to the processes and if so, invokes the corresponding - signal handler. If the :mod:`signal` module is supported, this can invoke a - signal handler written in Python. In all cases, the default effect for - :const:`SIGINT` is to raise the :exc:`KeyboardInterrupt` exception. If an - exception is raised the error indicator is set and the function returns ``-1``; - otherwise the function returns ``0``. The error indicator may or may not be - cleared if it was previously set. + This function interacts with Python's signal handling. + + If the function is called from the main thread and under the main Python + interpreter, it checks whether a signal has been sent to the processes + and if so, invokes the corresponding signal handler. If the :mod:`signal` + module is supported, this can invoke a signal handler written in Python. + + The function attempts to handle all pending signals, and then returns ``0``. + However, if a Python signal handler raises an exception, the error + indicator is set and the function returns ``-1`` immediately (such that + other pending signals may not have been handled yet: they will be on the + next :c:func:`PyErr_CheckSignals()` invocation). + + If the function is called from a non-main thread, or under a non-main + Python interpreter, it does nothing and returns ``0``. + + This function can be called by long-running C code that wants to + be interruptible by user requests (such as by pressing Ctrl-C). + + .. note:: + The default Python signal handler for :const:`SIGINT` raises the + :exc:`KeyboardInterrupt` exception. .. c:function:: void PyErr_SetInterrupt() .. index:: + module: signal single: SIGINT single: KeyboardInterrupt (built-in exception) - Simulate the effect of a :const:`SIGINT` signal arriving. The next time + Simulate the effect of a :const:`SIGINT` signal arriving. + This is equivalent to ``PyErr_SetInterruptEx(SIGINT)``. + + .. note:: + This function is async-signal-safe. It can be called without + the :term:`GIL` and from a C signal handler. + + +.. c:function:: int PyErr_SetInterruptEx(int signum) + + .. index:: + module: signal + single: KeyboardInterrupt (built-in exception) + + Simulate the effect of a signal arriving. The next time :c:func:`PyErr_CheckSignals` is called, the Python signal handler for - :const:`SIGINT` will be called. + the given signal number will be called. + + This function can be called by C code that sets up its own signal handling + and wants Python signal handlers to be invoked as expected when an + interruption is requested (for example when the user presses Ctrl-C + to interrupt an operation). + + If the given signal isn't handled by Python (it was set to + :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), it will be ignored. + + If *signum* is outside of the allowed range of signal numbers, ``-1`` + is returned. Otherwise, ``0`` is returned. The error indicator is + never changed by this function. + + .. note:: + This function is async-signal-safe. It can be called without + the :term:`GIL` and from a C signal handler. + + .. versionadded:: 3.10 - If :const:`SIGINT` isn't handled by Python (it was set to - :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), this function does - nothing. .. c:function:: int PySignal_SetWakeupFd(int fd) @@ -845,11 +888,11 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +=========================================+=================================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | [1]_ | +| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | [1]_ | +| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | [1]_ | +| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | +-----------------------------------------+---------------------------------+----------+ @@ -895,7 +938,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | [1]_ | +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | +-----------------------------------------+---------------------------------+----------+ @@ -907,7 +950,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | [1]_ | +| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | +-----------------------------------------+---------------------------------+----------+ @@ -917,7 +960,7 @@ the variables: +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RecursionError` | :exc:`RecursionError` | | +-----------------------------------------+---------------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | | +| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | +-----------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | +-----------------------------------------+---------------------------------+----------+ @@ -982,7 +1025,7 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: +-------------------------------------+----------+ | :c:data:`PyExc_IOError` | | +-------------------------------------+----------+ -| :c:data:`PyExc_WindowsError` | [2]_ | +| :c:data:`PyExc_WindowsError` | \(3) | +-------------------------------------+----------+ .. versionchanged:: 3.3 @@ -990,10 +1033,10 @@ These are compatibility aliases to :c:data:`PyExc_OSError`: Notes: -.. [1] +(1) This is a base class for other standard exceptions. -.. [2] +(2) Only defined on Windows; protect code that uses this by testing that the preprocessor macro ``MS_WINDOWS`` is defined. @@ -1023,7 +1066,7 @@ the variables: +------------------------------------------+---------------------------------+----------+ | C Name | Python Name | Notes | +==========================================+=================================+==========+ -| :c:data:`PyExc_Warning` | :exc:`Warning` | [3]_ | +| :c:data:`PyExc_Warning` | :exc:`Warning` | \(1) | +------------------------------------------+---------------------------------+----------+ | :c:data:`PyExc_BytesWarning` | :exc:`BytesWarning` | | +------------------------------------------+---------------------------------+----------+ @@ -1051,5 +1094,5 @@ the variables: Notes: -.. [3] +(1) This is a base class for other standard warning categories. diff --git a/Doc/c-api/function.rst b/Doc/c-api/function.rst index 20968828..ad008425 100644 --- a/Doc/c-api/function.rst +++ b/Doc/c-api/function.rst @@ -61,9 +61,11 @@ There are a few functions specific to Python functions. .. c:function:: PyObject* PyFunction_GetModule(PyObject *op) - Return the *__module__* attribute of the function object *op*. This is normally - a string containing the module name, but can be set to any other object by - Python code. + Return a :term:`borrowed reference` to the *__module__* attribute of the + function object *op*. It can be *NULL*. + + This is normally a string containing the module name, but can be set to any + other object by Python code. .. c:function:: PyObject* PyFunction_GetDefaults(PyObject *op) diff --git a/Doc/c-api/gcsupport.rst b/Doc/c-api/gcsupport.rst index b0d62d8c..4bd2fb38 100644 --- a/Doc/c-api/gcsupport.rst +++ b/Doc/c-api/gcsupport.rst @@ -33,14 +33,6 @@ Constructors for container types must conform to two rules: #. Once all the fields which may contain references to other containers are initialized, it must call :c:func:`PyObject_GC_Track`. -Similarly, the deallocator for the object must conform to a similar pair of -rules: - -#. Before fields which refer to other containers are invalidated, - :c:func:`PyObject_GC_UnTrack` must be called. - -#. The object's memory must be deallocated using :c:func:`PyObject_GC_Del`. - .. warning:: If a type adds the Py_TPFLAGS_HAVE_GC, then it *must* implement at least a :c:member:`~PyTypeObject.tp_traverse` handler or explicitly use one @@ -108,6 +100,14 @@ rules: .. versionadded:: 3.9 +Similarly, the deallocator for the object must conform to a similar pair of +rules: + +#. Before fields which refer to other containers are invalidated, + :c:func:`PyObject_GC_UnTrack` must be called. + +#. The object's memory must be deallocated using :c:func:`PyObject_GC_Del`. + .. c:function:: void PyObject_GC_Del(void *op) @@ -185,3 +185,46 @@ if the object is immutable. this method (don't just call :c:func:`Py_DECREF` on a reference). The collector will call this method if it detects that this object is involved in a reference cycle. + + +Controlling the Garbage Collector State +--------------------------------------- + +The C-API provides the following functions for controlling +garbage collection runs. + +.. c:function:: Py_ssize_t PyGC_Collect(void) + + Perform a full garbage collection, if the garbage collector is enabled. + (Note that :func:`gc.collect` runs it unconditionally.) + + Returns the number of collected + unreachable objects which cannot + be collected. + If the garbage collector is disabled or already collecting, + returns ``0`` immediately. + Errors during garbage collection are passed to :data:`sys.unraisablehook`. + This function does not raise exceptions. + + +.. c:function:: int PyGC_Enable(void) + + Enable the garbage collector: similar to :func:`gc.enable`. + Returns the previous state, 0 for disabled and 1 for enabled. + + .. versionadded:: 3.10 + + +.. c:function:: int PyGC_Disable(void) + + Disable the garbage collector: similar to :func:`gc.disable`. + Returns the previous state, 0 for disabled and 1 for enabled. + + .. versionadded:: 3.10 + + +.. c:function:: int PyGC_IsEnabled(void) + + Query the state of the garbage collector: similar to :func:`gc.isenabled`. + Returns the current state, 0 for disabled and 1 for enabled. + + .. versionadded:: 3.10 diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst index 06e88683..9ac3039d 100644 --- a/Doc/c-api/init.rst +++ b/Doc/c-api/init.rst @@ -151,8 +151,9 @@ to 1 and ``-bb`` sets :c:data:`Py_BytesWarningFlag` to 2. .. c:var:: int Py_LegacyWindowsFSEncodingFlag - If the flag is non-zero, use the ``mbcs`` encoding instead of the UTF-8 - encoding for the filesystem encoding. + If the flag is non-zero, use the ``mbcs`` encoding with ``replace`` error + handler, instead of the UTF-8 encoding with ``surrogatepass`` error handler, + for the :term:`filesystem encoding and error handler`. Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable is set to a non-empty string. @@ -375,6 +376,12 @@ Process-wide parameters The returned string points into static storage; the caller should not modify its value. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetPrefix() @@ -388,6 +395,12 @@ Process-wide parameters script at build time. The value is available to Python code as ``sys.prefix``. It is only useful on Unix. See also the next function. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetExecPrefix() @@ -423,6 +436,12 @@ Process-wide parameters while having :file:`/usr/local/plat` be a different filesystem for each platform. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetProgramFullPath() @@ -436,6 +455,12 @@ Process-wide parameters static storage; the caller should not modify its value. The value is available to Python code as ``sys.executable``. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: wchar_t* Py_GetPath() @@ -454,8 +479,14 @@ Process-wide parameters can be (and usually is) modified later to change the search path for loading modules. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + .. XXX should give the exact rules + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. c:function:: void Py_SetPath(const wchar_t *) @@ -498,7 +529,7 @@ Process-wide parameters .. index:: single: version (in module sys) The first word (up to the first space character) is the current Python version; - the first characters are the major and minor version separated by a + the first three characters are the major and minor version separated by a period. The returned string points into static storage; the caller should not modify its value. The value is available to Python code as :data:`sys.version`. @@ -637,6 +668,12 @@ Process-wide parameters :c:func:`Py_SetPythonHome`, or the value of the :envvar:`PYTHONHOME` environment variable if it is set. + This function should not be called before :c:func:`Py_Initialize`, otherwise + it returns ``NULL``. + + .. versionchanged:: 3.10 + It now returns ``NULL`` if called before :c:func:`Py_Initialize`. + .. _threads: @@ -1076,7 +1113,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`. Get the current frame of the Python thread state *tstate*. - Return a strong reference. Return ``NULL`` if no frame is currently + Return a :term:`strong reference`. Return ``NULL`` if no frame is currently executing. See also :c:func:`PyEval_GetFrame`. @@ -1688,7 +1725,7 @@ is not possible due to its implementation being opaque at build time. argument is `NULL`. .. note:: - A freed key becomes a dangling pointer. You should reset the key to + A freed key becomes a dangling pointer, you should reset the key to `NULL`. diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index f44c7bb5..fe5b83aa 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -8,46 +8,24 @@ Python Initialization Configuration .. versionadded:: 3.8 -Structures: - -* :c:type:`PyConfig` -* :c:type:`PyPreConfig` -* :c:type:`PyStatus` -* :c:type:`PyWideStringList` - -Functions: - -* :c:func:`PyConfig_Clear` -* :c:func:`PyConfig_InitIsolatedConfig` -* :c:func:`PyConfig_InitPythonConfig` -* :c:func:`PyConfig_Read` -* :c:func:`PyConfig_SetArgv` -* :c:func:`PyConfig_SetBytesArgv` -* :c:func:`PyConfig_SetBytesString` -* :c:func:`PyConfig_SetString` -* :c:func:`PyConfig_SetWideStringList` -* :c:func:`PyPreConfig_InitIsolatedConfig` -* :c:func:`PyPreConfig_InitPythonConfig` -* :c:func:`PyStatus_Error` -* :c:func:`PyStatus_Exception` -* :c:func:`PyStatus_Exit` -* :c:func:`PyStatus_IsError` -* :c:func:`PyStatus_IsExit` -* :c:func:`PyStatus_NoMemory` -* :c:func:`PyStatus_Ok` -* :c:func:`PyWideStringList_Append` -* :c:func:`PyWideStringList_Insert` -* :c:func:`Py_ExitStatusException` -* :c:func:`Py_InitializeFromConfig` -* :c:func:`Py_PreInitialize` -* :c:func:`Py_PreInitializeFromArgs` -* :c:func:`Py_PreInitializeFromBytesArgs` -* :c:func:`Py_RunMain` -* :c:func:`Py_GetArgcArgv` - -The preconfiguration (``PyPreConfig`` type) is stored in -``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in -``PyInterpreterState.config``. +Python can be initialized with :c:func:`Py_InitializeFromConfig` and the +:c:type:`PyConfig` structure. It can be preinitialized with +:c:func:`Py_PreInitialize` and the :c:type:`PyPreConfig` structure. + +There are two kinds of configuration: + +* The :ref:`Python Configuration ` can be used to build a + customized Python which behaves as the regular Python. For example, + environments variables and command line arguments are used to configure + Python. + +* The :ref:`Isolated Configuration ` can be used to embed + Python into an application. It isolates Python from the system. For example, + environments variables are ignored, the LC_CTYPE locale is left unchanged and + no signal handler is registred. + +The :c:func:`Py_RunMain` function can be used to write a customized Python +program. See also :ref:`Initialization, Finalization, and Threads `. @@ -55,8 +33,47 @@ See also :ref:`Initialization, Finalization, and Threads `. :pep:`587` "Python Initialization Configuration". +Example +======= + +Example of customized Python always running in isolated mode:: + + int main(int argc, char **argv) + { + PyStatus status; + + PyConfig config; + PyConfig_InitPythonConfig(&config); + config.isolated = 1; + + /* Decode command line arguments. + Implicitly preinitialize Python (in isolated mode). */ + status = PyConfig_SetBytesArgv(&config, argc, argv); + if (PyStatus_Exception(status)) { + goto exception; + } + + status = Py_InitializeFromConfig(&config); + if (PyStatus_Exception(status)) { + goto exception; + } + PyConfig_Clear(&config); + + return Py_RunMain(); + + exception: + PyConfig_Clear(&config); + if (PyStatus_IsExit(status)) { + return status.exitcode; + } + /* Display the error message and exit the process with + non-zero exit code */ + Py_ExitStatusException(status); + } + + PyWideStringList ----------------- +================ .. c:type:: PyWideStringList @@ -95,7 +112,7 @@ PyWideStringList List items. PyStatus --------- +======== .. c:type:: PyStatus @@ -128,6 +145,8 @@ PyStatus Initialization error with a message. + *err_msg* must not be ``NULL``. + .. c:function:: PyStatus PyStatus_NoMemory(void) Memory allocation failure (out of memory). @@ -185,15 +204,11 @@ Example:: PyPreConfig ------------ +=========== .. c:type:: PyPreConfig - Structure used to preinitialize Python: - - * Set the Python memory allocator - * Configure the LC_CTYPE locale - * Set the UTF-8 mode + Structure used to preinitialize Python. Function to initialize a preconfiguration: @@ -211,56 +226,89 @@ PyPreConfig .. c:member:: int allocator - Name of the memory allocator: + Name of the Python memory allocators: * ``PYMEM_ALLOCATOR_NOT_SET`` (``0``): don't change memory allocators - (use defaults) - * ``PYMEM_ALLOCATOR_DEFAULT`` (``1``): default memory allocators - * ``PYMEM_ALLOCATOR_DEBUG`` (``2``): default memory allocators with - debug hooks - * ``PYMEM_ALLOCATOR_MALLOC`` (``3``): force usage of ``malloc()`` + (use defaults). + * ``PYMEM_ALLOCATOR_DEFAULT`` (``1``): :ref:`default memory allocators + `. + * ``PYMEM_ALLOCATOR_DEBUG`` (``2``): :ref:`default memory allocators + ` with :ref:`debug hooks + `. + * ``PYMEM_ALLOCATOR_MALLOC`` (``3``): use ``malloc()`` of the C library. * ``PYMEM_ALLOCATOR_MALLOC_DEBUG`` (``4``): force usage of - ``malloc()`` with debug hooks + ``malloc()`` with :ref:`debug hooks `. * ``PYMEM_ALLOCATOR_PYMALLOC`` (``5``): :ref:`Python pymalloc memory - allocator ` + allocator `. * ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` (``6``): :ref:`Python pymalloc - memory allocator ` with debug hooks + memory allocator ` with :ref:`debug hooks + `. - ``PYMEM_ALLOCATOR_PYMALLOC`` and ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` - are not supported if Python is configured using ``--without-pymalloc`` + ``PYMEM_ALLOCATOR_PYMALLOC`` and ``PYMEM_ALLOCATOR_PYMALLOC_DEBUG`` are + not supported if Python is :option:`configured using --without-pymalloc + <--without-pymalloc>`. See :ref:`Memory Management `. + Default: ``PYMEM_ALLOCATOR_NOT_SET``. + .. c:member:: int configure_locale - Set the LC_CTYPE locale to the user preferred locale? If equals to 0, set - :c:member:`coerce_c_locale` and :c:member:`coerce_c_locale_warn` to 0. + Set the LC_CTYPE locale to the user preferred locale? + + If equals to 0, set :c:member:`~PyPreConfig.coerce_c_locale` and + :c:member:`~PyPreConfig.coerce_c_locale_warn` members to 0. + + See the :term:`locale encoding`. + + Default: ``1`` in Python config, ``0`` in isolated config. .. c:member:: int coerce_c_locale - If equals to 2, coerce the C locale; if equals to 1, read the LC_CTYPE - locale to decide if it should be coerced. + If equals to 2, coerce the C locale. + + If equals to 1, read the LC_CTYPE locale to decide if it should be + coerced. + + See the :term:`locale encoding`. + + Default: ``-1`` in Python config, ``0`` in isolated config. .. c:member:: int coerce_c_locale_warn If non-zero, emit a warning if the C locale is coerced. + Default: ``-1`` in Python config, ``0`` in isolated config. + .. c:member:: int dev_mode - See :c:member:`PyConfig.dev_mode`. + If non-zero, enables the :ref:`Python Development Mode `: + see :c:member:`PyConfig.dev_mode`. + + Default: ``-1`` in Python mode, ``0`` in isolated mode. .. c:member:: int isolated - See :c:member:`PyConfig.isolated`. + Isolated mode: see :c:member:`PyConfig.isolated`. + + Default: ``0`` in Python mode, ``1`` in isolated mode. + + .. c:member:: int legacy_windows_fs_encoding + + If non-zero: - .. c:member:: int legacy_windows_fs_encoding (Windows only) + * Set :c:member:`PyPreConfig.utf8_mode` to ``0``, + * Set :c:member:`PyConfig.filesystem_encoding` to ``"mbcs"``, + * Set :c:member:`PyConfig.filesystem_errors` to ``"replace"``. - If non-zero, disable UTF-8 Mode, set the Python filesystem encoding to - ``mbcs``, set the filesystem error handler to ``replace``. + Initialized the from :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment + variable value. Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for Windows specific code. + Default: ``0``. + .. c:member:: int parse_argv If non-zero, :c:func:`Py_PreInitializeFromArgs` and @@ -268,16 +316,39 @@ PyPreConfig same way the regular Python parses command line arguments: see :ref:`Command Line Arguments `. + Default: ``1`` in Python config, ``0`` in isolated config. + .. c:member:: int use_environment - See :c:member:`PyConfig.use_environment`. + Use :ref:`environment variables `? See + :c:member:`PyConfig.use_environment`. + + Default: ``1`` in Python config and ``0`` in isolated config. .. c:member:: int utf8_mode - If non-zero, enable the UTF-8 mode. + If non-zero, enable the :ref:`Python UTF-8 Mode `. + + Set by the :option:`-X utf8 <-X>` command line option and the + :envvar:`PYTHONUTF8` environment variable. -Preinitialization with PyPreConfig ----------------------------------- + Default: ``-1`` in Python config and ``0`` in isolated config. + + +.. _c-preinit: + +Preinitialize Python with PyPreConfig +===================================== + +The preinitialization of Python: + +* Set the Python memory allocators (:c:member:`PyPreConfig.allocator`) +* Configure the LC_CTYPE locale (:term:`locale encoding`) +* Set the :ref:`Python UTF-8 Mode ` + (:c:member:`PyPreConfig.utf8_mode`) + +The current preconfiguration (``PyPreConfig`` type) is stored in +``_PyRuntime.preconfig``. Functions to preinitialize Python: @@ -285,15 +356,25 @@ Functions to preinitialize Python: Preinitialize Python from *preconfig* preconfiguration. + *preconfig* must not be ``NULL``. + .. c:function:: PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv) - Preinitialize Python from *preconfig* preconfiguration and command line - arguments (bytes strings). + Preinitialize Python from *preconfig* preconfiguration. + + Parse *argv* command line arguments (bytes strings) if + :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero. + + *preconfig* must not be ``NULL``. .. c:function:: PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv) - Preinitialize Python from *preconfig* preconfiguration and command line - arguments (wide strings). + Preinitialize Python from *preconfig* preconfiguration. + + Parse *argv* command line arguments (wide strings) if + :c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero. + + *preconfig* must not be ``NULL``. The caller is responsible to handle exceptions (error or exit) using :c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`. @@ -303,7 +384,7 @@ For :ref:`Python Configuration ` command line arguments, the command line arguments must also be passed to preinitialize Python, since they have an effect on the pre-configuration like encodings. For example, the :option:`-X utf8 <-X>` command line option -enables the UTF-8 Mode. +enables the :ref:`Python UTF-8 Mode `. ``PyMem_SetAllocator()`` can be called after :c:func:`Py_PreInitialize` and before :c:func:`Py_InitializeFromConfig` to install a custom memory allocator. @@ -311,11 +392,12 @@ It can be called before :c:func:`Py_PreInitialize` if :c:member:`PyPreConfig.allocator` is set to ``PYMEM_ALLOCATOR_NOT_SET``. Python memory allocation functions like :c:func:`PyMem_RawMalloc` must not be -used before Python preinitialization, whereas calling directly ``malloc()`` and -``free()`` is always safe. :c:func:`Py_DecodeLocale` must not be called before -the preinitialization. +used before the Python preinitialization, whereas calling directly ``malloc()`` +and ``free()`` is always safe. :c:func:`Py_DecodeLocale` must not be called +before the Python preinitialization. -Example using the preinitialization to enable the UTF-8 Mode:: +Example using the preinitialization to enable +the :ref:`Python UTF-8 Mode `:: PyStatus status; PyPreConfig preconfig; @@ -328,7 +410,7 @@ Example using the preinitialization to enable the UTF-8 Mode:: Py_ExitStatusException(status); } - /* at this point, Python will speak UTF-8 */ + /* at this point, Python speaks UTF-8 */ Py_Initialize(); /* ... use Python API here ... */ @@ -336,53 +418,60 @@ Example using the preinitialization to enable the UTF-8 Mode:: PyConfig --------- +======== .. c:type:: PyConfig Structure containing most parameters to configure Python. + When done, the :c:func:`PyConfig_Clear` function must be used to release the + configuration memory. + Structure methods: .. c:function:: void PyConfig_InitPythonConfig(PyConfig *config) - Initialize configuration with :ref:`Python Configuration + Initialize configuration with the :ref:`Python Configuration `. .. c:function:: void PyConfig_InitIsolatedConfig(PyConfig *config) - Initialize configuration with :ref:`Isolated Configuration + Initialize configuration with the :ref:`Isolated Configuration `. .. c:function:: PyStatus PyConfig_SetString(PyConfig *config, wchar_t * const *config_str, const wchar_t *str) Copy the wide character string *str* into ``*config_str``. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetBytesString(PyConfig *config, wchar_t * const *config_str, const char *str) - Decode *str* using ``Py_DecodeLocale()`` and set the result into ``*config_str``. + Decode *str* using :c:func:`Py_DecodeLocale` and set the result into + ``*config_str``. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetArgv(PyConfig *config, int argc, wchar_t * const *argv) - Set command line arguments from wide character strings. + Set command line arguments (:c:member:`~PyConfig.argv` member of + *config*) from the *argv* list of wide character strings. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetBytesArgv(PyConfig *config, int argc, char * const *argv) - Set command line arguments: decode bytes using :c:func:`Py_DecodeLocale`. + Set command line arguments (:c:member:`~PyConfig.argv` member of + *config*) from the *argv* list of bytes strings. Decode bytes using + :c:func:`Py_DecodeLocale`. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_SetWideStringList(PyConfig *config, PyWideStringList *list, Py_ssize_t length, wchar_t **items) Set the list of wide strings *list* to *length* and *items*. - Preinitialize Python if needed. + :ref:`Preinitialize Python ` if needed. .. c:function:: PyStatus PyConfig_Read(PyConfig *config) @@ -390,24 +479,37 @@ PyConfig Fields which are already initialized are left unchanged. - Preinitialize Python if needed. + The :c:func:`PyConfig_Read` function only parses + :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` + is set to ``2`` after arguments are parsed. Since Python arguments are + strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + parse the application options as Python options. + + :ref:`Preinitialize Python ` if needed. + + .. versionchanged:: 3.10 + The :c:member:`PyConfig.argv` arguments are now only parsed once, + :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are + parsed, and arguments are only parsed if + :c:member:`PyConfig.parse_argv` equals ``1``. .. c:function:: void PyConfig_Clear(PyConfig *config) Release configuration memory. - Most ``PyConfig`` methods preinitialize Python if needed. In that case, the - Python preinitialization configuration in based on the :c:type:`PyConfig`. - If configuration fields which are in common with :c:type:`PyPreConfig` are - tuned, they must be set before calling a :c:type:`PyConfig` method: + Most ``PyConfig`` methods :ref:`preinitialize Python ` if needed. + In that case, the Python preinitialization configuration + (:c:type:`PyPreConfig`) in based on the :c:type:`PyConfig`. If configuration + fields which are in common with :c:type:`PyPreConfig` are tuned, they must + be set before calling a :c:type:`PyConfig` method: - * :c:member:`~PyConfig.dev_mode` - * :c:member:`~PyConfig.isolated` - * :c:member:`~PyConfig.parse_argv` - * :c:member:`~PyConfig.use_environment` + * :c:member:`PyConfig.dev_mode` + * :c:member:`PyConfig.isolated` + * :c:member:`PyConfig.parse_argv` + * :c:member:`PyConfig.use_environment` Moreover, if :c:func:`PyConfig_SetArgv` or :c:func:`PyConfig_SetBytesArgv` - is used, this method must be called first, before other methods, since the + is used, this method must be called before other methods, since the preinitialization configuration depends on command line arguments (if :c:member:`parse_argv` is non-zero). @@ -418,90 +520,205 @@ PyConfig .. c:member:: PyWideStringList argv - Command line arguments, :data:`sys.argv`. See - :c:member:`~PyConfig.parse_argv` to parse :c:member:`~PyConfig.argv` the - same way the regular Python parses Python command line arguments. If - :c:member:`~PyConfig.argv` is empty, an empty string is added to ensure - that :data:`sys.argv` always exists and is never empty. + Command line arguments: :data:`sys.argv`. + + Set :c:member:`~PyConfig.parse_argv` to ``1`` to parse + :c:member:`~PyConfig.argv` the same way the regular Python parses Python + command line arguments and then to strip Python arguments from + :c:member:`~PyConfig.argv`. + + If :c:member:`~PyConfig.argv` is empty, an empty string is added to + ensure that :data:`sys.argv` always exists and is never empty. + + Default: ``NULL``. + + See also the :c:member:`~PyConfig.orig_argv` member. .. c:member:: wchar_t* base_exec_prefix :data:`sys.base_exec_prefix`. + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` output. + .. c:member:: wchar_t* base_executable - :data:`sys._base_executable`: ``__PYVENV_LAUNCHER__`` environment - variable value, or copy of :c:member:`PyConfig.executable`. + Python base executable: :data:`sys._base_executable`. + + Set by the :envvar:`__PYVENV_LAUNCHER__` environment variable. + + Set from :c:member:`PyConfig.executable` if ``NULL``. + + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* base_prefix :data:`sys.base_prefix`. - .. c:member:: wchar_t* platlibdir - - :data:`sys.platlibdir`: platform library directory name, set at configure time - by ``--with-platlibdir``, overrideable by the ``PYTHONPLATLIBDIR`` - environment variable. + Default: ``NULL``. - .. versionadded:: 3.9 + Part of the :ref:`Python Path Configuration ` output. .. c:member:: int buffered_stdio - If equals to 0, enable unbuffered mode, making the stdout and stderr - streams unbuffered. + If equals to 0 and :c:member:`~PyConfig.configure_c_stdio` is non-zero, + disable buffering on the C streams stdout and stderr. + + Set to 0 by the :option:`-u` command line option and the + :envvar:`PYTHONUNBUFFERED` environment variable. stdin is always opened in buffered mode. + Default: ``1``. + .. c:member:: int bytes_warning If equals to 1, issue a warning when comparing :class:`bytes` or :class:`bytearray` with :class:`str`, or comparing :class:`bytes` with - :class:`int`. If equal or greater to 2, raise a :exc:`BytesWarning` - exception. + :class:`int`. + + If equal or greater to 2, raise a :exc:`BytesWarning` exception in these + cases. + + Incremented by the :option:`-b` command line option. + + Default: ``0``. + + .. c:member:: int warn_default_encoding + + If non-zero, emit a :exc:`EncodingWarning` warning when :class:`io.TextIOWrapper` + uses its default encoding. See :ref:`io-encoding-warning` for details. + + Default: ``0``. + + .. versionadded:: 3.10 .. c:member:: wchar_t* check_hash_pycs_mode - Control the validation behavior of hash-based ``.pyc`` files (see - :pep:`552`): :option:`--check-hash-based-pycs` command line option value. + Control the validation behavior of hash-based ``.pyc`` files: + value of the :option:`--check-hash-based-pycs` command line option. + + Valid values: + + - ``L"always"``: Hash the source file for invalidation regardless of + value of the 'check_source' flag. + - ``L"never"``: Assume that hash-based pycs always are valid. + - ``L"default"``: The 'check_source' flag in hash-based pycs + determines invalidation. - Valid values: ``always``, ``never`` and ``default``. + Default: ``L"default"``. - The default value is: ``default``. + See also :pep:`552` "Deterministic pycs". .. c:member:: int configure_c_stdio - If non-zero, configure C standard streams (``stdio``, ``stdout``, - ``stdout``). For example, set their mode to ``O_BINARY`` on Windows. + If non-zero, configure C standard streams: + + * On Windows, set the binary mode (``O_BINARY``) on stdin, stdout and + stderr. + * If :c:member:`~PyConfig.buffered_stdio` equals zero, disable buffering + of stdin, stdout and stderr streams. + * If :c:member:`~PyConfig.interactive` is non-zero, enable stream + buffering on stdin and stdout (only stdout on Windows). + + Default: ``1`` in Python config, ``0`` in isolated config. .. c:member:: int dev_mode If non-zero, enable the :ref:`Python Development Mode `. + Default: ``-1`` in Python mode, ``0`` in isolated mode. + .. c:member:: int dump_refs + Dump Python refererences? + If non-zero, dump all objects which are still alive at exit. - ``Py_TRACE_REFS`` macro must be defined in build. + Set to ``1`` by the :envvar:`PYTHONDUMPREFS` environment variable. + + Need a special build of Python with the ``Py_TRACE_REFS`` macro defined: + see the :option:`configure --with-trace-refs option <--with-trace-refs>`. + + Default: ``0``. .. c:member:: wchar_t* exec_prefix - :data:`sys.exec_prefix`. + The site-specific directory prefix where the platform-dependent Python + files are installed: :data:`sys.exec_prefix`. + + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* executable + The absolute path of the executable binary for the Python interpreter: :data:`sys.executable`. + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` output. + .. c:member:: int faulthandler + Enable faulthandler? + If non-zero, call :func:`faulthandler.enable` at startup. + Set to ``1`` by :option:`-X faulthandler <-X>` and the + :envvar:`PYTHONFAULTHANDLER` environment variable. + + Default: ``-1`` in Python mode, ``0`` in isolated mode. + .. c:member:: wchar_t* filesystem_encoding - Filesystem encoding, :func:`sys.getfilesystemencoding`. + :term:`Filesystem encoding `: + :func:`sys.getfilesystemencoding`. + + On macOS, Android and VxWorks: use ``"utf-8"`` by default. + + On Windows: use ``"utf-8"`` by default, or ``"mbcs"`` if + :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of + :c:type:`PyPreConfig` is non-zero. + + Default encoding on other platforms: + + * ``"utf-8"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero. + * ``"ascii"`` if Python detects that ``nl_langinfo(CODESET)`` announces + the ASCII encoding (or Roman8 encoding on HP-UX), whereas the + ``mbstowcs()`` function decodes from a different encoding (usually + Latin1). + * ``"utf-8"`` if ``nl_langinfo(CODESET)`` returns an empty string. + * Otherwise, use the :term:`locale encoding`: + ``nl_langinfo(CODESET)`` result. + + At Python statup, the encoding name is normalized to the Python codec + name. For example, ``"ANSI_X3.4-1968"`` is replaced with ``"ascii"``. + + See also the :c:member:`~PyConfig.filesystem_errors` member. .. c:member:: wchar_t* filesystem_errors - Filesystem encoding errors, :func:`sys.getfilesystemencodeerrors`. + :term:`Filesystem error handler `: + :func:`sys.getfilesystemencodeerrors`. + + On Windows: use ``"surrogatepass"`` by default, or ``"replace"`` if + :c:member:`~PyPreConfig.legacy_windows_fs_encoding` of + :c:type:`PyPreConfig` is non-zero. + + On other platforms: use ``"surrogateescape"`` by default. + + Supported error handlers: + + * ``"strict"`` + * ``"surrogateescape"`` + * ``"surrogatepass"`` (only supported with the UTF-8 encoding) + + See also the :c:member:`~PyConfig.filesystem_encoding` member. .. c:member:: unsigned long hash_seed .. c:member:: int use_hash_seed @@ -509,30 +726,62 @@ PyConfig Randomized hash function seed. If :c:member:`~PyConfig.use_hash_seed` is zero, a seed is chosen randomly - at Pythonstartup, and :c:member:`~PyConfig.hash_seed` is ignored. + at Python startup, and :c:member:`~PyConfig.hash_seed` is ignored. + + Set by the :envvar:`PYTHONHASHSEED` environment variable. + + Default *use_hash_seed* value: ``-1`` in Python mode, ``0`` in isolated + mode. .. c:member:: wchar_t* home Python home directory. - Initialized from :envvar:`PYTHONHOME` environment variable value by - default. + If :c:func:`Py_SetPythonHome` has been called, use its argument if it is + not ``NULL``. + + Set by the :envvar:`PYTHONHOME` environment variable. + + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` input. .. c:member:: int import_time If non-zero, profile import time. + Set the ``1`` by the :option:`-X importtime <-X>` option and the + :envvar:`PYTHONPROFILEIMPORTTIME` environment variable. + + Default: ``0``. + .. c:member:: int inspect Enter interactive mode after executing a script or a command. + If greater than 0, enable inspect: when a script is passed as first + argument or the -c option is used, enter interactive mode after executing + the script or the command, even when :data:`sys.stdin` does not appear to + be a terminal. + + Incremented by the :option:`-i` command line option. Set to ``1`` if the + :envvar:`PYTHONINSPECT` environment variable is non-empty. + + Default: ``0``. + .. c:member:: int install_signal_handlers - Install signal handlers? + Install Python signal handlers? + + Default: ``1`` in Python mode, ``0`` in isolated mode. .. c:member:: int interactive - Interactive mode. + If greater than 0, enable the interactive mode (REPL). + + Incremented by the :option:`-i` command line option. + + Default: ``0``. .. c:member:: int isolated @@ -546,95 +795,227 @@ PyConfig * Set :c:member:`~PyConfig.use_environment` and :c:member:`~PyConfig.user_site_directory` to 0. + Default: ``0`` in Python mode, ``1`` in isolated mode. + + See also :c:member:`PyPreConfig.isolated`. + .. c:member:: int legacy_windows_stdio If non-zero, use :class:`io.FileIO` instead of :class:`io.WindowsConsoleIO` for :data:`sys.stdin`, :data:`sys.stdout` and :data:`sys.stderr`. + Set to ``1`` if the :envvar:`PYTHONLEGACYWINDOWSSTDIO` environment + variable is set to a non-empty string. + Only available on Windows. ``#ifdef MS_WINDOWS`` macro can be used for Windows specific code. + Default: ``0``. + + See also the :pep:`528` (Change Windows console encoding to UTF-8). + .. c:member:: int malloc_stats If non-zero, dump statistics on :ref:`Python pymalloc memory allocator ` at exit. - The option is ignored if Python is built using ``--without-pymalloc``. + Set to ``1`` by the :envvar:`PYTHONMALLOCSTATS` environment variable. + + The option is ignored if Python is :option:`configured using + the --without-pymalloc option <--without-pymalloc>`. + + Default: ``0``. + + .. c:member:: wchar_t* platlibdir + + Platform library directory name: :data:`sys.platlibdir`. + + Set by the :envvar:`PYTHONPLATLIBDIR` environment variable. + + Default: value of the ``PLATLIBDIR`` macro which is set by the + :option:`configure --with-platlibdir option <--with-platlibdir>` + (default: ``"lib"``). + + Part of the :ref:`Python Path Configuration ` input. + + .. versionadded:: 3.9 .. c:member:: wchar_t* pythonpath_env - Module search paths as a string separated by ``DELIM`` + Module search paths (:data:`sys.path`) as a string separated by ``DELIM`` (:data:`os.path.pathsep`). - Initialized from :envvar:`PYTHONPATH` environment variable value by - default. + Set by the :envvar:`PYTHONPATH` environment variable. + + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` input. .. c:member:: PyWideStringList module_search_paths .. c:member:: int module_search_paths_set - :data:`sys.path`. If :c:member:`~PyConfig.module_search_paths_set` is - equal to 0, the :c:member:`~PyConfig.module_search_paths` is overridden - by the function calculating the :ref:`Path Configuration - `. + Module search paths: :data:`sys.path`. + + If :c:member:`~PyConfig.module_search_paths_set` is equal to 0, the + function calculating the :ref:`Python Path Configuration ` + overrides the :c:member:`~PyConfig.module_search_paths` and sets + :c:member:`~PyConfig.module_search_paths_set` to ``1``. + + Default: empty list (``module_search_paths``) and ``0`` + (``module_search_paths_set``). + + Part of the :ref:`Python Path Configuration ` output. .. c:member:: int optimization_level Compilation optimization level: - * 0: Peephole optimizer (and ``__debug__`` is set to ``True``) - * 1: Remove assertions, set ``__debug__`` to ``False`` - * 2: Strip docstrings + * ``0``: Peephole optimizer, set ``__debug__`` to ``True``. + * ``1``: Level 0, remove assertions, set ``__debug__`` to ``False``. + * ``2``: Level 1, strip docstrings. + + Incremented by the :option:`-O` command line option. Set to the + :envvar:`PYTHONOPTIMIZE` environment variable value. + + Default: ``0``. + + .. c:member:: PyWideStringList orig_argv + + The list of the original command line arguments passed to the Python + executable: :data:`sys.orig_argv`. + + If :c:member:`~PyConfig.orig_argv` list is empty and + :c:member:`~PyConfig.argv` is not a list only containing an empty + string, :c:func:`PyConfig_Read` copies :c:member:`~PyConfig.argv` into + :c:member:`~PyConfig.orig_argv` before modifying + :c:member:`~PyConfig.argv` (if :c:member:`~PyConfig.parse_argv` is + non-zero). + + See also the :c:member:`~PyConfig.argv` member and the + :c:func:`Py_GetArgcArgv` function. + + Default: empty list. + + .. versionadded:: 3.10 .. c:member:: int parse_argv - If non-zero, parse :c:member:`~PyConfig.argv` the same way the regular - Python command line arguments, and strip Python arguments from - :c:member:`~PyConfig.argv`: see :ref:`Command Line Arguments - `. + Parse command line arguments? + + If equals to ``1``, parse :c:member:`~PyConfig.argv` the same way the regular + Python parses :ref:`command line arguments `, and strip + Python arguments from :c:member:`~PyConfig.argv`. + + The :c:func:`PyConfig_Read` function only parses + :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv` + is set to ``2`` after arguments are parsed. Since Python arguments are + strippped from :c:member:`PyConfig.argv`, parsing arguments twice would + parse the application options as Python options. + + Default: ``1`` in Python mode, ``0`` in isolated mode. + + .. versionchanged:: 3.10 + The :c:member:`PyConfig.argv` arguments are now only parsed if + :c:member:`PyConfig.parse_argv` equals to ``1``. .. c:member:: int parser_debug - If non-zero, turn on parser debugging output (for expert only, depending + Parser debug mode. If greater than 0, turn on parser debugging output (for expert only, depending on compilation options). + Incremented by the :option:`-d` command line option. Set to the + :envvar:`PYTHONDEBUG` environment variable value. + + Default: ``0``. + .. c:member:: int pathconfig_warnings - If equal to 0, suppress warnings when calculating the :ref:`Path - Configuration ` (Unix only, Windows does not log any - warning). Otherwise, warnings are written into ``stderr``. + On Unix, if non-zero, calculating the :ref:`Python Path Configuration + ` can log warnings into ``stderr``. If equals to 0, + suppress these warnings. + + It has no effect on Windows. + + Default: ``1`` in Python mode, ``0`` in isolated mode. + + Part of the :ref:`Python Path Configuration ` input. .. c:member:: wchar_t* prefix - :data:`sys.prefix`. + The site-specific directory prefix where the platform independent Python + files are installed: :data:`sys.prefix`. + + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` output. .. c:member:: wchar_t* program_name - Program name. Used to initialize :c:member:`~PyConfig.executable`, and in - early error messages. + Program name used to initialize :c:member:`~PyConfig.executable` and in + early error messages during Python initialization. + + * If :func:`Py_SetProgramName` has been called, use its argument. + * On macOS, use :envvar:`PYTHONEXECUTABLE` environment variable if set. + * If the ``WITH_NEXT_FRAMEWORK`` macro is defined, use + :envvar:`__PYVENV_LAUNCHER__` environment variable if set. + * Use ``argv[0]`` of :c:member:`~PyConfig.argv` if available and + non-empty. + * Otherwise, use ``L"python"`` on Windows, or ``L"python3"`` on other + platforms. + + Default: ``NULL``. + + Part of the :ref:`Python Path Configuration ` input. .. c:member:: wchar_t* pycache_prefix - :data:`sys.pycache_prefix`: ``.pyc`` cache prefix. + Directory where cached ``.pyc`` files are written: + :data:`sys.pycache_prefix`. + + Set by the :option:`-X pycache_prefix=PATH <-X>` command line option and + the :envvar:`PYTHONPYCACHEPREFIX` environment variable. If ``NULL``, :data:`sys.pycache_prefix` is set to ``None``. + Default: ``NULL``. + .. c:member:: int quiet - Quiet mode. For example, don't display the copyright and version messages - in interactive mode. + Quiet mode. If greater than 0, don't display the copyright and version at + Python startup in interactive mode. + + Incremented by the :option:`-q` command line option. + + Default: ``0``. .. c:member:: wchar_t* run_command - ``python3 -c COMMAND`` argument. Used by :c:func:`Py_RunMain`. + Value of the :option:`-c` command line option. + + Used by :c:func:`Py_RunMain`. + + Default: ``NULL``. .. c:member:: wchar_t* run_filename - ``python3 FILENAME`` argument. Used by :c:func:`Py_RunMain`. + Filename passed on the command line: trailing command line argument + without :option:`-c` or :option:`-m`. + + For example, it is set to ``script.py`` by the ``python3 script.py arg`` + command. + + Used by :c:func:`Py_RunMain`. + + Default: ``NULL``. .. c:member:: wchar_t* run_module - ``python3 -m MODULE`` argument. Used by :c:func:`Py_RunMain`. + Value of the :option:`-m` command line option. + + Used by :c:func:`Py_RunMain`. + + Default: ``NULL``. .. c:member:: int show_ref_count @@ -642,76 +1023,156 @@ PyConfig Set to 1 by :option:`-X showrefcount <-X>` command line option. - Need a debug build of Python (``Py_REF_DEBUG`` macro must be defined). + Need a :ref:`debug build of Python ` (the ``Py_REF_DEBUG`` + macro must be defined). + + Default: ``0``. .. c:member:: int site_import Import the :mod:`site` module at startup? + If equal to zero, disable the import of the module site and the + site-dependent manipulations of :data:`sys.path` that it entails. + + Also disable these manipulations if the :mod:`site` module is explicitly + imported later (call :func:`site.main` if you want them to be triggered). + + Set to ``0`` by the :option:`-S` command line option. + + :data:`sys.flags.no_site` is set to the inverted value of + :c:member:`~PyConfig.site_import`. + + Default: ``1``. + .. c:member:: int skip_source_first_line - Skip the first line of the source? + If non-zero, skip the first line of the :c:member:`PyConfig.run_filename` + source. + + It allows the usage of non-Unix forms of ``#!cmd``. This is intended for + a DOS specific hack only. + + Set to ``1`` by the :option:`-x` command line option. + + Default: ``0``. .. c:member:: wchar_t* stdio_encoding .. c:member:: wchar_t* stdio_errors Encoding and encoding errors of :data:`sys.stdin`, :data:`sys.stdout` and - :data:`sys.stderr`. + :data:`sys.stderr` (but :data:`sys.stderr` always uses + ``"backslashreplace"`` error handler). + + If :c:func:`Py_SetStandardStreamEncoding` has been called, use its + *error* and *errors* arguments if they are not ``NULL``. + + Use the :envvar:`PYTHONIOENCODING` environment variable if it is + non-empty. + + Default encoding: + + * ``"UTF-8"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero. + * Otherwise, use the :term:`locale encoding`. + + Default error handler: + + * On Windows: use ``"surrogateescape"``. + * ``"surrogateescape"`` if :c:member:`PyPreConfig.utf8_mode` is non-zero, + or if the LC_CTYPE locale is "C" or "POSIX". + * ``"strict"`` otherwise. .. c:member:: int tracemalloc + Enable tracemalloc? + If non-zero, call :func:`tracemalloc.start` at startup. + Set by :option:`-X tracemalloc=N <-X>` command line option and by the + :envvar:`PYTHONTRACEMALLOC` environment variable. + + Default: ``-1`` in Python mode, ``0`` in isolated mode. + .. c:member:: int use_environment - If greater than 0, use :ref:`environment variables `. + Use :ref:`environment variables `? + + If equals to zero, ignore the :ref:`environment variables + `. + + Default: ``1`` in Python config and ``0`` in isolated config. .. c:member:: int user_site_directory - If non-zero, add user site directory to :data:`sys.path`. + If non-zero, add the user site directory to :data:`sys.path`. + + Set to ``0`` by the :option:`-s` and :option:`-I` command line options. + + Set to ``0`` by the :envvar:`PYTHONNOUSERSITE` environment variable. + + Default: ``1`` in Python mode, ``0`` in isolated mode. .. c:member:: int verbose - If non-zero, enable verbose mode. + Verbose mode. If greater than 0, print a message each time a module is + imported, showing the place (filename or built-in module) from which + it is loaded. + + If greater or equal to 2, print a message for each file that is checked + for when searching for a module. Also provides information on module + cleanup at exit. + + Incremented by the :option:`-v` command line option. + + Set to the :envvar:`PYTHONVERBOSE` environment variable value. + + Default: ``0``. .. c:member:: PyWideStringList warnoptions - :data:`sys.warnoptions`: options of the :mod:`warnings` module to build - warnings filters: lowest to highest priority. + Options of the :mod:`warnings` module to build warnings filters, lowest + to highest priority: :data:`sys.warnoptions`. The :mod:`warnings` module adds :data:`sys.warnoptions` in the reverse order: the last :c:member:`PyConfig.warnoptions` item becomes the first item of :data:`warnings.filters` which is checked first (highest priority). - .. c:member:: int write_bytecode + The :option:`-W` command line options adds its value to + :c:member:`~PyConfig.warnoptions`, it can be used multiple times. - If non-zero, write ``.pyc`` files. + The :envvar:`PYTHONWARNINGS` environment variable can also be used to add + warning options. Multiple options can be specified, separated by commas + (``,``). - :data:`sys.dont_write_bytecode` is initialized to the inverted value of - :c:member:`~PyConfig.write_bytecode`. + Default: empty list. - .. c:member:: PyWideStringList xoptions + .. c:member:: int write_bytecode + + If equal to 0, Python won't try to write ``.pyc`` files on the import of + source modules. - :data:`sys._xoptions`. + Set to ``0`` by the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable. - .. c:member:: int _use_peg_parser + :data:`sys.dont_write_bytecode` is initialized to the inverted value of + :c:member:`~PyConfig.write_bytecode`. - Enable PEG parser? Default: 1. + Default: ``1``. - Set to 0 by :option:`-X oldparser <-X>` and :envvar:`PYTHONOLDPARSER`. + .. c:member:: PyWideStringList xoptions - See also :pep:`617`. + Values of the :option:`-X` command line options: :data:`sys._xoptions`. - .. deprecated-removed:: 3.9 3.10 + Default: empty list. -If ``parse_argv`` is non-zero, ``argv`` arguments are parsed the same -way the regular Python parses command line arguments, and Python -arguments are stripped from ``argv``: see :ref:`Command Line Arguments -`. +If :c:member:`~PyConfig.parse_argv` is non-zero, :c:member:`~PyConfig.argv` +arguments are parsed the same way the regular Python parses :ref:`command line +arguments `, and Python arguments are stripped from +:c:member:`~PyConfig.argv`. -The ``xoptions`` options are parsed to set other options: see :option:`-X` -option. +The :c:member:`~PyConfig.xoptions` options are parsed to set other options: see +the :option:`-X` command line option. .. versionchanged:: 3.9 @@ -719,7 +1180,7 @@ option. Initialization with PyConfig ----------------------------- +============================ Function to initialize Python: @@ -737,6 +1198,9 @@ initialized multiple times, :c:func:`PyImport_AppendInittab` or :c:func:`PyImport_ExtendInittab` must be called before each Python initialization. +The current configuration (``PyConfig`` type) is stored in +``PyInterpreterState.config``. + Example setting the program name:: void init_python(void) @@ -750,17 +1214,17 @@ Example setting the program name:: status = PyConfig_SetString(&config, &config.program_name, L"/path/to/my_program"); if (PyStatus_Exception(status)) { - goto fail; + goto exception; } status = Py_InitializeFromConfig(&config); if (PyStatus_Exception(status)) { - goto fail; + goto exception; } PyConfig_Clear(&config); return; - fail: + exception: PyConfig_Clear(&config); Py_ExitStatusException(status); } @@ -780,7 +1244,7 @@ configuration, and then override some parameters:: Implicitly preinitialize Python. */ status = PyConfig_SetBytesString(&config, &config.program_name, - program_name); + program_name); if (PyStatus_Exception(status)) { goto done; } @@ -816,20 +1280,20 @@ configuration, and then override some parameters:: .. _init-isolated-conf: Isolated Configuration ----------------------- +====================== :c:func:`PyPreConfig_InitIsolatedConfig` and :c:func:`PyConfig_InitIsolatedConfig` functions create a configuration to isolate Python from the system. For example, to embed Python into an application. -This configuration ignores global configuration variables, environment +This configuration ignores global configuration variables, environments variables, command line arguments (:c:member:`PyConfig.argv` is not parsed) and user site directory. The C standard streams (ex: ``stdout``) and the LC_CTYPE locale are left unchanged. Signal handlers are not installed. Configuration files are still used with this configuration. Set the -:ref:`Path Configuration ` ("output fields") to ignore these +:ref:`Python Path Configuration ` ("output fields") to ignore these configuration files and avoid the function computing the default path configuration. @@ -837,7 +1301,7 @@ configuration. .. _init-python-config: Python Configuration --------------------- +==================== :c:func:`PyPreConfig_InitPythonConfig` and :c:func:`PyConfig_InitPythonConfig` functions create a configuration to build a customized Python which behaves as @@ -846,50 +1310,16 @@ the regular Python. Environments variables and command line arguments are used to configure Python, whereas global configuration variables are ignored. -This function enables C locale coercion (:pep:`538`) and UTF-8 Mode +This function enables C locale coercion (:pep:`538`) +and :ref:`Python UTF-8 Mode ` (:pep:`540`) depending on the LC_CTYPE locale, :envvar:`PYTHONUTF8` and :envvar:`PYTHONCOERCECLOCALE` environment variables. -Example of customized Python always running in isolated mode:: - - int main(int argc, char **argv) - { - PyStatus status; - - PyConfig config; - PyConfig_InitPythonConfig(&config); - config.isolated = 1; - - /* Decode command line arguments. - Implicitly preinitialize Python (in isolated mode). */ - status = PyConfig_SetBytesArgv(&config, argc, argv); - if (PyStatus_Exception(status)) { - goto fail; - } - - status = Py_InitializeFromConfig(&config); - if (PyStatus_Exception(status)) { - goto fail; - } - PyConfig_Clear(&config); - - return Py_RunMain(); - - fail: - PyConfig_Clear(&config); - if (PyStatus_IsExit(status)) { - return status.exitcode; - } - /* Display the error message and exit the process with - non-zero exit code */ - Py_ExitStatusException(status); - } - .. _init-path-config: -Path Configuration ------------------- +Python Path Configuration +========================= :c:type:`PyConfig` contains multiple fields for the path configuration: @@ -969,7 +1399,7 @@ The ``__PYVENV_LAUNCHER__`` environment variable is used to set Py_RunMain() ------------- +============ .. c:function:: int Py_RunMain(void) @@ -989,18 +1419,20 @@ customized Python always running in isolated mode using Py_GetArgcArgv() ----------------- +================ .. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv) Get the original command line arguments, before Python modified them. + See also :c:member:`PyConfig.orig_argv` member. + Multi-Phase Initialization Private Provisional API --------------------------------------------------- +================================================== This section is a private provisional API introducing multi-phase -initialization, the core feature of :pep:`432`: +initialization, the core feature of the :pep:`432`: * "Core" initialization phase, "bare minimum Python": diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index ac1024cd..2d85d307 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -326,7 +326,7 @@ when it's no longer needed---or passing on this responsibility (usually to its caller). When a function passes ownership of a reference on to its caller, the caller is said to receive a *new* reference. When no ownership is transferred, the caller is said to *borrow* the reference. Nothing needs to be done for a -borrowed reference. +:term:`borrowed reference`. Conversely, when a calling function passes in a reference to an object, there are two possibilities: the function *steals* a reference to the object, or it @@ -502,13 +502,6 @@ data attributes of a new object type, and another is used to describe the value of a complex number. These will be discussed together with the functions that use them. -.. c:type:: Py_ssize_t - - A signed integral type such that ``sizeof(Py_ssize_t) == sizeof(size_t)``. - C99 doesn't define such a thing directly (size_t is an unsigned integral type). - See :pep:`353` for details. ``PY_SSIZE_T_MAX`` is the largest positive value - of type :c:type:`Py_ssize_t`. - .. _api-exceptions: @@ -749,43 +742,22 @@ allocator, or low-level profiling of the main interpreter loop. Only the most frequently-used builds will be described in the remainder of this section. Compiling the interpreter with the :c:macro:`Py_DEBUG` macro defined produces -what is generally meant by "a debug build" of Python. :c:macro:`Py_DEBUG` is -enabled in the Unix build by adding ``--with-pydebug`` to the -:file:`./configure` command. It is also implied by the presence of the +what is generally meant by :ref:`a debug build of Python `. +:c:macro:`Py_DEBUG` is enabled in the Unix build by adding +:option:`--with-pydebug` to the :file:`./configure` command. +It is also implied by the presence of the not-Python-specific :c:macro:`_DEBUG` macro. When :c:macro:`Py_DEBUG` is enabled in the Unix build, compiler optimization is disabled. -In addition to the reference count debugging described below, the following -extra checks are performed: - -* Extra checks are added to the object allocator. - -* Extra checks are added to the parser and compiler. - -* Downcasts from wide types to narrow types are checked for loss of information. - -* A number of assertions are added to the dictionary and set implementations. - In addition, the set object acquires a :meth:`test_c_api` method. - -* Sanity checks of the input arguments are added to frame creation. - -* The storage for ints is initialized with a known invalid pattern to catch - reference to uninitialized digits. - -* Low-level tracing and extra exception checking are added to the runtime - virtual machine. - -* Extra checks are added to the memory arena implementation. - -* Extra debugging is added to the thread module. - -There may be additional checks not mentioned here. +In addition to the reference count debugging described below, extra checks are +performed, see :ref:`Python Debug Build `. -Defining :c:macro:`Py_TRACE_REFS` enables reference tracing. When defined, a -circular doubly linked list of active objects is maintained by adding two extra +Defining :c:macro:`Py_TRACE_REFS` enables reference tracing +(see the :option:`configure --with-trace-refs option <--with-trace-refs>`). +When defined, a circular doubly linked list of active objects is maintained by adding two extra fields to every :c:type:`PyObject`. Total allocations are tracked as well. Upon exit, all existing references are printed. (In interactive mode this happens -after every statement run by the interpreter.) Implied by :c:macro:`Py_DEBUG`. +after every statement run by the interpreter.) Please refer to :file:`Misc/SpecialBuilds.txt` in the Python source distribution for more detailed information. diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst index 189f80b9..f7106f4e 100644 --- a/Doc/c-api/iter.rst +++ b/Doc/c-api/iter.rst @@ -9,9 +9,15 @@ There are two functions specifically for working with iterators. .. c:function:: int PyIter_Check(PyObject *o) - Return true if the object *o* supports the iterator protocol. This - function always succeeds. + Return non-zero if the object *o* supports the iterator protocol, and ``0`` + otherwise. This function always succeeds. +.. c:function:: int PyAIter_Check(PyObject *o) + + Returns non-zero if the object 'obj' provides :class:`AsyncIterator` + protocols, and ``0`` otherwise. This function always succeeds. + + .. versionadded:: 3.10 .. c:function:: PyObject* PyIter_Next(PyObject *o) @@ -45,3 +51,21 @@ something like this:: else { /* continue doing useful work */ } + + +.. c:type:: PySendResult + + The enum value used to represent different results of :c:func:`PyIter_Send`. + + .. versionadded:: 3.10 + + +.. c:function:: PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult) + + Sends the *arg* value into the iterator *iter*. Returns: + + - ``PYGEN_RETURN`` if iterator returns. Return value is returned via *presult*. + - ``PYGEN_NEXT`` if iterator yields. Yielded value is returned via *presult*. + - ``PYGEN_ERROR`` if iterator has raised and exception. *presult* is set to ``NULL``. + + .. versionadded:: 3.10 diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 95796e0f..42014902 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -41,7 +41,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. Return a new :c:type:`PyLongObject` object from *v*, or ``NULL`` on failure. The current implementation keeps an array of integer objects for all integers - between ``-5`` and ``256``. When you create an int in that range you actually + between ``-5`` and ``256``, when you create an int in that range you actually just get back a reference to the existing object. @@ -94,15 +94,6 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. are no digits, :exc:`ValueError` will be raised. -.. c:function:: PyObject* PyLong_FromUnicode(Py_UNICODE *u, Py_ssize_t length, int base) - - Convert a sequence of Unicode digits to a Python integer value. - - .. deprecated-removed:: 3.3 3.10 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyLong_FromUnicodeObject`. - - .. c:function:: PyObject* PyLong_FromUnicodeObject(PyObject *u, int base) Convert a sequence of Unicode digits in the string *u* to a Python integer @@ -125,9 +116,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. single: OverflowError (built-in exception) Return a C :c:type:`long` representation of *obj*. If *obj* is not an - instance of :c:type:`PyLongObject`, first call its :meth:`__index__` or - :meth:`__int__` method (if present) to convert it to a - :c:type:`PyLongObject`. + instance of :c:type:`PyLongObject`, first call its :meth:`__index__` method + (if present) to convert it to a :c:type:`PyLongObject`. Raise :exc:`OverflowError` if the value of *obj* is out of range for a :c:type:`long`. @@ -137,16 +127,15 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. - .. deprecated:: 3.8 - Using :meth:`__int__` is deprecated. + .. versionchanged:: 3.10 + This function will no longer use :meth:`__int__`. .. c:function:: long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow) Return a C :c:type:`long` representation of *obj*. If *obj* is not an - instance of :c:type:`PyLongObject`, first call its :meth:`__index__` or - :meth:`__int__` method (if present) to convert it to a - :c:type:`PyLongObject`. + instance of :c:type:`PyLongObject`, first call its :meth:`__index__` + method (if present) to convert it to a :c:type:`PyLongObject`. If the value of *obj* is greater than :const:`LONG_MAX` or less than :const:`LONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, and @@ -158,8 +147,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. - .. deprecated:: 3.8 - Using :meth:`__int__` is deprecated. + .. versionchanged:: 3.10 + This function will no longer use :meth:`__int__`. .. c:function:: long long PyLong_AsLongLong(PyObject *obj) @@ -168,9 +157,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. single: OverflowError (built-in exception) Return a C :c:type:`long long` representation of *obj*. If *obj* is not an - instance of :c:type:`PyLongObject`, first call its :meth:`__index__` or - :meth:`__int__` method (if present) to convert it to a - :c:type:`PyLongObject`. + instance of :c:type:`PyLongObject`, first call its :meth:`__index__` method + (if present) to convert it to a :c:type:`PyLongObject`. Raise :exc:`OverflowError` if the value of *obj* is out of range for a :c:type:`long long`. @@ -180,16 +168,15 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. - .. deprecated:: 3.8 - Using :meth:`__int__` is deprecated. + .. versionchanged:: 3.10 + This function will no longer use :meth:`__int__`. .. c:function:: long long PyLong_AsLongLongAndOverflow(PyObject *obj, int *overflow) Return a C :c:type:`long long` representation of *obj*. If *obj* is not an - instance of :c:type:`PyLongObject`, first call its :meth:`__index__` or - :meth:`__int__` method (if present) to convert it to a - :c:type:`PyLongObject`. + instance of :c:type:`PyLongObject`, first call its :meth:`__index__` method + (if present) to convert it to a :c:type:`PyLongObject`. If the value of *obj* is greater than :const:`LLONG_MAX` or less than :const:`LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, @@ -203,8 +190,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. - .. deprecated:: 3.8 - Using :meth:`__int__` is deprecated. + .. versionchanged:: 3.10 + This function will no longer use :meth:`__int__`. .. c:function:: Py_ssize_t PyLong_AsSsize_t(PyObject *pylong) @@ -274,10 +261,9 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. c:function:: unsigned long PyLong_AsUnsignedLongMask(PyObject *obj) - Return a C :c:type:`unsigned long` representation of *obj*. If *obj* - is not an instance of :c:type:`PyLongObject`, first call its - :meth:`__index__` or :meth:`__int__` method (if present) to convert - it to a :c:type:`PyLongObject`. + Return a C :c:type:`unsigned long` representation of *obj*. If *obj* is not + an instance of :c:type:`PyLongObject`, first call its :meth:`__index__` + method (if present) to convert it to a :c:type:`PyLongObject`. If the value of *obj* is out of range for an :c:type:`unsigned long`, return the reduction of that value modulo ``ULONG_MAX + 1``. @@ -288,16 +274,16 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. - .. deprecated:: 3.8 - Using :meth:`__int__` is deprecated. + .. versionchanged:: 3.10 + This function will no longer use :meth:`__int__`. .. c:function:: unsigned long long PyLong_AsUnsignedLongLongMask(PyObject *obj) Return a C :c:type:`unsigned long long` representation of *obj*. If *obj* is not an instance of :c:type:`PyLongObject`, first call its - :meth:`__index__` or :meth:`__int__` method (if present) to convert - it to a :c:type:`PyLongObject`. + :meth:`__index__` method (if present) to convert it to a + :c:type:`PyLongObject`. If the value of *obj* is out of range for an :c:type:`unsigned long long`, return the reduction of that value modulo ``ULLONG_MAX + 1``. @@ -308,8 +294,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. .. versionchanged:: 3.8 Use :meth:`__index__` if available. - .. deprecated:: 3.8 - Using :meth:`__int__` is deprecated. + .. versionchanged:: 3.10 + This function will no longer use :meth:`__int__`. .. c:function:: double PyLong_AsDouble(PyObject *pylong) diff --git a/Doc/c-api/mapping.rst b/Doc/c-api/mapping.rst index 3c9d282c..682160d1 100644 --- a/Doc/c-api/mapping.rst +++ b/Doc/c-api/mapping.rst @@ -11,10 +11,10 @@ See also :c:func:`PyObject_GetItem`, :c:func:`PyObject_SetItem` and .. c:function:: int PyMapping_Check(PyObject *o) - Return ``1`` if the object provides the mapping protocol or supports slicing, + Return ``1`` if the object provides mapping protocol or supports slicing, and ``0`` otherwise. Note that it returns ``1`` for Python classes with - a :meth:`__getitem__` method, since in general it is impossible to - determine what type of keys the class supports. This function always succeeds. + a :meth:`__getitem__` method since in general case it is impossible to + determine what type of keys it supports. This function always succeeds. .. c:function:: Py_ssize_t PyMapping_Size(PyObject *o) diff --git a/Doc/c-api/memory.rst b/Doc/c-api/memory.rst index 624bddcb..0746d9ac 100644 --- a/Doc/c-api/memory.rst +++ b/Doc/c-api/memory.rst @@ -92,6 +92,38 @@ for the I/O buffer escapes completely the Python memory manager. statistics of the :ref:`pymalloc memory allocator ` every time a new pymalloc object arena is created, and on shutdown. +Allocator Domains +================= + +All allocating functions belong to one of three different "domains" (see also +:c:type:`PyMemAllocatorDomain`). These domains represent different allocation +strategies and are optimized for different purposes. The specific details on +how every domain allocates memory or what internal functions each domain calls +is considered an implementation detail, but for debugging purposes a simplified +table can be found at :ref:`here `. There is no hard +requirement to use the memory returned by the allocation functions belonging to +a given domain for only the purposes hinted by that domain (although this is the +recommended practice). For example, one could use the memory returned by +:c:func:`PyMem_RawMalloc` for allocating Python objects or the memory returned +by :c:func:`PyObject_Malloc` for allocating memory for buffers. + +The three allocation domains are: + +* Raw domain: intended for allocating memory for general-purpose memory + buffers where the allocation *must* go to the system allocator or where the + allocator can operate without the :term:`GIL`. The memory is requested directly + to the system. + +* "Mem" domain: intended for allocating memory for Python buffers and + general-purpose memory buffers where the allocation must be performed with + the :term:`GIL` held. The memory is taken from the Python private heap. + +* Object domain: intended for allocating memory belonging to Python objects. The + memory is taken from the Python private heap. + +When freeing memory previously allocated by the allocating functions belonging to a +given domain,the matching specific deallocating functions must be used. For example, +:c:func:`PyMem_Free` must be used to free memory allocated using :c:func:`PyMem_Malloc`. Raw Memory Interface ==================== @@ -272,6 +304,12 @@ The following function sets, modeled after the ANSI C standard, but specifying behavior when requesting zero bytes, are available for allocating and releasing memory from the Python heap. +.. note:: + There is no guarantee that the memory returned by these allocators can be + successfully casted to a Python object when intercepting the allocating + functions in this domain by the methods described in + the :ref:`Customize Memory Allocators ` section. + The :ref:`default object allocator ` uses the :ref:`pymalloc memory allocator `. @@ -347,12 +385,15 @@ Debug build, without pymalloc ``"malloc_debug"`` ``malloc`` + debug ``mal Legend: -* Name: value for :envvar:`PYTHONMALLOC` environment variable +* Name: value for :envvar:`PYTHONMALLOC` environment variable. * ``malloc``: system allocators from the standard C library, C functions: - :c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` and :c:func:`free` -* ``pymalloc``: :ref:`pymalloc memory allocator ` -* "+ debug": with debug hooks installed by :c:func:`PyMem_SetupDebugHooks` + :c:func:`malloc`, :c:func:`calloc`, :c:func:`realloc` and :c:func:`free`. +* ``pymalloc``: :ref:`pymalloc memory allocator `. +* "+ debug": with :ref:`debug hooks on the Python memory allocators + `. +* "Debug build": :ref:`Python build in debug mode `. +.. _customize-memory-allocators: Customize Memory Allocators =========================== @@ -362,7 +403,7 @@ Customize Memory Allocators .. c:type:: PyMemAllocatorEx Structure used to describe a memory block allocator. The structure has - the following fields: + four fields: +----------------------------------------------------------+---------------------------------------+ | Field | Meaning | @@ -438,45 +479,113 @@ Customize Memory Allocators .. c:function:: void PyMem_SetupDebugHooks(void) - Setup hooks to detect bugs in the Python memory allocator functions. + Setup :ref:`debug hooks in the Python memory allocators ` + to detect memory errors. + + +.. _pymem-debug-hooks: + +Debug hooks on the Python memory allocators +=========================================== + +When :ref:`Python is built in debug mode `, the +:c:func:`PyMem_SetupDebugHooks` function is called at the :ref:`Python +preinitialization ` to setup debug hooks on Python memory allocators +to detect memory errors. + +The :envvar:`PYTHONMALLOC` environment variable can be used to install debug +hooks on a Python compiled in release mode (ex: ``PYTHONMALLOC=debug``). + +The :c:func:`PyMem_SetupDebugHooks` function can be used to set debug hooks +after calling :c:func:`PyMem_SetAllocator`. + +These debug hooks fill dynamically allocated memory blocks with special, +recognizable bit patterns. Newly allocated memory is filled with the byte +``0xCD`` (``PYMEM_CLEANBYTE``), freed memory is filled with the byte ``0xDD`` +(``PYMEM_DEADBYTE``). Memory blocks are surrounded by "forbidden bytes" +filled with the byte ``0xFD`` (``PYMEM_FORBIDDENBYTE``). Strings of these bytes +are unlikely to be valid addresses, floats, or ASCII strings. + +Runtime checks: + +- Detect API violations. For example, detect if :c:func:`PyObject_Free` is + called on a memory block allocated by :c:func:`PyMem_Malloc`. +- Detect write before the start of the buffer (buffer underflow). +- Detect write after the end of the buffer (buffer overflow). +- Check that the :term:`GIL ` is held when + allocator functions of :c:data:`PYMEM_DOMAIN_OBJ` (ex: + :c:func:`PyObject_Malloc`) and :c:data:`PYMEM_DOMAIN_MEM` (ex: + :c:func:`PyMem_Malloc`) domains are called. + +On error, the debug hooks use the :mod:`tracemalloc` module to get the +traceback where a memory block was allocated. The traceback is only displayed +if :mod:`tracemalloc` is tracing Python memory allocations and the memory block +was traced. + +Let *S* = ``sizeof(size_t)``. ``2*S`` bytes are added at each end of each block +of *N* bytes requested. The memory layout is like so, where p represents the +address returned by a malloc-like or realloc-like function (``p[i:j]`` means +the slice of bytes from ``*(p+i)`` inclusive up to ``*(p+j)`` exclusive; note +that the treatment of negative indices differs from a Python slice): + +``p[-2*S:-S]`` + Number of bytes originally asked for. This is a size_t, big-endian (easier + to read in a memory dump). +``p[-S]`` + API identifier (ASCII character): + + * ``'r'`` for :c:data:`PYMEM_DOMAIN_RAW`. + * ``'m'`` for :c:data:`PYMEM_DOMAIN_MEM`. + * ``'o'`` for :c:data:`PYMEM_DOMAIN_OBJ`. + +``p[-S+1:0]`` + Copies of PYMEM_FORBIDDENBYTE. Used to catch under- writes and reads. + +``p[0:N]`` + The requested memory, filled with copies of PYMEM_CLEANBYTE, used to catch + reference to uninitialized memory. When a realloc-like function is called + requesting a larger memory block, the new excess bytes are also filled with + PYMEM_CLEANBYTE. When a free-like function is called, these are + overwritten with PYMEM_DEADBYTE, to catch reference to freed memory. When + a realloc- like function is called requesting a smaller memory block, the + excess old bytes are also filled with PYMEM_DEADBYTE. + +``p[N:N+S]`` + Copies of PYMEM_FORBIDDENBYTE. Used to catch over- writes and reads. + +``p[N+S:N+2*S]`` + Only used if the ``PYMEM_DEBUG_SERIALNO`` macro is defined (not defined by + default). + + A serial number, incremented by 1 on each call to a malloc-like or + realloc-like function. Big-endian ``size_t``. If "bad memory" is detected + later, the serial number gives an excellent way to set a breakpoint on the + next run, to capture the instant at which this block was passed out. The + static function bumpserialno() in obmalloc.c is the only place the serial + number is incremented, and exists so you can set such a breakpoint easily. + +A realloc-like or free-like function first checks that the PYMEM_FORBIDDENBYTE +bytes at each end are intact. If they've been altered, diagnostic output is +written to stderr, and the program is aborted via Py_FatalError(). The other +main failure mode is provoking a memory error when a program reads up one of +the special bit patterns and tries to use it as an address. If you get in a +debugger then and look at the object, you're likely to see that it's entirely +filled with PYMEM_DEADBYTE (meaning freed memory is getting used) or +PYMEM_CLEANBYTE (meaning uninitialized memory is getting used). - Newly allocated memory is filled with the byte ``0xCD`` (``CLEANBYTE``), - freed memory is filled with the byte ``0xDD`` (``DEADBYTE``). Memory blocks - are surrounded by "forbidden bytes" (``FORBIDDENBYTE``: byte ``0xFD``). - - Runtime checks: - - - Detect API violations, ex: :c:func:`PyObject_Free` called on a buffer - allocated by :c:func:`PyMem_Malloc` - - Detect write before the start of the buffer (buffer underflow) - - Detect write after the end of the buffer (buffer overflow) - - Check that the :term:`GIL ` is held when - allocator functions of :c:data:`PYMEM_DOMAIN_OBJ` (ex: - :c:func:`PyObject_Malloc`) and :c:data:`PYMEM_DOMAIN_MEM` (ex: - :c:func:`PyMem_Malloc`) domains are called - - On error, the debug hooks use the :mod:`tracemalloc` module to get the - traceback where a memory block was allocated. The traceback is only - displayed if :mod:`tracemalloc` is tracing Python memory allocations and the - memory block was traced. - - These hooks are :ref:`installed by default ` if - Python is compiled in debug - mode. The :envvar:`PYTHONMALLOC` environment variable can be used to install - debug hooks on a Python compiled in release mode. - - .. versionchanged:: 3.6 - This function now also works on Python compiled in release mode. - On error, the debug hooks now use :mod:`tracemalloc` to get the traceback - where a memory block was allocated. The debug hooks now also check - if the GIL is held when functions of :c:data:`PYMEM_DOMAIN_OBJ` and - :c:data:`PYMEM_DOMAIN_MEM` domains are called. +.. versionchanged:: 3.6 + The :c:func:`PyMem_SetupDebugHooks` function now also works on Python + compiled in release mode. On error, the debug hooks now use + :mod:`tracemalloc` to get the traceback where a memory block was allocated. + The debug hooks now also check if the GIL is held when functions of + :c:data:`PYMEM_DOMAIN_OBJ` and :c:data:`PYMEM_DOMAIN_MEM` domains are + called. - .. versionchanged:: 3.8 - Byte patterns ``0xCB`` (``CLEANBYTE``), ``0xDB`` (``DEADBYTE``) and - ``0xFB`` (``FORBIDDENBYTE``) have been replaced with ``0xCD``, ``0xDD`` - and ``0xFD`` to use the same values than Windows CRT debug ``malloc()`` - and ``free()``. +.. versionchanged:: 3.8 + Byte patterns ``0xCB`` (``PYMEM_CLEANBYTE``), ``0xDB`` (``PYMEM_DEADBYTE``) + and ``0xFB`` (``PYMEM_FORBIDDENBYTE``) have been replaced with ``0xCD``, + ``0xDD`` and ``0xFD`` to use the same values than Windows CRT debug + ``malloc()`` and ``free()``. .. _pymalloc: @@ -499,6 +608,10 @@ The arena allocator uses the following functions: * :c:func:`mmap` and :c:func:`munmap` if available, * :c:func:`malloc` and :c:func:`free` otherwise. +This allocator is disabled if Python is configured with the +:option:`--without-pymalloc` option. It can also be disabled at runtime using +the :envvar:`PYTHONMALLOC` environment variable (ex: ``PYTHONMALLOC=malloc``). + Customize pymalloc Arena Allocator ---------------------------------- @@ -601,4 +714,3 @@ heap, objects in Python are allocated and released with :c:func:`PyObject_New`, These will be explained in the next chapter on defining and implementing new object types in C. - diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst index 6e7e1e21..23852251 100644 --- a/Doc/c-api/method.rst +++ b/Doc/c-api/method.rst @@ -27,7 +27,7 @@ to bind a :c:data:`PyCFunction` to a class object. It replaces the former call .. c:function:: PyObject* PyInstanceMethod_New(PyObject *func) - Return a new instance method object, with *func* being any callable object. + Return a new instance method object, with *func* being any callable object *func* is the function that will be called when the instance method is called. diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst index f0569ed4..94c8d9f9 100644 --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -271,7 +271,7 @@ of the following two module creation functions: instead; only use this if you are sure you need it. Before it is returned from in the initialization function, the resulting module -object is typically populated using functions like :c:func:`PyModule_AddObject`. +object is typically populated using functions like :c:func:`PyModule_AddObjectRef`. .. _multi-phase-initialization: @@ -444,26 +444,102 @@ a function called from a module execution slot (if using multi-phase initialization), can use the following functions to help initialize the module state: +.. c:function:: int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value) + + Add an object to *module* as *name*. This is a convenience function which + can be used from the module's initialization function. + + On success, return ``0``. On error, raise an exception and return ``-1``. + + Return ``NULL`` if *value* is ``NULL``. It must be called with an exception + raised in this case. + + Example usage:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (obj == NULL) { + return -1; + } + int res = PyModule_AddObjectRef(module, "spam", obj); + Py_DECREF(obj); + return res; + } + + The example can also be written without checking explicitly if *obj* is + ``NULL``:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + int res = PyModule_AddObjectRef(module, "spam", obj); + Py_XDECREF(obj); + return res; + } + + Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in + this case, since *obj* can be ``NULL``. + + .. versionadded:: 3.10 + + .. c:function:: int PyModule_AddObject(PyObject *module, const char *name, PyObject *value) - Add an object to *module* as *name*. This is a convenience function which can - be used from the module's initialization function. This steals a reference to - *value* on success. Return ``-1`` on error, ``0`` on success. + Similar to :c:func:`PyModule_AddObjectRef`, but steals a reference to + *value* on success (if it returns ``0``). + + The new :c:func:`PyModule_AddObjectRef` function is recommended, since it is + easy to introduce reference leaks by misusing the + :c:func:`PyModule_AddObject` function. .. note:: - Unlike other functions that steal references, ``PyModule_AddObject()`` only - decrements the reference count of *value* **on success**. + Unlike other functions that steal references, ``PyModule_AddObject()`` + only decrements the reference count of *value* **on success**. This means that its return value must be checked, and calling code must - :c:func:`Py_DECREF` *value* manually on error. Example usage:: - - Py_INCREF(spam); - if (PyModule_AddObject(module, "spam", spam) < 0) { - Py_DECREF(module); - Py_DECREF(spam); - return NULL; - } + :c:func:`Py_DECREF` *value* manually on error. + + Example usage:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (obj == NULL) { + return -1; + } + if (PyModule_AddObject(module, "spam", obj) < 0) { + Py_DECREF(obj); + return -1; + } + // PyModule_AddObject() stole a reference to obj: + // Py_DECREF(obj) is not needed here + return 0; + } + + The example can also be written without checking explicitly if *obj* is + ``NULL``:: + + static int + add_spam(PyObject *module, int value) + { + PyObject *obj = PyLong_FromLong(value); + if (PyModule_AddObject(module, "spam", obj) < 0) { + Py_XDECREF(obj); + return -1; + } + // PyModule_AddObject() stole a reference to obj: + // Py_DECREF(obj) is not needed here + return 0; + } + + Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in + this case, since *obj* can be ``NULL``. + .. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value) diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 47033a38..37979bb5 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -44,7 +44,7 @@ Number Protocol .. c:function:: PyObject* PyNumber_FloorDivide(PyObject *o1, PyObject *o2) Return the floor of *o1* divided by *o2*, or ``NULL`` on failure. This is - the equivalent of the Python expression ``o1 // o2``. + equivalent to the "classic" division of integers. .. c:function:: PyObject* PyNumber_TrueDivide(PyObject *o1, PyObject *o2) @@ -53,7 +53,7 @@ Number Protocol *o2*, or ``NULL`` on failure. The return value is "approximate" because binary floating point numbers are approximate; it is not possible to represent all real numbers in base two. This function can return a floating point value when - passed two integers. This is the equivalent of the Python expression ``o1 / o2``. + passed two integers. .. c:function:: PyObject* PyNumber_Remainder(PyObject *o1, PyObject *o2) @@ -180,7 +180,6 @@ Number Protocol floating point numbers are approximate; it is not possible to represent all real numbers in base two. This function can return a floating point value when passed two integers. The operation is done *in-place* when *o1* supports it. - This is the equivalent of the Python statement ``o1 /= o2``. .. c:function:: PyObject* PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2) @@ -257,6 +256,10 @@ Number Protocol Returns the *o* converted to a Python int on success or ``NULL`` with a :exc:`TypeError` exception raised on failure. + .. versionchanged:: 3.10 + The result always has exact type :class:`int`. Previously, the result + could have been an instance of a subclass of ``int``. + .. c:function:: PyObject* PyNumber_ToBase(PyObject *n, int base) @@ -269,11 +272,11 @@ Number Protocol .. c:function:: Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc) - Returns *o* converted to a :c:type:`Py_ssize_t` value if *o* can be interpreted as an + Returns *o* converted to a Py_ssize_t value if *o* can be interpreted as an integer. If the call fails, an exception is raised and ``-1`` is returned. If *o* can be converted to a Python int but the attempt to - convert to a :c:type:`Py_ssize_t` value would raise an :exc:`OverflowError`, then the + convert to a Py_ssize_t value would raise an :exc:`OverflowError`, then the *exc* argument is the type of exception that will be raised (usually :exc:`IndexError` or :exc:`OverflowError`). If *exc* is ``NULL``, then the exception is cleared and the value is clipped to ``PY_SSIZE_T_MIN`` for a negative @@ -282,6 +285,6 @@ Number Protocol .. c:function:: int PyIndex_Check(PyObject *o) - Returns ``1`` if *o* is an index integer (has the ``nb_index`` slot of the - ``tp_as_number`` structure filled in), and ``0`` otherwise. + Returns ``1`` if *o* is an index integer (has the nb_index slot of the + tp_as_number structure filled in), and ``0`` otherwise. This function always succeeds. diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst index 3e4f61ac..17e37077 100644 --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -81,9 +81,8 @@ Object Protocol return ``0`` on success. This is the equivalent of the Python statement ``o.attr_name = v``. - If *v* is ``NULL``, the attribute is deleted. This behaviour is deprecated - in favour of using :c:func:`PyObject_DelAttr`, but there are currently no - plans to remove it. + If *v* is ``NULL``, the attribute is deleted, however this feature is + deprecated in favour of using :c:func:`PyObject_DelAttr`. .. c:function:: int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v) @@ -93,7 +92,7 @@ Object Protocol return ``0`` on success. This is the equivalent of the Python statement ``o.attr_name = v``. - If *v* is ``NULL``, the attribute is deleted, but this feature is + If *v* is ``NULL``, the attribute is deleted, however this feature is deprecated in favour of using :c:func:`PyObject_DelAttrString`. @@ -258,7 +257,7 @@ Object Protocol .. versionchanged:: 3.2 The return type is now Py_hash_t. This is a signed integer the same size - as :c:type:`Py_ssize_t`. + as Py_ssize_t. .. c:function:: Py_hash_t PyObject_HashNotImplemented(PyObject *o) @@ -291,15 +290,15 @@ Object Protocol of object *o*. On failure, raises :exc:`SystemError` and returns ``NULL``. This is equivalent to the Python expression ``type(o)``. This function increments the reference count of the return value. There's really no reason to use this - function instead of the :c:func:`Py_TYPE()` function, which returns a + function instead of the common expression ``o->ob_type``, which returns a pointer of type :c:type:`PyTypeObject*`, except when the incremented reference count is needed. .. c:function:: int PyObject_TypeCheck(PyObject *o, PyTypeObject *type) - Return true if the object *o* is of type *type* or a subtype of *type*. Both - parameters must be non-``NULL``. + Return non-zero if the object *o* is of type *type* or a subtype of *type*, and + ``0`` otherwise. Both parameters must be non-``NULL``. .. c:function:: Py_ssize_t PyObject_Size(PyObject *o) @@ -357,3 +356,14 @@ Object Protocol iterator for the object argument, or the object itself if the object is already an iterator. Raises :exc:`TypeError` and returns ``NULL`` if the object cannot be iterated. + + +.. c:function:: PyObject* PyObject_GetAIter(PyObject *o) + + This is the equivalent to the Python expression ``aiter(o)``. Takes an + :class:`AsyncIterable` object and returns an :class:`AsyncIterator` for it. + This is typically a new iterator but if the argument is an + :class:`AsyncIterator`, this returns itself. Raises :exc:`TypeError` and + returns ``NULL`` if the object cannot be iterated. + + .. versionadded:: 3.10 diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst index 0df12c67..391907c8 100644 --- a/Doc/c-api/refcounting.rst +++ b/Doc/c-api/refcounting.rst @@ -13,8 +13,14 @@ objects. .. c:function:: void Py_INCREF(PyObject *o) - Increment the reference count for object *o*. The object must not be ``NULL``; if - you aren't sure that it isn't ``NULL``, use :c:func:`Py_XINCREF`. + Increment the reference count for object *o*. + + This function is usually used to convert a :term:`borrowed reference` to a + :term:`strong reference` in-place. The :c:func:`Py_NewRef` function can be + used to create a new :term:`strong reference`. + + The object must not be ``NULL``; if you aren't sure that it isn't + ``NULL``, use :c:func:`Py_XINCREF`. .. c:function:: void Py_XINCREF(PyObject *o) @@ -22,13 +28,55 @@ objects. Increment the reference count for object *o*. The object may be ``NULL``, in which case the macro has no effect. + See also :c:func:`Py_XNewRef`. + + +.. c:function:: PyObject* Py_NewRef(PyObject *o) + + Create a new :term:`strong reference` to an object: increment the reference + count of the object *o* and return the object *o*. + + When the :term:`strong reference` is no longer needed, :c:func:`Py_DECREF` + should be called on it to decrement the object reference count. + + The object *o* must not be ``NULL``; use :c:func:`Py_XNewRef` if *o* can be + ``NULL``. + + For example:: + + Py_INCREF(obj); + self->attr = obj; + + can be written as:: + + self->attr = Py_NewRef(obj); + + See also :c:func:`Py_INCREF`. + + .. versionadded:: 3.10 + + +.. c:function:: PyObject* Py_XNewRef(PyObject *o) + + Similar to :c:func:`Py_NewRef`, but the object *o* can be NULL. + + If the object *o* is ``NULL``, the function just returns ``NULL``. + + .. versionadded:: 3.10 + .. c:function:: void Py_DECREF(PyObject *o) - Decrement the reference count for object *o*. The object must not be ``NULL``; if - you aren't sure that it isn't ``NULL``, use :c:func:`Py_XDECREF`. If the reference - count reaches zero, the object's type's deallocation function (which must not be - ``NULL``) is invoked. + Decrement the reference count for object *o*. + + If the reference count reaches zero, the object's type's deallocation + function (which must not be ``NULL``) is invoked. + + This function is usually used to delete a :term:`strong reference` before + exiting its scope. + + The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``, + use :c:func:`Py_XDECREF`. .. warning:: diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst index 44ee009f..64ce4d1d 100644 --- a/Doc/c-api/reflection.rst +++ b/Doc/c-api/reflection.rst @@ -31,22 +31,22 @@ Reflection See also :c:func:`PyThreadState_GetFrame`. -.. c:function:: PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) +.. c:function:: int PyFrame_GetBack(PyFrameObject *frame) Get the *frame* next outer frame. - Return a strong reference, or ``NULL`` if *frame* has no outer frame. + Return a :term:`strong reference`, or ``NULL`` if *frame* has no outer frame. *frame* must not be ``NULL``. .. versionadded:: 3.9 -.. c:function:: PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) +.. c:function:: int PyFrame_GetCode(PyFrameObject *frame) Get the *frame* code. - Return a strong reference. + Return a :term:`strong reference`. *frame* must not be ``NULL``. The result (frame code) cannot be ``NULL``. diff --git a/Doc/c-api/sequence.rst b/Doc/c-api/sequence.rst index c78d273f..65818859 100644 --- a/Doc/c-api/sequence.rst +++ b/Doc/c-api/sequence.rst @@ -8,10 +8,10 @@ Sequence Protocol .. c:function:: int PySequence_Check(PyObject *o) - Return ``1`` if the object provides the sequence protocol, and ``0`` otherwise. + Return ``1`` if the object provides sequence protocol, and ``0`` otherwise. Note that it returns ``1`` for Python classes with a :meth:`__getitem__` - method, unless they are :class:`dict` subclasses, since in general it - is impossible to determine what type of keys the class supports. This + method unless they are :class:`dict` subclasses since in general case it + is impossible to determine what the type of keys it supports. This function always succeeds. @@ -69,7 +69,7 @@ Sequence Protocol is the equivalent of the Python statement ``o[i] = v``. This function *does not* steal a reference to *v*. - If *v* is ``NULL``, the element is deleted, but this feature is + If *v* is ``NULL``, the element is deleted, however this feature is deprecated in favour of using :c:func:`PySequence_DelItem`. @@ -147,7 +147,7 @@ Sequence Protocol Returns the length of *o*, assuming that *o* was returned by :c:func:`PySequence_Fast` and that *o* is not ``NULL``. The size can also be - retrieved by calling :c:func:`PySequence_Size` on *o*, but + gotten by calling :c:func:`PySequence_Size` on *o*, but :c:func:`PySequence_Fast_GET_SIZE` is faster because it can assume *o* is a list or tuple. diff --git a/Doc/c-api/set.rst b/Doc/c-api/set.rst index 9e3045e7..eca19c4d 100644 --- a/Doc/c-api/set.rst +++ b/Doc/c-api/set.rst @@ -13,7 +13,7 @@ Set Objects object: frozenset This section details the public API for :class:`set` and :class:`frozenset` -objects. Any functionality not listed below is best accessed using either +objects. Any functionality not listed below is best accessed using the either the abstract object protocol (including :c:func:`PyObject_CallMethod`, :c:func:`PyObject_RichCompareBool`, :c:func:`PyObject_Hash`, :c:func:`PyObject_Repr`, :c:func:`PyObject_IsTrue`, :c:func:`PyObject_Print`, and @@ -31,7 +31,7 @@ the abstract object protocol (including :c:func:`PyObject_CallMethod`, in that it is a fixed size for small sets (much like tuple storage) and will point to a separate, variable sized block of memory for medium and large sized sets (much like list storage). None of the fields of this structure should be - considered public and all are subject to change. All access should be done through + considered public and are subject to change. All access should be done through the documented API rather than by manipulating the values in the structure. @@ -65,6 +65,12 @@ the constructor functions work with any iterable Python object. Return true if *p* is a :class:`set` object, a :class:`frozenset` object, or an instance of a subtype. This function always succeeds. +.. c:function:: int PySet_CheckExact(PyObject *p) + + Return true if *p* is a :class:`set` object but not an instance of a + subtype. This function always succeeds. + + .. versionadded:: 3.10 .. c:function:: int PyAnySet_CheckExact(PyObject *p) @@ -125,7 +131,7 @@ or :class:`frozenset` or instances of their subtypes. .. c:function:: int PySet_Add(PyObject *set, PyObject *key) Add *key* to a :class:`set` instance. Also works with :class:`frozenset` - instances (like :c:func:`PyTuple_SetItem` it can be used to fill in the values + instances (like :c:func:`PyTuple_SetItem` it can be used to fill-in the values of brand new frozensets before they are exposed to other code). Return ``0`` on success or ``-1`` on failure. Raise a :exc:`TypeError` if the *key* is unhashable. Raise a :exc:`MemoryError` if there is no room to grow. Raise a diff --git a/Doc/c-api/stable.rst b/Doc/c-api/stable.rst index 9c05cb3c..4ae20e93 100644 --- a/Doc/c-api/stable.rst +++ b/Doc/c-api/stable.rst @@ -2,37 +2,157 @@ .. _stable: -*********************************** +*************** +C API Stability +*************** + +Python's C API is covered by the Backwards Compatibility Policy, :pep:`387`. +While the C API will change with every minor release (e.g. from 3.9 to 3.10), +most changes will be source-compatible, typically by only adding new API. +Changing existing API or removing API is only done after a deprecation period +or to fix serious issues. + +CPython's Application Binary Interface (ABI) is forward- and +backwards-compatible across a minor release (if these are compiled the same +way; see :ref:`stable-abi-platform` below). +So, code compiled for Python 3.10.0 will work on 3.10.8 and vice versa, +but will need to be compiled separately for 3.9.x and 3.10.x. + +Names prefixed by an underscore, such as ``_Py_InternalState``, +are private API that can change without notice even in patch releases. + + Stable Application Binary Interface -*********************************** - -Traditionally, the C API of Python will change with every release. Most changes -will be source-compatible, typically by only adding API, rather than changing -existing API or removing API (although some interfaces do get removed after -being deprecated first). - -Unfortunately, the API compatibility does not extend to binary compatibility -(the ABI). The reason is primarily the evolution of struct definitions, where -addition of a new field, or changing the type of a field, might not break the -API, but can break the ABI. As a consequence, extension modules need to be -recompiled for every Python release (although an exception is possible on Unix -when none of the affected interfaces are used). In addition, on Windows, -extension modules link with a specific pythonXY.dll and need to be recompiled to -link with a newer one. - -Since Python 3.2, a subset of the API has been declared to guarantee a stable -ABI. Extension modules wishing to use this API (called "limited API") need to -define ``Py_LIMITED_API``. A number of interpreter details then become hidden -from the extension module; in return, a module is built that works on any 3.x -version (x>=2) without recompilation. - -In some cases, the stable ABI needs to be extended with new functions. -Extension modules wishing to use these new APIs need to set ``Py_LIMITED_API`` -to the ``PY_VERSION_HEX`` value (see :ref:`apiabiversion`) of the minimum Python -version they want to support (e.g. ``0x03030000`` for Python 3.3). Such modules -will work on all subsequent Python releases, but fail to load (because of -missing symbols) on the older releases. - -As of Python 3.2, the set of functions available to the limited API is -documented in :pep:`384`. In the C API documentation, API elements that are not -part of the limited API are marked as "Not part of the limited API." +=================================== + +Python 3.2 introduced the *Limited API*, a subset of Python's C API. +Extensions that only use the Limited API can be +compiled once and work with multiple versions of Python. +Contents of the Limited API are :ref:`listed below `. + +To enable this, Python provides a *Stable ABI*: a set of symbols that will +remain compatible across Python 3.x versions. The Stable ABI contains symbols +exposed in the Limited API, but also other ones – for example, functions +necessary to support older versions of the Limited API. + +(For simplicity, this document talks about *extensions*, but the Limited API +and Stable ABI work the same way for all uses of the API – for example, +embedding Python.) + +.. c:macro:: Py_LIMITED_API + + Define this macro before including ``Python.h`` to opt in to only use + the Limited API, and to select the Limited API version. + + Define ``Py_LIMITED_API`` to the value of :c:data:`PY_VERSION_HEX` + corresponding to the lowest Python version your extension supports. + The extension will work without recompilation with all Python 3 releases + from the specified one onward, and can use Limited API introduced up to that + version. + + Rather than using the ``PY_VERSION_HEX`` macro directly, hardcode a minimum + minor version (e.g. ``0x030A0000`` for Python 3.10) for stability when + compiling with future Python versions. + + You can also define ``Py_LIMITED_API`` to ``3``. This works the same as + ``0x03020000`` (Python 3.2, the version that introduced Limited API). + +On Windows, extensions that use the Stable ABI should be linked against +``python3.dll`` rather than a version-specific library such as +``python39.dll``. + +On some platforms, Python will look for and load shared library files named +with the ``abi3`` tag (e.g. ``mymodule.abi3.so``). +It does not check if such extensions conform to a Stable ABI. +The user (or their packaging tools) need to ensure that, for example, +extensions built with the 3.10+ Limited API are not installed for lower +versions of Python. + +All functions in the Stable ABI are present as functions in Python's shared +library, not solely as macros. This makes them usable from languages that don't +use the C preprocessor. + + +Limited API Scope and Performance +--------------------------------- + +The goal for the Limited API is to allow everything that is possible with the +full C API, but possibly with a performance penalty. + +For example, while :c:func:`PyList_GetItem` is available, its “unsafe” macro +variant :c:func:`PyList_GET_ITEM` is not. +The macro can be faster because it can rely on version-specific implementation +details of the list object. + +Without ``Py_LIMITED_API`` defined, some C API functions are inlined or +replaced by macros. +Defining ``Py_LIMITED_API`` disables this inlining, allowing stability as +Python's data structures are improved, but possibly reducing performance. + +By leaving out the ``Py_LIMITED_API`` definition, it is possible to compile +a Limited API extension with a version-specific ABI. This can improve +performance for that Python version, but will limit compatibility. +Compiling with ``Py_LIMITED_API`` will then yield an extension that can be +distributed where a version-specific one is not available – for example, +for prereleases of an upcoming Python version. + + +Limited API Caveats +------------------- + +Note that compiling with ``Py_LIMITED_API`` is *not* a complete guarantee that +code conforms to the Limited API or the Stable ABI. ``Py_LIMITED_API`` only +covers definitions, but an API also includes other issues, such as expected +semantics. + +One issue that ``Py_LIMITED_API`` does not guard against is calling a function +with arguments that are invalid in a lower Python version. +For example, consider a function that starts accepting ``NULL`` for an +argument. In Python 3.9, ``NULL`` now selects a default behavior, but in +Python 3.8, the argument will be used directly, causing a ``NULL`` dereference +and crash. A similar argument works for fields of structs. + +Another issue is that some struct fields are currently not hidden when +``Py_LIMITED_API`` is defined, even though they're part of the Limited API. + +For these reasons, we recommend testing an extension with *all* minor Python +versions it supports, and preferably to build with the *lowest* such version. + +We also recommend reviewing documentation of all used API to check +if it is explicitly part of the Limited API. Even with ``Py_LIMITED_API`` +defined, a few private declarations are exposed for technical reasons (or +even unintentionally, as bugs). + +Also note that the Limited API is not necessarily stable: compiling with +``Py_LIMITED_API`` with Python 3.8 means that the extension will +run with Python 3.12, but it will not necessarily *compile* with Python 3.12. +In particular, parts of the Limited API may be deprecated and removed, +provided that the Stable ABI stays stable. + + +.. _stable-abi-platform: + +Platform Considerations +======================= + +ABI stability depends not only on Python, but also on the compiler used, +lower-level libraries and compiler options. For the purposes of the Stable ABI, +these details define a “platform”. They usually depend on the OS +type and processor architecture + +It is the responsibility of each particular distributor of Python +to ensure that all Python versions on a particular platform are built +in a way that does not break the Stable ABI. +This is the case with Windows and macOS releases from ``python.org`` and many +third-party distributors. + + +.. _stable-abi-list: + +Contents of Limited API +======================= + + +Currently, the Limited API includes the following items: + +.. limited-api-list:: diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst index 1599b88e..05c54ccc 100644 --- a/Doc/c-api/structures.rst +++ b/Doc/c-api/structures.rst @@ -62,12 +62,44 @@ the definition of all other Python objects. See documentation of :c:type:`PyVarObject` above. -.. c:macro:: Py_TYPE(o) +.. c:function:: int Py_Is(const PyObject *x, const PyObject *y) - This macro is used to access the :attr:`ob_type` member of a Python object. - It expands to:: + Test if the *x* object is the *y* object, the same as ``x is y`` in Python. - (((PyObject*)(o))->ob_type) + .. versionadded:: 3.10 + + +.. c:function:: int Py_IsNone(const PyObject *x) + + Test if an object is the ``None`` singleton, + the same as ``x is None`` in Python. + + .. versionadded:: 3.10 + + +.. c:function:: int Py_IsTrue(const PyObject *x) + + Test if an object is the ``True`` singleton, + the same as ``x is True`` in Python. + + .. versionadded:: 3.10 + + +.. c:function:: int Py_IsFalse(const PyObject *x) + + Test if an object is the ``False`` singleton, + the same as ``x is False`` in Python. + + .. versionadded:: 3.10 + + +.. c:function:: PyTypeObject* Py_TYPE(const PyObject *o) + + Get the type of the Python object *o*. + + Return a :term:`borrowed reference`. + + The :c:func:`Py_SET_TYPE` function must be used to set an object type. .. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type) @@ -85,13 +117,13 @@ the definition of all other Python objects. .. versionadded:: 3.9 -.. c:macro:: Py_REFCNT(o) +.. c:function:: Py_ssize_t Py_REFCNT(const PyObject *o) - This macro is used to access the :attr:`ob_refcnt` member of a Python - object. - It expands to:: + Get the reference count of the Python object *o*. - (((PyObject*)(o))->ob_refcnt) + .. versionchanged:: 3.10 + :c:func:`Py_REFCNT()` is changed to the inline static function. + Use :c:func:`Py_SET_REFCNT()` to set an object reference count. .. c:function:: void Py_SET_REFCNT(PyObject *o, Py_ssize_t refcnt) @@ -101,12 +133,11 @@ the definition of all other Python objects. .. versionadded:: 3.9 -.. c:macro:: Py_SIZE(o) +.. c:function:: Py_ssize_t Py_SIZE(const PyVarObject *o) - This macro is used to access the :attr:`ob_size` member of a Python object. - It expands to:: + Get the size of the Python object *o*. - (((PyVarObject*)(o))->ob_size) + The :c:func:`Py_SET_SIZE` function must be used to set an object size. .. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size) @@ -259,10 +290,12 @@ There are these calling conventions: of :c:type:`PyObject*` values indicating the arguments and the third parameter is the number of arguments (the length of the array). - This is not part of the :ref:`limited API `. - .. versionadded:: 3.7 + .. versionchanged:: 3.10 + + ``METH_FASTCALL`` is now part of the stable ABI. + .. data:: METH_FASTCALL | METH_KEYWORDS @@ -461,7 +494,7 @@ Accessing attributes of extension types +=============+==================+===================================+ | name | const char \* | attribute name | +-------------+------------------+-----------------------------------+ - | get | getter | C function to get the attribute | + | get | getter | C Function to get the attribute | +-------------+------------------+-----------------------------------+ | set | setter | optional C function to set or | | | | delete the attribute, if omitted | diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index 0a5c8d70..97717f5f 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -118,22 +118,21 @@ Operating System Utilities .. c:function:: wchar_t* Py_DecodeLocale(const char* arg, size_t *size) - Decode a byte string from the locale encoding with the :ref:`surrogateescape - error handler `: undecodable bytes are decoded as - characters in range U+DC80..U+DCFF. If a byte sequence can be decoded as a - surrogate character, escape the bytes using the surrogateescape error - handler instead of decoding them. - - Encoding, highest priority to lowest priority: - - * ``UTF-8`` on macOS, Android, and VxWorks; - * ``UTF-8`` on Windows if :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; - * ``UTF-8`` if the Python UTF-8 mode is enabled; - * ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``, - ``nl_langinfo(CODESET)`` returns the ``ASCII`` encoding (or an alias), - and :c:func:`mbstowcs` and :c:func:`wcstombs` functions uses the - ``ISO-8859-1`` encoding. - * the current locale encoding. + .. warning:: + This function should not be called directly: use the :c:type:`PyConfig` + API with the :c:func:`PyConfig_SetBytesString` function which ensures + that :ref:`Python is preinitialized `. + + This function must not be called before :ref:`Python is preinitialized + ` and so that the LC_CTYPE locale is properly configured: see + the :c:func:`Py_PreInitialize` function. + + Decode a byte string from the :term:`filesystem encoding and error handler`. + If the error handler is :ref:`surrogateescape error handler + `, undecodable bytes are decoded as characters in range + U+DC80..U+DCFF; and if a byte sequence can be decoded as a surrogate + character, the bytes are escaped using the surrogateescape error handler + instead of decoding them. Return a pointer to a newly allocated wide character string, use :c:func:`PyMem_RawFree` to free the memory. If size is not ``NULL``, write @@ -143,6 +142,10 @@ Operating System Utilities not ``NULL``, ``*size`` is set to ``(size_t)-1`` on memory error or set to ``(size_t)-2`` on decoding error. + The :term:`filesystem encoding and error handler` are selected by + :c:func:`PyConfig_Read`: see :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + Decoding errors should never happen, unless there is a bug in the C library. @@ -157,7 +160,8 @@ Operating System Utilities .. versionadded:: 3.5 .. versionchanged:: 3.7 - The function now uses the UTF-8 encoding in the UTF-8 mode. + The function now uses the UTF-8 encoding in the :ref:`Python UTF-8 Mode + `. .. versionchanged:: 3.8 The function now uses the UTF-8 encoding on Windows if @@ -166,33 +170,30 @@ Operating System Utilities .. c:function:: char* Py_EncodeLocale(const wchar_t *text, size_t *error_pos) - Encode a wide character string to the locale encoding with the - :ref:`surrogateescape error handler `: surrogate characters - in the range U+DC80..U+DCFF are converted to bytes 0x80..0xFF. - - Encoding, highest priority to lowest priority: - - * ``UTF-8`` on macOS, Android, and VxWorks; - * ``UTF-8`` on Windows if :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; - * ``UTF-8`` if the Python UTF-8 mode is enabled; - * ``ASCII`` if the ``LC_CTYPE`` locale is ``"C"``, - ``nl_langinfo(CODESET)`` returns the ``ASCII`` encoding (or an alias), - and :c:func:`mbstowcs` and :c:func:`wcstombs` functions uses the - ``ISO-8859-1`` encoding. - * the current locale encoding. - - The function uses the UTF-8 encoding in the Python UTF-8 mode. + Encode a wide character string to the :term:`filesystem encoding and error + handler`. If the error handler is :ref:`surrogateescape error handler + `, surrogate characters in the range U+DC80..U+DCFF are + converted to bytes 0x80..0xFF. Return a pointer to a newly allocated byte string, use :c:func:`PyMem_Free` to free the memory. Return ``NULL`` on encoding error or memory allocation - error. + error If error_pos is not ``NULL``, ``*error_pos`` is set to ``(size_t)-1`` on success, or set to the index of the invalid character on encoding error. + The :term:`filesystem encoding and error handler` are selected by + :c:func:`PyConfig_Read`: see :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + Use the :c:func:`Py_DecodeLocale` function to decode the bytes string back to a wide character string. + .. warning:: + This function must not be called before :ref:`Python is preinitialized + ` and so that the LC_CTYPE locale is properly configured: see + the :c:func:`Py_PreInitialize` function. + .. seealso:: The :c:func:`PyUnicode_EncodeFSDefault` and @@ -201,11 +202,12 @@ Operating System Utilities .. versionadded:: 3.5 .. versionchanged:: 3.7 - The function now uses the UTF-8 encoding in the UTF-8 mode. + The function now uses the UTF-8 encoding in the :ref:`Python UTF-8 Mode + `. .. versionchanged:: 3.8 The function now uses the UTF-8 encoding on Windows if - :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero. + :c:data:`Py_LegacyWindowsFSEncodingFlag` is zero; .. _systemfunctions: @@ -321,7 +323,7 @@ accessible to C code. They all work with the current interpreter thread's leaks.) Note that ``#`` format characters should always be treated as - :c:type:`Py_ssize_t`, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. + ``Py_ssize_t``, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. :func:`sys.audit` performs the same function from Python code. @@ -329,14 +331,14 @@ accessible to C code. They all work with the current interpreter thread's .. versionchanged:: 3.8.2 - Require :c:type:`Py_ssize_t` for ``#`` format characters. Previously, an + Require ``Py_ssize_t`` for ``#`` format characters. Previously, an unavoidable deprecation warning was raised. .. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) Append the callable *hook* to the list of active auditing hooks. - Return zero on success + Return zero for success and non-zero on failure. If the runtime has been initialized, also set an error on failure. Hooks added through this API are called for all interpreters created by the runtime. diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst index 1dbf7dbb..6919e610 100644 --- a/Doc/c-api/tuple.rst +++ b/Doc/c-api/tuple.rst @@ -57,7 +57,7 @@ Tuple Objects .. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos) Return the object at position *pos* in the tuple pointed to by *p*. If *pos* is - out of bounds, return ``NULL`` and set an :exc:`IndexError` exception. + negative or out of bounds, return ``NULL`` and set an :exc:`IndexError` exception. .. c:function:: PyObject* PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst index 119a9081..c472e8df 100644 --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -116,10 +116,12 @@ Type Objects See :c:member:`PyType_Slot.slot` for possible values of the *slot* argument. - An exception is raised if *type* is not a heap type. - .. versionadded:: 3.4 + .. versionchanged:: 3.10 + :c:func:`PyType_GetSlot` can now accept all types. + Previously, it was limited to :ref:`heap types `. + .. c:function:: PyObject* PyType_GetModule(PyTypeObject *type) Return the module object associated with the given type when the type was @@ -160,12 +162,11 @@ The following functions and structs are used to create .. c:function:: PyObject* PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases) - Creates and returns a heap type object from the *spec* + Creates and returns a :ref:`heap type ` from the *spec* (:const:`Py_TPFLAGS_HEAPTYPE`). - If *bases* is a tuple, the created heap type contains all types contained - in it as base types. - + The *bases* argument can be used to specify base classes; it can either + be only one class or a tuple of classes. If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead. If that also is ``NULL``, the *Py_tp_base* slot is used instead. If that also is ``NULL``, the new type derives from :class:`object`. @@ -181,6 +182,11 @@ The following functions and structs are used to create .. versionadded:: 3.9 + .. versionchanged:: 3.10 + + The function now accepts a single class as the *bases* argument and + ``NULL`` as the ``tp_doc`` slot. + .. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases) Equivalent to ``PyType_FromModuleAndSpec(NULL, spec, bases)``. @@ -266,11 +272,11 @@ The following functions and structs are used to create .. versionchanged:: 3.9 - Slots in :c:type:`PyBufferProcs` may be set in the unlimited API. + Slots in :c:type:`PyBufferProcs` in may be set in the unlimited API. .. c:member:: void *PyType_Slot.pfunc The desired value of the slot. In most cases, this is a pointer to a function. - May not be ``NULL``. + Slots other than ``Py_tp_doc`` may not be ``NULL``. diff --git a/Doc/c-api/typehints.rst b/Doc/c-api/typehints.rst index 2d1175f4..dfda96a4 100644 --- a/Doc/c-api/typehints.rst +++ b/Doc/c-api/typehints.rst @@ -5,8 +5,9 @@ Objects for Type Hinting ------------------------ -Various built-in types for type hinting are provided. -Only :ref:`GenericAlias ` is exposed to C. +Various built-in types for type hinting are provided. Currently, +two types exist -- :ref:`GenericAlias ` and +:ref:`Union `. Only ``GenericAlias`` is exposed to C. .. c:function:: PyObject* Py_GenericAlias(PyObject *origin, PyObject *args) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index eedefd7c..b642835a 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -43,13 +43,13 @@ Quick Reference +================================================+===================================+===================+===+===+===+===+ | :c:member:`~PyTypeObject.tp_name` | const char * | __name__ | X | X | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_basicsize` | :c:type:`Py_ssize_t` | | X | X | | X | + | :c:member:`~PyTypeObject.tp_basicsize` | Py_ssize_t | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_itemsize` | :c:type:`Py_ssize_t` | | | X | | X | + | :c:member:`~PyTypeObject.tp_itemsize` | Py_ssize_t | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_dealloc` | :c:type:`destructor` | | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_vectorcall_offset` | :c:type:`Py_ssize_t` | | | X | | X | + | :c:member:`~PyTypeObject.tp_vectorcall_offset` | Py_ssize_t | | | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | (:c:member:`~PyTypeObject.tp_getattr`) | :c:type:`getattrfunc` | __getattribute__, | | | | G | | | | __getattr__ | | | | | @@ -96,7 +96,7 @@ Quick Reference | | | __gt__, | | | | | | | | __ge__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_weaklistoffset` | :c:type:`Py_ssize_t` | | | X | | ? | + | :c:member:`~PyTypeObject.tp_weaklistoffset` | Py_ssize_t | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_iter` | :c:type:`getiterfunc` | __iter__ | | | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -117,7 +117,7 @@ Quick Reference | :c:member:`~PyTypeObject.tp_descr_set` | :c:type:`descrsetfunc` | __set__, | | | | X | | | | __delete__ | | | | | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ - | :c:member:`~PyTypeObject.tp_dictoffset` | :c:type:`Py_ssize_t` | | | X | | ? | + | :c:member:`~PyTypeObject.tp_dictoffset` | Py_ssize_t | | | X | | ? | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ | :c:member:`~PyTypeObject.tp_init` | :c:type:`initproc` | __init__ | X | X | | X | +------------------------------------------------+-----------------------------------+-------------------+---+---+---+---+ @@ -199,6 +199,8 @@ sub-slots +---------------------------------------------------------+-----------------------------------+---------------+ | :c:member:`~PyAsyncMethods.am_anext` | :c:type:`unaryfunc` | __anext__ | +---------------------------------------------------------+-----------------------------------+---------------+ + | :c:member:`~PyAsyncMethods.am_send` | :c:type:`sendfunc` | | + +---------------------------------------------------------+-----------------------------------+---------------+ | | +---------------------------------------------------------+-----------------------------------+---------------+ | :c:member:`~PyNumberMethods.nb_add` | :c:type:`binaryfunc` | __add__ | @@ -331,7 +333,7 @@ slot typedefs | :c:type:`allocfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyTypeObject` * | | -| | :c:type:`Py_ssize_t` | | +| | Py_ssize_t | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`destructor` | void * | void | +-----------------------------+-----------------------------+----------------------+ @@ -403,7 +405,7 @@ slot typedefs +-----------------------------+-----------------------------+----------------------+ | :c:type:`iternextfunc` | :c:type:`PyObject` * | :c:type:`PyObject` * | +-----------------------------+-----------------------------+----------------------+ -| :c:type:`lenfunc` | :c:type:`PyObject` * | :c:type:`Py_ssize_t` | +| :c:type:`lenfunc` | :c:type:`PyObject` * | Py_ssize_t | +-----------------------------+-----------------------------+----------------------+ | :c:type:`getbufferproc` | .. line-block:: | int | | | | | @@ -436,12 +438,12 @@ slot typedefs | :c:type:`ssizeargfunc` | .. line-block:: | :c:type:`PyObject` * | | | | | | | :c:type:`PyObject` * | | -| | :c:type:`Py_ssize_t` | | +| | Py_ssize_t | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`ssizeobjargproc` | .. line-block:: | int | | | | | | | :c:type:`PyObject` * | | -| | :c:type:`Py_ssize_t` | | +| | Py_ssize_t | | +-----------------------------+-----------------------------+----------------------+ | :c:type:`objobjproc` | .. line-block:: | int | | | | | @@ -474,36 +476,20 @@ PyObject Slots -------------- The type object structure extends the :c:type:`PyVarObject` structure. The -:attr:`ob_size` field is used for dynamic types (created by :func:`type_new`, +:attr:`ob_size` field is used for dynamic types (created by :func:`type_new`, usually called from a class statement). Note that :c:data:`PyType_Type` (the metatype) initializes :c:member:`~PyTypeObject.tp_itemsize`, which means that its instances (i.e. type objects) *must* have the :attr:`ob_size` field. -.. c:member:: PyObject* PyObject._ob_next - PyObject* PyObject._ob_prev - - These fields are only present when the macro ``Py_TRACE_REFS`` is defined. - Their initialization to ``NULL`` is taken care of by the ``PyObject_HEAD_INIT`` - macro. For statically allocated objects, these fields always remain ``NULL``. - For dynamically allocated objects, these two fields are used to link the object - into a doubly-linked list of *all* live objects on the heap. This could be used - for various debugging purposes; currently the only use is to print the objects - that are still alive at the end of a run when the environment variable - :envvar:`PYTHONDUMPREFS` is set. - - **Inheritance:** - - These fields are not inherited by subtypes. - - .. c:member:: Py_ssize_t PyObject.ob_refcnt This is the type object's reference count, initialized to ``1`` by the - ``PyObject_HEAD_INIT`` macro. Note that for statically allocated type objects, - the type's instances (objects whose :attr:`ob_type` points back to the type) do - *not* count as references. But for dynamically allocated type objects, the - instances *do* count as references. + ``PyObject_HEAD_INIT`` macro. Note that for :ref:`statically allocated type + objects `, the type's instances (objects whose :attr:`ob_type` + points back to the type) do *not* count as references. But for + :ref:`dynamically allocated type objects `, the instances *do* + count as references. **Inheritance:** @@ -533,13 +519,36 @@ type objects) *must* have the :attr:`ob_size` field. This field is inherited by subtypes. +.. c:member:: PyObject* PyObject._ob_next + PyObject* PyObject._ob_prev + + These fields are only present when the macro ``Py_TRACE_REFS`` is defined + (see the :option:`configure --with-trace-refs option <--with-trace-refs>`). + + Their initialization to ``NULL`` is taken care of by the + ``PyObject_HEAD_INIT`` macro. For :ref:`statically allocated objects + `, these fields always remain ``NULL``. For :ref:`dynamically + allocated objects `, these two fields are used to link the + object into a doubly-linked list of *all* live objects on the heap. + + This could be used for various debugging purposes; currently the only uses + are the :func:`sys.getobjects` function and to print the objects that are + still alive at the end of a run when the environment variable + :envvar:`PYTHONDUMPREFS` is set. + + **Inheritance:** + + These fields are not inherited by subtypes. + + PyVarObject Slots ----------------- .. c:member:: Py_ssize_t PyVarObject.ob_size - For statically allocated type objects, this should be initialized to zero. For - dynamically allocated type objects, this field has a special internal meaning. + For :ref:`statically allocated type objects `, this should be + initialized to zero. For :ref:`dynamically allocated type objects + `, this field has a special internal meaning. **Inheritance:** @@ -564,11 +573,13 @@ and :c:type:`PyType_Type` effectively act as defaults.) :class:`T` defined in module :mod:`M` in subpackage :mod:`Q` in package :mod:`P` should have the :c:member:`~PyTypeObject.tp_name` initializer ``"P.Q.M.T"``. - For dynamically allocated type objects, this should just be the type name, and + For :ref:`dynamically allocated type objects `, + this should just be the type name, and the module name explicitly stored in the type dict as the value for key ``'__module__'``. - For statically allocated type objects, the tp_name field should contain a dot. + For :ref:`statically allocated type objects `, + the *tp_name* field should contain a dot. Everything before the last dot is made accessible as the :attr:`__module__` attribute, and everything after the last dot is made accessible as the :attr:`~definition.__name__` attribute. @@ -657,18 +668,6 @@ and :c:type:`PyType_Type` effectively act as defaults.) :c:func:`PyObject_GC_Del` if the instance was allocated using :c:func:`PyObject_GC_New` or :c:func:`PyObject_GC_NewVar`. - If the type supports garbage collection (has the :const:`Py_TPFLAGS_HAVE_GC` - flag bit set), the destructor should call :c:func:`PyObject_GC_UnTrack` - before clearing any member fields. - - .. code-block:: c - - static void foo_dealloc(foo_object *self) { - PyObject_GC_UnTrack(self); - Py_CLEAR(self->ref); - Py_TYPE(self)->tp_free((PyObject *)self); - } - Finally, if the type is heap allocated (:const:`Py_TPFLAGS_HEAPTYPE`), the deallocator should decrement the reference count for its type object after calling the type deallocator. In order to avoid dangling pointers, the @@ -735,7 +734,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) always inherited. If it's not, then the subclass won't use :ref:`vectorcall `, except when :c:func:`PyVectorcall_Call` is explicitly called. - This is in particular the case for `heap types`_ + This is in particular the case for :ref:`heap types ` (including subclasses defined in Python). @@ -1098,8 +1097,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) This is a bitmask of all the bits that pertain to the existence of certain fields in the type object and its extension structures. Currently, it includes - the following bits: :const:`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`, - :const:`Py_TPFLAGS_HAVE_VERSION_TAG`. + the following bits: :const:`Py_TPFLAGS_HAVE_STACKLESS_EXTENSION`. **Inheritance:** @@ -1126,7 +1124,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) **Inheritance:** - This flag is never inherited by heap types. + This flag is never inherited by :ref:`heap types `. For extension types, it is inherited whenever :c:member:`~PyTypeObject.tp_descr_get` is inherited. @@ -1173,12 +1171,88 @@ and :c:type:`PyType_Type` effectively act as defaults.) **Inheritance:** - This bit is inherited for *static* subtypes if + This bit is inherited for :ref:`static subtypes ` if :c:member:`~PyTypeObject.tp_call` is also inherited. - `Heap types`_ do not inherit ``Py_TPFLAGS_HAVE_VECTORCALL``. + :ref:`Heap types ` do not inherit ``Py_TPFLAGS_HAVE_VECTORCALL``. .. versionadded:: 3.9 + .. data:: Py_TPFLAGS_IMMUTABLETYPE + + This bit is set for type objects that are immutable: type attributes cannot be set nor deleted. + + :c:func:`PyType_Ready` automatically applies this flag to + :ref:`static types `. + + **Inheritance:** + + This flag is not inherited. + + .. versionadded:: 3.10 + + .. data:: Py_TPFLAGS_DISALLOW_INSTANTIATION + + Disallow creating instances of the type: set + :c:member:`~PyTypeObject.tp_new` to NULL and don't create the ``__new__`` + key in the type dictionary. + + The flag must be set before creating the type, not after. For example, it + must be set before :c:func:`PyType_Ready` is called on the type. + + The flag is set automatically on :ref:`static types ` if + :c:member:`~PyTypeObject.tp_base` is NULL or ``&PyBaseObject_Type`` and + :c:member:`~PyTypeObject.tp_new` is NULL. + + **Inheritance:** + + This flag is not inherited. + + .. versionadded:: 3.10 + + + .. data:: Py_TPFLAGS_MAPPING + + This bit indicates that instances of the class may match mapping patterns + when used as the subject of a :keyword:`match` block. It is automatically + set when registering or subclassing :class:`collections.abc.Mapping`, and + unset when registering :class:`collections.abc.Sequence`. + + .. note:: + + :const:`Py_TPFLAGS_MAPPING` and :const:`Py_TPFLAGS_SEQUENCE` are + mutually exclusive; it is an error enable both flags simultaneously. + + **Inheritance:** + + This flag is inherited by types that do not already set + :const:`Py_TPFLAGS_SEQUENCE`. + + .. seealso:: :pep:`634` -- Structural Pattern Matching: Specification + + .. versionadded:: 3.10 + + + .. data:: Py_TPFLAGS_SEQUENCE + + This bit indicates that instances of the class may match sequence patterns + when used as the subject of a :keyword:`match` block. It is automatically + set when registering or subclassing :class:`collections.abc.Sequence`, and + unset when registering :class:`collections.abc.Mapping`. + + .. note:: + + :const:`Py_TPFLAGS_MAPPING` and :const:`Py_TPFLAGS_SEQUENCE` are + mutually exclusive; it is an error enable both flags simultaneously. + + **Inheritance:** + + This flag is inherited by types that do not already set + :const:`Py_TPFLAGS_MAPPING`. + + .. seealso:: :pep:`634` -- Structural Pattern Matching: Specification + + .. versionadded:: 3.10 + .. c:member:: const char* PyTypeObject.tp_doc @@ -1225,8 +1299,9 @@ and :c:type:`PyType_Type` effectively act as defaults.) :func:`~gc.get_referents` function will include it. .. warning:: - When implementing :c:member:`~PyTypeObject.tp_traverse`, only the members - that the instance *owns* (by having strong references to them) must be + When implementing :c:member:`~PyTypeObject.tp_traverse`, only the + members that the instance *owns* (by having :term:`strong references + ` to them) must be visited. For instance, if an object supports weak references via the :c:member:`~PyTypeObject.tp_weaklist` slot, the pointer supporting the linked list (what *tp_weaklist* points to) must **not** be @@ -1239,9 +1314,8 @@ and :c:type:`PyType_Type` effectively act as defaults.) :c:func:`local_traverse` to have these specific names; don't name them just anything. - Heap-allocated types (:const:`Py_TPFLAGS_HEAPTYPE`, such as those created - with :c:func:`PyType_FromSpec` and similar APIs) hold a reference to their - type. Their traversal function must therefore either visit + Instances of :ref:`heap-allocated types ` hold a reference to + their type. Their traversal function must therefore either visit :c:func:`Py_TYPE(self) `, or delegate this responsibility by calling ``tp_traverse`` of another heap-allocated type (such as a heap-allocated superclass). @@ -1662,8 +1736,8 @@ and :c:type:`PyType_Type` effectively act as defaults.) **Default:** - This slot has no default. For static types, if the field is - ``NULL`` then no :attr:`__dict__` gets created for instances. + This slot has no default. For :ref:`static types `, if the + field is ``NULL`` then no :attr:`__dict__` gets created for instances. .. c:member:: initproc PyTypeObject.tp_init @@ -1698,7 +1772,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) **Default:** - For static types this field does not have a default. + For :ref:`static types ` this field does not have a default. .. c:member:: allocfunc PyTypeObject.tp_alloc @@ -1747,16 +1821,20 @@ and :c:type:`PyType_Type` effectively act as defaults.) in :c:member:`~PyTypeObject.tp_new`, while for mutable types, most initialization should be deferred to :c:member:`~PyTypeObject.tp_init`. + Set the :const:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag to disallow creating + instances of the type in Python. + **Inheritance:** - This field is inherited by subtypes, except it is not inherited by static types - whose :c:member:`~PyTypeObject.tp_base` is ``NULL`` or ``&PyBaseObject_Type``. + This field is inherited by subtypes, except it is not inherited by + :ref:`static types ` whose :c:member:`~PyTypeObject.tp_base` + is ``NULL`` or ``&PyBaseObject_Type``. **Default:** - For static types this field has no default. This means if the - slot is defined as ``NULL``, the type cannot be called to create new - instances; presumably there is some other way to create + For :ref:`static types ` this field has no default. + This means if the slot is defined as ``NULL``, the type cannot be called + to create new instances; presumably there is some other way to create instances, like a factory function. @@ -1798,7 +1876,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) (The only example of this are types themselves. The metatype, :c:data:`PyType_Type`, defines this function to distinguish between statically - and dynamically allocated types.) + and :ref:`dynamically allocated types `.) **Inheritance:** @@ -1909,17 +1987,6 @@ and :c:type:`PyType_Type` effectively act as defaults.) For this field to be taken into account (even through inheritance), you must also set the :const:`Py_TPFLAGS_HAVE_FINALIZE` flags bit. - Also, note that, in a garbage collected Python, - :c:member:`~PyTypeObject.tp_dealloc` may be called from - any Python thread, not just the thread which created the object (if the object - becomes part of a refcount cycle, that cycle might be collected by a garbage - collection on any thread). This is not a problem for Python API calls, since - the thread on which tp_dealloc is called will own the Global Interpreter Lock - (GIL). However, if the object being destroyed in turn destroys objects from some - other C or C++ library, care should be taken to ensure that destroying those - objects on the thread which called tp_dealloc will not violate any assumptions - of the library. - **Inheritance:** This field is inherited by subtypes. @@ -1944,10 +2011,21 @@ and :c:type:`PyType_Type` effectively act as defaults.) .. versionadded:: 3.9 (the field exists since 3.8 but it's only used since 3.9) -.. _heap-types: +Also, note that, in a garbage collected Python, :c:member:`~PyTypeObject.tp_dealloc` may be called from +any Python thread, not just the thread which created the object (if the object +becomes part of a refcount cycle, that cycle might be collected by a garbage +collection on any thread). This is not a problem for Python API calls, since +the thread on which tp_dealloc is called will own the Global Interpreter Lock +(GIL). However, if the object being destroyed in turn destroys objects from some +other C or C++ library, care should be taken to ensure that destroying those +objects on the thread which called tp_dealloc will not violate any assumptions +of the library. -Heap Types ----------- + +.. _static-types: + +Static Types +------------ Traditionally, types defined in C code are *static*, that is, a static :c:type:`PyTypeObject` structure is defined directly in code @@ -1967,12 +2045,20 @@ Also, since :c:type:`PyTypeObject` is not part of the :ref:`stable ABI ` any extension modules using static types must be compiled for a specific Python minor version. -An alternative to static types is *heap-allocated types*, or *heap types* -for short, which correspond closely to classes created by Python's -``class`` statement. + +.. _heap-types: + +Heap Types +---------- + +An alternative to :ref:`static types ` is *heap-allocated types*, +or *heap types* for short, which correspond closely to classes created by +Python's ``class`` statement. Heap types have the :const:`Py_TPFLAGS_HEAPTYPE` +flag set. This is done by filling a :c:type:`PyType_Spec` structure and calling -:c:func:`PyType_FromSpecWithBases`. +:c:func:`PyType_FromSpec`, :c:func:`PyType_FromSpecWithBases`, +or :c:func:`PyType_FromModuleAndSpec`. .. _number-structs: @@ -2321,6 +2407,7 @@ Async Object Structures unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; + sendfunc am_send; } PyAsyncMethods; .. c:member:: unaryfunc PyAsyncMethods.am_await @@ -2340,8 +2427,7 @@ Async Object Structures PyObject *am_aiter(PyObject *self); - Must return an :term:`asynchronous iterator` object. - See :meth:`__anext__` for details. + Must return an :term:`awaitable` object. See :meth:`__anext__` for details. This slot may be set to ``NULL`` if an object does not implement asynchronous iteration protocol. @@ -2355,6 +2441,17 @@ Async Object Structures Must return an :term:`awaitable` object. See :meth:`__anext__` for details. This slot may be set to ``NULL``. +.. c:member:: sendfunc PyAsyncMethods.am_send + + The signature of this function is:: + + PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result); + + See :c:func:`PyIter_Send` for details. + This slot may be set to ``NULL``. + + .. versionadded:: 3.10 + .. _slot-typedefs: @@ -2450,6 +2547,10 @@ Slot Type typedefs .. c:type:: PyObject *(*binaryfunc)(PyObject *, PyObject *) +.. c:type:: PySendResult (*sendfunc)(PyObject *, PyObject *, PyObject **) + + See :c:member:`~PyAsyncMethods.am_send`. + .. c:type:: PyObject *(*ternaryfunc)(PyObject *, PyObject *, PyObject *) .. c:type:: PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t) @@ -2471,7 +2572,7 @@ include common usage you may encounter. Some demonstrate tricky corner cases. For more examples, practical info, and a tutorial, see :ref:`defining-new-types` and :ref:`new-types-topics`. -A basic static type:: +A basic :ref:`static type `:: typedef struct { PyObject_HEAD @@ -2482,7 +2583,7 @@ A basic static type:: PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "mymod.MyObject", .tp_basicsize = sizeof(MyObject), - .tp_doc = PyDoc_STR("My objects"), + .tp_doc = "My objects", .tp_new = myobj_new, .tp_dealloc = (destructor)myobj_dealloc, .tp_repr = (reprfunc)myobj_repr, @@ -2512,7 +2613,7 @@ with a more verbose initializer:: 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ - PyDoc_STR("My objects"), /* tp_doc */ + "My objects", /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ @@ -2545,7 +2646,7 @@ A type that supports weakrefs, instance dicts, and hashing:: PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "mymod.MyObject", .tp_basicsize = sizeof(MyObject), - .tp_doc = PyDoc_STR("My objects"), + .tp_doc = "My objects", .tp_weaklistoffset = offsetof(MyObject, weakreflist), .tp_dictoffset = offsetof(MyObject, inst_dict), .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, @@ -2560,7 +2661,8 @@ A type that supports weakrefs, instance dicts, and hashing:: }; A str subclass that cannot be subclassed and cannot be called -to create instances (e.g. uses a separate factory func):: +to create instances (e.g. uses a separate factory func) using +:c:data:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag:: typedef struct { PyUnicodeObject raw; @@ -2572,13 +2674,12 @@ to create instances (e.g. uses a separate factory func):: .tp_name = "mymod.MyStr", .tp_basicsize = sizeof(MyStr), .tp_base = NULL, // set to &PyUnicode_Type in module init - .tp_doc = PyDoc_STR("my custom str"), - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_new = NULL, + .tp_doc = "my custom str", + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION, .tp_repr = (reprfunc)myobj_repr, }; -The simplest static type (with fixed-length instances):: +The simplest :ref:`static type ` with fixed-length instances:: typedef struct { PyObject_HEAD @@ -2589,7 +2690,7 @@ The simplest static type (with fixed-length instances):: .tp_name = "mymod.MyObject", }; -The simplest static type (with variable-length instances):: +The simplest :ref:`static type ` with variable-length instances:: typedef struct { PyObject_VAR_HEAD diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 4129c614..cb2438e2 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -268,57 +268,57 @@ are available through these macros which are mapped to C functions depending on the Python configuration. -.. c:function:: int Py_UNICODE_ISSPACE(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISSPACE(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a whitespace character. -.. c:function:: int Py_UNICODE_ISLOWER(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISLOWER(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a lowercase character. -.. c:function:: int Py_UNICODE_ISUPPER(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISUPPER(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is an uppercase character. -.. c:function:: int Py_UNICODE_ISTITLE(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISTITLE(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a titlecase character. -.. c:function:: int Py_UNICODE_ISLINEBREAK(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISLINEBREAK(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a linebreak character. -.. c:function:: int Py_UNICODE_ISDECIMAL(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISDECIMAL(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a decimal character. -.. c:function:: int Py_UNICODE_ISDIGIT(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISDIGIT(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a digit character. -.. c:function:: int Py_UNICODE_ISNUMERIC(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISNUMERIC(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a numeric character. -.. c:function:: int Py_UNICODE_ISALPHA(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISALPHA(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is an alphabetic character. -.. c:function:: int Py_UNICODE_ISALNUM(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISALNUM(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is an alphanumeric character. -.. c:function:: int Py_UNICODE_ISPRINTABLE(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_ISPRINTABLE(Py_UNICODE ch) Return ``1`` or ``0`` depending on whether *ch* is a printable character. Nonprintable characters are those characters defined in the Unicode character @@ -332,7 +332,7 @@ the Python configuration. These APIs can be used for fast direct character conversions: -.. c:function:: Py_UCS4 Py_UNICODE_TOLOWER(Py_UCS4 ch) +.. c:function:: Py_UNICODE Py_UNICODE_TOLOWER(Py_UNICODE ch) Return the character *ch* converted to lower case. @@ -340,7 +340,7 @@ These APIs can be used for fast direct character conversions: This function uses simple case mappings. -.. c:function:: Py_UCS4 Py_UNICODE_TOUPPER(Py_UCS4 ch) +.. c:function:: Py_UNICODE Py_UNICODE_TOUPPER(Py_UNICODE ch) Return the character *ch* converted to upper case. @@ -348,7 +348,7 @@ These APIs can be used for fast direct character conversions: This function uses simple case mappings. -.. c:function:: Py_UCS4 Py_UNICODE_TOTITLE(Py_UCS4 ch) +.. c:function:: Py_UNICODE Py_UNICODE_TOTITLE(Py_UNICODE ch) Return the character *ch* converted to title case. @@ -356,19 +356,19 @@ These APIs can be used for fast direct character conversions: This function uses simple case mappings. -.. c:function:: int Py_UNICODE_TODECIMAL(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_TODECIMAL(Py_UNICODE ch) Return the character *ch* converted to a decimal positive integer. Return ``-1`` if this is not possible. This macro does not raise exceptions. -.. c:function:: int Py_UNICODE_TODIGIT(Py_UCS4 ch) +.. c:function:: int Py_UNICODE_TODIGIT(Py_UNICODE ch) Return the character *ch* converted to a single digit integer. Return ``-1`` if this is not possible. This macro does not raise exceptions. -.. c:function:: double Py_UNICODE_TONUMERIC(Py_UCS4 ch) +.. c:function:: double Py_UNICODE_TONUMERIC(Py_UNICODE ch) Return the character *ch* converted to a double. Return ``-1.0`` if this is not possible. This macro does not raise exceptions. @@ -490,11 +490,11 @@ APIs: | :attr:`%llu` | unsigned long long | Equivalent to | | | | ``printf("%llu")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zd` | :c:type:`\ | Equivalent to | - | | Py_ssize_t` | ``printf("%zd")``. [1]_ | + | :attr:`%zd` | Py_ssize_t | Equivalent to | + | | | ``printf("%zd")``. [1]_ | +-------------------+---------------------+----------------------------------+ - | :attr:`%zi` | :c:type:`\ | Equivalent to | - | | Py_ssize_t` | ``printf("%zi")``. [1]_ | + | :attr:`%zi` | Py_ssize_t | Equivalent to | + | | | ``printf("%zi")``. [1]_ | +-------------------+---------------------+----------------------------------+ | :attr:`%zu` | size_t | Equivalent to | | | | ``printf("%zu")``. [1]_ | @@ -718,8 +718,6 @@ Extension modules can continue using them, as they will not be removed in Python :c:func:`PyUnicode_AsUCS4`, :c:func:`PyUnicode_AsWideChar`, :c:func:`PyUnicode_ReadChar` or similar new APIs. - .. deprecated-removed:: 3.3 3.10 - .. c:function:: PyObject* PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t size) @@ -748,20 +746,6 @@ Extension modules can continue using them, as they will not be removed in Python :c:func:`PyUnicode_ReadChar` or similar new APIs. -.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode) - - Create a copy of a Unicode string ending with a null code point. Return ``NULL`` - and raise a :exc:`MemoryError` exception on memory allocation failure, - otherwise return a new allocated buffer (use :c:func:`PyMem_Free` to free - the buffer). Note that the resulting :c:type:`Py_UNICODE*` string may - contain embedded null code points, which would cause the string to be - truncated when used in most C functions. - - .. versionadded:: 3.2 - - Please migrate to using :c:func:`PyUnicode_AsUCS4Copy` or similar new APIs. - - .. c:function:: Py_ssize_t PyUnicode_GetSize(PyObject *unicode) Return the size of the deprecated :c:type:`Py_UNICODE` representation, in @@ -802,7 +786,7 @@ system. :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at Python startup). - This function ignores the Python UTF-8 mode. + This function ignores the :ref:`Python UTF-8 Mode `. .. seealso:: @@ -838,7 +822,7 @@ system. :c:data:`Py_FileSystemDefaultEncoding` (the locale encoding read at Python startup). - This function ignores the Python UTF-8 mode. + This function ignores the :ref:`Python UTF-8 Mode `. .. seealso:: @@ -897,8 +881,7 @@ conversion function: .. c:function:: PyObject* PyUnicode_DecodeFSDefaultAndSize(const char *s, Py_ssize_t size) - Decode a string using :c:data:`Py_FileSystemDefaultEncoding` and the - :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + Decode a string from the :term:`filesystem encoding and error handler`. If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the locale encoding. @@ -918,8 +901,8 @@ conversion function: .. c:function:: PyObject* PyUnicode_DecodeFSDefault(const char *s) - Decode a null-terminated string using :c:data:`Py_FileSystemDefaultEncoding` - and the :c:data:`Py_FileSystemDefaultEncodeErrors` error handler. + Decode a null-terminated string from the :term:`filesystem encoding and + error handler`. If :c:data:`Py_FileSystemDefaultEncoding` is not set, fall back to the locale encoding. @@ -1025,7 +1008,7 @@ Error handling is set by errors which may also be set to ``NULL`` meaning to use the default handling defined for the codec. Default error handling for all built-in codecs is "strict" (:exc:`ValueError` is raised). -The codecs all use a similar interface. Only deviations from the following +The codecs all use a similar interface. Only deviation from the following generic ones are documented for simplicity. @@ -1110,14 +1093,16 @@ These are the UTF-8 codec APIs: This caches the UTF-8 representation of the string in the Unicode object, and subsequent calls will return a pointer to the same buffer. The caller is not - responsible for deallocating the buffer. The buffer is deallocated and - pointers to it become invalid when the Unicode object is garbage collected. + responsible for deallocating the buffer. .. versionadded:: 3.3 .. versionchanged:: 3.7 The return type is now ``const char *`` rather of ``char *``. + .. versionchanged:: 3.10 + This function is a part of the :ref:`limited API `. + .. c:function:: const char* PyUnicode_AsUTF8(PyObject *unicode) @@ -1240,7 +1225,7 @@ These are the UTF-16 codec APIs: ``1``, any byte order mark is copied to the output (where it will result in either a ``\ufeff`` or a ``\ufffe`` character). - After completion, ``*byteorder`` is set to the current byte order at the end + After completion, *\*byteorder* is set to the current byte order at the end of input data. If *byteorder* is ``NULL``, the codec starts in native order mode. @@ -1458,7 +1443,7 @@ Character Map Codecs This codec is special in that it can be used to implement many different codecs (and this is in fact what was done to obtain most of the standard codecs -included in the :mod:`encodings` package). The codec uses mappings to encode and +included in the :mod:`encodings` package). The codec uses mapping to encode and decode characters. The mapping objects provided must support the :meth:`__getitem__` mapping interface; dictionaries and sequences work well. @@ -1620,7 +1605,7 @@ They all return ``NULL`` or ``-1`` if an exception occurs. .. c:function:: PyObject* PyUnicode_Splitlines(PyObject *s, int keepend) Split a Unicode string at line breaks, returning a list of Unicode strings. - CRLF is considered to be one line break. If *keepend* is ``0``, the line break + CRLF is considered to be one line break. If *keepend* is ``0``, the Line break characters are not included in the resulting strings. diff --git a/Doc/c-api/veryhigh.rst b/Doc/c-api/veryhigh.rst index 3595a7b9..3354a2b9 100644 --- a/Doc/c-api/veryhigh.rst +++ b/Doc/c-api/veryhigh.rst @@ -75,8 +75,6 @@ the same library that the Python runtime is using. :c:func:`PyRun_SimpleFile`. *filename* is decoded from the filesystem encoding (:func:`sys.getfilesystemencoding`). If *filename* is ``NULL``, this function uses ``"???"`` as the filename. - If *closeit* is true, the file is closed before - ``PyRun_SimpleFileExFlags()`` returns. .. c:function:: int PyRun_SimpleString(const char *command) @@ -114,9 +112,9 @@ the same library that the Python runtime is using. Similar to :c:func:`PyRun_SimpleStringFlags`, but the Python source code is read from *fp* instead of an in-memory string. *filename* should be the name of - the file, it is decoded from the filesystem encoding - (:func:`sys.getfilesystemencoding`). If *closeit* is true, the file is - closed before PyRun_SimpleFileExFlags returns. + the file, it is decoded from :term:`filesystem encoding and error handler`. + If *closeit* is true, the file is closed before + ``PyRun_SimpleFileExFlags()`` returns. .. note:: On Windows, *fp* should be opened as binary mode (e.g. ``fopen(filename, "rb")``). @@ -134,7 +132,7 @@ the same library that the Python runtime is using. Read and execute a single statement from a file associated with an interactive device according to the *flags* argument. The user will be prompted using ``sys.ps1`` and ``sys.ps2``. *filename* is decoded from the - filesystem encoding (:func:`sys.getfilesystemencoding`). + :term:`filesystem encoding and error handler`. Returns ``0`` when the input was executed successfully, ``-1`` if there was an exception, or an error code @@ -153,9 +151,8 @@ the same library that the Python runtime is using. Read and execute statements from a file associated with an interactive device until EOF is reached. The user will be prompted using ``sys.ps1`` and - ``sys.ps2``. *filename* is decoded from the filesystem encoding - (:func:`sys.getfilesystemencoding`). Returns ``0`` at EOF or a negative - number upon failure. + ``sys.ps2``. *filename* is decoded from the :term:`filesystem encoding and + error handler`. Returns ``0`` at EOF or a negative number upon failure. .. c:var:: int (*PyOS_InputHook)(void) @@ -188,52 +185,6 @@ the same library that the Python runtime is using. :c:func:`PyMem_RawRealloc`, instead of being allocated by :c:func:`PyMem_Malloc` or :c:func:`PyMem_Realloc`. - -.. c:function:: struct _node* PyParser_SimpleParseString(const char *str, int start) - - This is a simplified interface to - :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set - to ``NULL`` and *flags* set to ``0``. - - .. deprecated-removed:: 3.9 3.10 - - -.. c:function:: struct _node* PyParser_SimpleParseStringFlags( const char *str, int start, int flags) - - This is a simplified interface to - :c:func:`PyParser_SimpleParseStringFlagsFilename` below, leaving *filename* set - to ``NULL``. - - .. deprecated-removed:: 3.9 3.10 - - -.. c:function:: struct _node* PyParser_SimpleParseStringFlagsFilename( const char *str, const char *filename, int start, int flags) - - Parse Python source code from *str* using the start token *start* according to - the *flags* argument. The result can be used to create a code object which can - be evaluated efficiently. This is useful if a code fragment must be evaluated - many times. *filename* is decoded from the filesystem encoding - (:func:`sys.getfilesystemencoding`). - - .. deprecated-removed:: 3.9 3.10 - - -.. c:function:: struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start) - - This is a simplified interface to :c:func:`PyParser_SimpleParseFileFlags` below, - leaving *flags* set to ``0``. - - .. deprecated-removed:: 3.9 3.10 - - -.. c:function:: struct _node* PyParser_SimpleParseFileFlags(FILE *fp, const char *filename, int start, int flags) - - Similar to :c:func:`PyParser_SimpleParseStringFlagsFilename`, but the Python - source code is read from *fp* instead of an in-memory string. - - .. deprecated-removed:: 3.9 3.10 - - .. c:function:: PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals) This is a simplified interface to :c:func:`PyRun_StringFlags` below, leaving @@ -274,7 +225,7 @@ the same library that the Python runtime is using. Similar to :c:func:`PyRun_StringFlags`, but the Python source code is read from *fp* instead of an in-memory string. *filename* should be the name of the file, - it is decoded from the filesystem encoding (:func:`sys.getfilesystemencoding`). + it is decoded from the :term:`filesystem encoding and error handler`. If *closeit* is true, the file is closed before :c:func:`PyRun_FileExFlags` returns. @@ -313,7 +264,7 @@ the same library that the Python runtime is using. .. c:function:: PyObject* Py_CompileStringExFlags(const char *str, const char *filename, int start, PyCompilerFlags *flags, int optimize) Like :c:func:`Py_CompileStringObject`, but *filename* is a byte string - decoded from the filesystem encoding (:func:`os.fsdecode`). + decoded from the :term:`filesystem encoding and error handler`. .. versionadded:: 3.2 diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst index 67698de7..98ebe711 100644 --- a/Doc/c-api/weakref.rst +++ b/Doc/c-api/weakref.rst @@ -58,10 +58,10 @@ as much as it can. .. note:: - This function returns a **borrowed reference** to the referenced object. + This function returns a :term:`borrowed reference` to the referenced object. This means that you should always call :c:func:`Py_INCREF` on the object - except if you know that it cannot be destroyed while you are still - using it. + except when it cannot be destroyed before the last usage of the borrowed + reference. .. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref) diff --git a/Doc/conf.py b/Doc/conf.py index 7e355bae..f626ce67 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -15,8 +15,7 @@ sys.path.append(os.path.abspath('includes')) extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest', 'pyspecific', 'c_annotations', 'escape4chm', - 'asdl_highlight', 'peg_highlight'] - + 'asdl_highlight', 'peg_highlight', 'glossary_search'] doctest_global_setup = ''' try: @@ -70,8 +69,7 @@ html_theme = 'python_docs_theme' html_theme_path = ['tools'] html_theme_options = { 'collapsiblesidebar': True, - 'issues_url': '/bugs.html', - 'license_url': '/license.html', + 'issues_url': 'https://docs.python.org/3/bugs.html', 'root_include_title': False # We use the version switcher instead. } @@ -227,8 +225,9 @@ linkcheck_ignore = [r'https://bugs.python.org/(issue)?\d+', # Options for extensions # ---------------------- -# Relative filename of the reference count data file. +# Relative filename of the data files refcount_file = 'data/refcounts.dat' +stable_abi_file = 'data/stable_abi.dat' # Sphinx 2 and Sphinx 3 compatibility # ----------------------------------- @@ -239,3 +238,5 @@ c_allow_pre_v3 = True # bpo-40204: Disable warnings on Sphinx 2 syntax of the C domain since the # documentation is built with -W (warnings treated as errors). c_warn_on_allowed_pre_v3 = False + +strip_signature_backslash = True diff --git a/Doc/copyright.rst b/Doc/copyright.rst index e64a4932..4191c0bb 100644 --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Copyright Python and this documentation is: -Copyright © 2001-2022 Python Software Foundation. All rights reserved. +Copyright © 2001-2021 Python Software Foundation. All rights reserved. Copyright © 2000 BeOpen.com. All rights reserved. diff --git a/Doc/data/python3.10.abi b/Doc/data/python3.10.abi new file mode 100644 index 00000000..1dca3e1c --- /dev/null +++ b/Doc/data/python3.10.abi @@ -0,0 +1,15736 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Doc/data/python3.9.abi b/Doc/data/python3.9.abi deleted file mode 100644 index cca97796..00000000 --- a/Doc/data/python3.9.abi +++ /dev/null @@ -1,18706 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index aac13511..89b64e6c 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -1073,9 +1073,17 @@ PyInterpreterState_New:PyInterpreterState*::: PyIter_Check:int::: PyIter_Check:PyObject*:o:0: +PyAIter_Check:int::: +PyAIter_Check:PyObject*:o:0: + PyIter_Next:PyObject*::+1: PyIter_Next:PyObject*:o:0: +PyIter_Send:int::: +PyIter_Send:PyObject*:iter:0: +PyIter_Send:PyObject*:arg:0: +PyIter_Send:PyObject**:presult:+1: + PyList_Append:int::: PyList_Append:PyObject*:list:0: PyList_Append:PyObject*:item:+1: @@ -1205,11 +1213,6 @@ PyLong_FromString:const char*:str:: PyLong_FromString:char**:pend:: PyLong_FromString:int:base:: -PyLong_FromUnicode:PyObject*::+1: -PyLong_FromUnicode:Py_UNICODE*:u:: -PyLong_FromUnicode:Py_ssize_t:length:: -PyLong_FromUnicode:int:base:: - PyLong_FromUnicodeObject:PyObject*::+1: PyLong_FromUnicodeObject:PyObject*:u:0: PyLong_FromUnicodeObject:int:base:: @@ -1697,6 +1700,9 @@ PyObject_GetItem:PyObject*:key:0: PyObject_GetIter:PyObject*::+1: PyObject_GetIter:PyObject*:o:0: +PyObject_GetAIter:PyObject*::+1: +PyObject_GetAIter:PyObject*:o:0: + PyObject_HasAttr:int::: PyObject_HasAttr:PyObject*:o:0: PyObject_HasAttr:PyObject*:attr_name:0: @@ -1803,32 +1809,6 @@ PyObject_TypeCheck:int::: PyObject_TypeCheck:PyObject*:o:0: PyObject_TypeCheck:PyTypeObject*:type:0: -PyParser_SimpleParseFile:struct _node*::: -PyParser_SimpleParseFile:FILE*:fp:: -PyParser_SimpleParseFile:const char*:filename:: -PyParser_SimpleParseFile:int:start:: - -PyParser_SimpleParseFileFlags:struct _node*::: -PyParser_SimpleParseFileFlags:FILE*:fp:: -PyParser_SimpleParseFileFlags:const char*:filename:: -PyParser_SimpleParseFileFlags:int:start:: -PyParser_SimpleParseFileFlags:int:flags:: - -PyParser_SimpleParseString:struct _node*::: -PyParser_SimpleParseString:const char*:str:: -PyParser_SimpleParseString:int:start:: - -PyParser_SimpleParseStringFlags:struct _node*::: -PyParser_SimpleParseStringFlags:const char*:str:: -PyParser_SimpleParseStringFlags:int:start:: -PyParser_SimpleParseStringFlags:int:flags:: - -PyParser_SimpleParseStringFlagsFilename:struct _node*::: -PyParser_SimpleParseStringFlagsFilename:const char*:str:: -PyParser_SimpleParseStringFlagsFilename:const char*:filename:: -PyParser_SimpleParseStringFlagsFilename:int:start:: -PyParser_SimpleParseStringFlagsFilename:int:flags:: - PyRun_AnyFile:int::: PyRun_AnyFile:FILE*:fp:: PyRun_AnyFile:const char*:filename:: @@ -2447,9 +2427,6 @@ PyUnicode_AsUnicodeAndSize:Py_UNICODE*::: PyUnicode_AsUnicodeAndSize:PyObject*:unicode:0: PyUnicode_AsUnicodeAndSize:Py_ssize_t*:size:: -PyUnicode_AsUnicodeCopy:Py_UNICODE*::: -PyUnicode_AsUnicodeCopy:PyObject*:unicode:0: - PyUnicode_GetSize:Py_ssize_t::: PyUnicode_GetSize:PyObject*:unicode:0: @@ -3028,6 +3005,9 @@ Py_GetVersion:const char*::: Py_INCREF:void::: Py_INCREF:PyObject*:o:+1: +Py_NewRef:void::: +Py_NewRef:PyObject*:o:+1: + Py_Initialize:void::: Py_IsInitialized:int::: @@ -3049,6 +3029,9 @@ Py_XDECREF:PyObject*:o:-1:if o is not NULL Py_XINCREF:void::: Py_XINCREF:PyObject*:o:+1:if o is not NULL +Py_XNewRef:void::: +Py_XNewRef:PyObject*:o:+1:if o is not NULL + _PyImport_Fini:void::: _PyObject_New:PyObject*::+1: diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat new file mode 100644 index 00000000..ea102b98 --- /dev/null +++ b/Doc/data/stable_abi.dat @@ -0,0 +1,863 @@ +role,name,added,ifdef_note +function,PyAIter_Check,3.10, +function,PyArg_Parse,3.2, +function,PyArg_ParseTuple,3.2, +function,PyArg_ParseTupleAndKeywords,3.2, +function,PyArg_UnpackTuple,3.2, +function,PyArg_VaParse,3.2, +function,PyArg_VaParseTupleAndKeywords,3.2, +function,PyArg_ValidateKeywordArguments,3.2, +var,PyBaseObject_Type,3.2, +function,PyBool_FromLong,3.2, +var,PyBool_Type,3.2, +var,PyByteArrayIter_Type,3.2, +function,PyByteArray_AsString,3.2, +function,PyByteArray_Concat,3.2, +function,PyByteArray_FromObject,3.2, +function,PyByteArray_FromStringAndSize,3.2, +function,PyByteArray_Resize,3.2, +function,PyByteArray_Size,3.2, +var,PyByteArray_Type,3.2, +var,PyBytesIter_Type,3.2, +function,PyBytes_AsString,3.2, +function,PyBytes_AsStringAndSize,3.2, +function,PyBytes_Concat,3.2, +function,PyBytes_ConcatAndDel,3.2, +function,PyBytes_DecodeEscape,3.2, +function,PyBytes_FromFormat,3.2, +function,PyBytes_FromFormatV,3.2, +function,PyBytes_FromObject,3.2, +function,PyBytes_FromString,3.2, +function,PyBytes_FromStringAndSize,3.2, +function,PyBytes_Repr,3.2, +function,PyBytes_Size,3.2, +var,PyBytes_Type,3.2, +type,PyCFunction,3.2, +type,PyCFunctionWithKeywords,3.2, +function,PyCFunction_Call,3.2, +function,PyCFunction_GetFlags,3.2, +function,PyCFunction_GetFunction,3.2, +function,PyCFunction_GetSelf,3.2, +function,PyCFunction_New,3.4, +function,PyCFunction_NewEx,3.2, +var,PyCFunction_Type,3.2, +function,PyCMethod_New,3.9, +function,PyCallIter_New,3.2, +var,PyCallIter_Type,3.2, +function,PyCallable_Check,3.2, +type,PyCapsule_Destructor,3.2, +function,PyCapsule_GetContext,3.2, +function,PyCapsule_GetDestructor,3.2, +function,PyCapsule_GetName,3.2, +function,PyCapsule_GetPointer,3.2, +function,PyCapsule_Import,3.2, +function,PyCapsule_IsValid,3.2, +function,PyCapsule_New,3.2, +function,PyCapsule_SetContext,3.2, +function,PyCapsule_SetDestructor,3.2, +function,PyCapsule_SetName,3.2, +function,PyCapsule_SetPointer,3.2, +var,PyCapsule_Type,3.2, +var,PyClassMethodDescr_Type,3.2, +function,PyCodec_BackslashReplaceErrors,3.2, +function,PyCodec_Decode,3.2, +function,PyCodec_Decoder,3.2, +function,PyCodec_Encode,3.2, +function,PyCodec_Encoder,3.2, +function,PyCodec_IgnoreErrors,3.2, +function,PyCodec_IncrementalDecoder,3.2, +function,PyCodec_IncrementalEncoder,3.2, +function,PyCodec_KnownEncoding,3.2, +function,PyCodec_LookupError,3.2, +function,PyCodec_NameReplaceErrors,3.7, +function,PyCodec_Register,3.2, +function,PyCodec_RegisterError,3.2, +function,PyCodec_ReplaceErrors,3.2, +function,PyCodec_StreamReader,3.2, +function,PyCodec_StreamWriter,3.2, +function,PyCodec_StrictErrors,3.2, +function,PyCodec_Unregister,3.10, +function,PyCodec_XMLCharRefReplaceErrors,3.2, +function,PyComplex_FromDoubles,3.2, +function,PyComplex_ImagAsDouble,3.2, +function,PyComplex_RealAsDouble,3.2, +var,PyComplex_Type,3.2, +function,PyDescr_NewClassMethod,3.2, +function,PyDescr_NewGetSet,3.2, +function,PyDescr_NewMember,3.2, +function,PyDescr_NewMethod,3.2, +var,PyDictItems_Type,3.2, +var,PyDictIterItem_Type,3.2, +var,PyDictIterKey_Type,3.2, +var,PyDictIterValue_Type,3.2, +var,PyDictKeys_Type,3.2, +function,PyDictProxy_New,3.2, +var,PyDictProxy_Type,3.2, +var,PyDictRevIterItem_Type,3.8, +var,PyDictRevIterKey_Type,3.8, +var,PyDictRevIterValue_Type,3.8, +var,PyDictValues_Type,3.2, +function,PyDict_Clear,3.2, +function,PyDict_Contains,3.2, +function,PyDict_Copy,3.2, +function,PyDict_DelItem,3.2, +function,PyDict_DelItemString,3.2, +function,PyDict_GetItem,3.2, +function,PyDict_GetItemString,3.2, +function,PyDict_GetItemWithError,3.2, +function,PyDict_Items,3.2, +function,PyDict_Keys,3.2, +function,PyDict_Merge,3.2, +function,PyDict_MergeFromSeq2,3.2, +function,PyDict_New,3.2, +function,PyDict_Next,3.2, +function,PyDict_SetItem,3.2, +function,PyDict_SetItemString,3.2, +function,PyDict_Size,3.2, +var,PyDict_Type,3.2, +function,PyDict_Update,3.2, +function,PyDict_Values,3.2, +var,PyEllipsis_Type,3.2, +var,PyEnum_Type,3.2, +function,PyErr_BadArgument,3.2, +function,PyErr_BadInternalCall,3.2, +function,PyErr_CheckSignals,3.2, +function,PyErr_Clear,3.2, +function,PyErr_Display,3.2, +function,PyErr_ExceptionMatches,3.2, +function,PyErr_Fetch,3.2, +function,PyErr_Format,3.2, +function,PyErr_FormatV,3.5, +function,PyErr_GetExcInfo,3.7, +function,PyErr_GivenExceptionMatches,3.2, +function,PyErr_NewException,3.2, +function,PyErr_NewExceptionWithDoc,3.2, +function,PyErr_NoMemory,3.2, +function,PyErr_NormalizeException,3.2, +function,PyErr_Occurred,3.2, +function,PyErr_Print,3.2, +function,PyErr_PrintEx,3.2, +function,PyErr_ProgramText,3.2, +function,PyErr_ResourceWarning,3.6, +function,PyErr_Restore,3.2, +function,PyErr_SetExcFromWindowsErr,3.7,on Windows +function,PyErr_SetExcFromWindowsErrWithFilename,3.7,on Windows +function,PyErr_SetExcFromWindowsErrWithFilenameObject,3.7,on Windows +function,PyErr_SetExcFromWindowsErrWithFilenameObjects,3.7,on Windows +function,PyErr_SetExcInfo,3.7, +function,PyErr_SetFromErrno,3.2, +function,PyErr_SetFromErrnoWithFilename,3.2, +function,PyErr_SetFromErrnoWithFilenameObject,3.2, +function,PyErr_SetFromErrnoWithFilenameObjects,3.7, +function,PyErr_SetFromWindowsErr,3.7,on Windows +function,PyErr_SetFromWindowsErrWithFilename,3.7,on Windows +function,PyErr_SetImportError,3.7, +function,PyErr_SetImportErrorSubclass,3.6, +function,PyErr_SetInterrupt,3.2, +function,PyErr_SetInterruptEx,3.10, +function,PyErr_SetNone,3.2, +function,PyErr_SetObject,3.2, +function,PyErr_SetString,3.2, +function,PyErr_SyntaxLocation,3.2, +function,PyErr_SyntaxLocationEx,3.7, +function,PyErr_WarnEx,3.2, +function,PyErr_WarnExplicit,3.2, +function,PyErr_WarnFormat,3.2, +function,PyErr_WriteUnraisable,3.2, +function,PyEval_AcquireLock,3.2, +function,PyEval_AcquireThread,3.2, +function,PyEval_CallFunction,3.2, +function,PyEval_CallMethod,3.2, +function,PyEval_CallObjectWithKeywords,3.2, +function,PyEval_EvalCode,3.2, +function,PyEval_EvalCodeEx,3.2, +function,PyEval_EvalFrame,3.2, +function,PyEval_EvalFrameEx,3.2, +function,PyEval_GetBuiltins,3.2, +function,PyEval_GetFrame,3.2, +function,PyEval_GetFuncDesc,3.2, +function,PyEval_GetFuncName,3.2, +function,PyEval_GetGlobals,3.2, +function,PyEval_GetLocals,3.2, +function,PyEval_InitThreads,3.2, +function,PyEval_ReleaseLock,3.2, +function,PyEval_ReleaseThread,3.2, +function,PyEval_RestoreThread,3.2, +function,PyEval_SaveThread,3.2, +function,PyEval_ThreadsInitialized,3.2, +var,PyExc_ArithmeticError,3.2, +var,PyExc_AssertionError,3.2, +var,PyExc_AttributeError,3.2, +var,PyExc_BaseException,3.2, +var,PyExc_BlockingIOError,3.7, +var,PyExc_BrokenPipeError,3.7, +var,PyExc_BufferError,3.2, +var,PyExc_BytesWarning,3.2, +var,PyExc_ChildProcessError,3.7, +var,PyExc_ConnectionAbortedError,3.7, +var,PyExc_ConnectionError,3.7, +var,PyExc_ConnectionRefusedError,3.7, +var,PyExc_ConnectionResetError,3.7, +var,PyExc_DeprecationWarning,3.2, +var,PyExc_EOFError,3.2, +var,PyExc_EncodingWarning,3.10, +var,PyExc_EnvironmentError,3.2, +var,PyExc_Exception,3.2, +var,PyExc_FileExistsError,3.7, +var,PyExc_FileNotFoundError,3.7, +var,PyExc_FloatingPointError,3.2, +var,PyExc_FutureWarning,3.2, +var,PyExc_GeneratorExit,3.2, +var,PyExc_IOError,3.2, +var,PyExc_ImportError,3.2, +var,PyExc_ImportWarning,3.2, +var,PyExc_IndentationError,3.2, +var,PyExc_IndexError,3.2, +var,PyExc_InterruptedError,3.7, +var,PyExc_IsADirectoryError,3.7, +var,PyExc_KeyError,3.2, +var,PyExc_KeyboardInterrupt,3.2, +var,PyExc_LookupError,3.2, +var,PyExc_MemoryError,3.2, +var,PyExc_ModuleNotFoundError,3.6, +var,PyExc_NameError,3.2, +var,PyExc_NotADirectoryError,3.7, +var,PyExc_NotImplementedError,3.2, +var,PyExc_OSError,3.2, +var,PyExc_OverflowError,3.2, +var,PyExc_PendingDeprecationWarning,3.2, +var,PyExc_PermissionError,3.7, +var,PyExc_ProcessLookupError,3.7, +var,PyExc_RecursionError,3.7, +var,PyExc_ReferenceError,3.2, +var,PyExc_ResourceWarning,3.7, +var,PyExc_RuntimeError,3.2, +var,PyExc_RuntimeWarning,3.2, +var,PyExc_StopAsyncIteration,3.7, +var,PyExc_StopIteration,3.2, +var,PyExc_SyntaxError,3.2, +var,PyExc_SyntaxWarning,3.2, +var,PyExc_SystemError,3.2, +var,PyExc_SystemExit,3.2, +var,PyExc_TabError,3.2, +var,PyExc_TimeoutError,3.7, +var,PyExc_TypeError,3.2, +var,PyExc_UnboundLocalError,3.2, +var,PyExc_UnicodeDecodeError,3.2, +var,PyExc_UnicodeEncodeError,3.2, +var,PyExc_UnicodeError,3.2, +var,PyExc_UnicodeTranslateError,3.2, +var,PyExc_UnicodeWarning,3.2, +var,PyExc_UserWarning,3.2, +var,PyExc_ValueError,3.2, +var,PyExc_Warning,3.2, +var,PyExc_WindowsError,3.7,on Windows +var,PyExc_ZeroDivisionError,3.2, +function,PyExceptionClass_Name,3.8, +function,PyException_GetCause,3.2, +function,PyException_GetContext,3.2, +function,PyException_GetTraceback,3.2, +function,PyException_SetCause,3.2, +function,PyException_SetContext,3.2, +function,PyException_SetTraceback,3.2, +function,PyFile_FromFd,3.2, +function,PyFile_GetLine,3.2, +function,PyFile_WriteObject,3.2, +function,PyFile_WriteString,3.2, +var,PyFilter_Type,3.2, +function,PyFloat_AsDouble,3.2, +function,PyFloat_FromDouble,3.2, +function,PyFloat_FromString,3.2, +function,PyFloat_GetInfo,3.2, +function,PyFloat_GetMax,3.2, +function,PyFloat_GetMin,3.2, +var,PyFloat_Type,3.2, +type,PyFrameObject,3.2, +function,PyFrame_GetCode,3.10, +function,PyFrame_GetLineNumber,3.10, +function,PyFrozenSet_New,3.2, +var,PyFrozenSet_Type,3.2, +function,PyGC_Collect,3.2, +function,PyGC_Disable,3.10, +function,PyGC_Enable,3.10, +function,PyGC_IsEnabled,3.10, +function,PyGILState_Ensure,3.2, +function,PyGILState_GetThisThreadState,3.2, +function,PyGILState_Release,3.2, +type,PyGILState_STATE,3.2, +type,PyGetSetDef,3.2, +var,PyGetSetDescr_Type,3.2, +function,PyImport_AddModule,3.2, +function,PyImport_AddModuleObject,3.7, +function,PyImport_AppendInittab,3.2, +function,PyImport_ExecCodeModule,3.2, +function,PyImport_ExecCodeModuleEx,3.2, +function,PyImport_ExecCodeModuleObject,3.7, +function,PyImport_ExecCodeModuleWithPathnames,3.2, +function,PyImport_GetImporter,3.2, +function,PyImport_GetMagicNumber,3.2, +function,PyImport_GetMagicTag,3.2, +function,PyImport_GetModule,3.8, +function,PyImport_GetModuleDict,3.2, +function,PyImport_Import,3.2, +function,PyImport_ImportFrozenModule,3.2, +function,PyImport_ImportFrozenModuleObject,3.7, +function,PyImport_ImportModule,3.2, +function,PyImport_ImportModuleLevel,3.2, +function,PyImport_ImportModuleLevelObject,3.7, +function,PyImport_ImportModuleNoBlock,3.2, +function,PyImport_ReloadModule,3.2, +function,PyIndex_Check,3.8, +type,PyInterpreterState,3.2, +function,PyInterpreterState_Clear,3.2, +function,PyInterpreterState_Delete,3.2, +function,PyInterpreterState_Get,3.9, +function,PyInterpreterState_GetDict,3.8, +function,PyInterpreterState_GetID,3.7, +function,PyInterpreterState_New,3.2, +function,PyIter_Check,3.8, +function,PyIter_Next,3.2, +function,PyIter_Send,3.10, +var,PyListIter_Type,3.2, +var,PyListRevIter_Type,3.2, +function,PyList_Append,3.2, +function,PyList_AsTuple,3.2, +function,PyList_GetItem,3.2, +function,PyList_GetSlice,3.2, +function,PyList_Insert,3.2, +function,PyList_New,3.2, +function,PyList_Reverse,3.2, +function,PyList_SetItem,3.2, +function,PyList_SetSlice,3.2, +function,PyList_Size,3.2, +function,PyList_Sort,3.2, +var,PyList_Type,3.2, +type,PyLongObject,3.2, +var,PyLongRangeIter_Type,3.2, +function,PyLong_AsDouble,3.2, +function,PyLong_AsLong,3.2, +function,PyLong_AsLongAndOverflow,3.2, +function,PyLong_AsLongLong,3.2, +function,PyLong_AsLongLongAndOverflow,3.2, +function,PyLong_AsSize_t,3.2, +function,PyLong_AsSsize_t,3.2, +function,PyLong_AsUnsignedLong,3.2, +function,PyLong_AsUnsignedLongLong,3.2, +function,PyLong_AsUnsignedLongLongMask,3.2, +function,PyLong_AsUnsignedLongMask,3.2, +function,PyLong_AsVoidPtr,3.2, +function,PyLong_FromDouble,3.2, +function,PyLong_FromLong,3.2, +function,PyLong_FromLongLong,3.2, +function,PyLong_FromSize_t,3.2, +function,PyLong_FromSsize_t,3.2, +function,PyLong_FromString,3.2, +function,PyLong_FromUnsignedLong,3.2, +function,PyLong_FromUnsignedLongLong,3.2, +function,PyLong_FromVoidPtr,3.2, +function,PyLong_GetInfo,3.2, +var,PyLong_Type,3.2, +var,PyMap_Type,3.2, +function,PyMapping_Check,3.2, +function,PyMapping_GetItemString,3.2, +function,PyMapping_HasKey,3.2, +function,PyMapping_HasKeyString,3.2, +function,PyMapping_Items,3.2, +function,PyMapping_Keys,3.2, +function,PyMapping_Length,3.2, +function,PyMapping_SetItemString,3.2, +function,PyMapping_Size,3.2, +function,PyMapping_Values,3.2, +function,PyMem_Calloc,3.7, +function,PyMem_Free,3.2, +function,PyMem_Malloc,3.2, +function,PyMem_Realloc,3.2, +type,PyMemberDef,3.2, +var,PyMemberDescr_Type,3.2, +function,PyMemoryView_FromMemory,3.7, +function,PyMemoryView_FromObject,3.2, +function,PyMemoryView_GetContiguous,3.2, +var,PyMemoryView_Type,3.2, +type,PyMethodDef,3.2, +var,PyMethodDescr_Type,3.2, +type,PyModuleDef,3.2, +type,PyModuleDef_Base,3.2, +function,PyModuleDef_Init,3.5, +var,PyModuleDef_Type,3.5, +function,PyModule_AddFunctions,3.7, +function,PyModule_AddIntConstant,3.2, +function,PyModule_AddObject,3.2, +function,PyModule_AddObjectRef,3.10, +function,PyModule_AddStringConstant,3.2, +function,PyModule_AddType,3.10, +function,PyModule_Create2,3.2, +function,PyModule_ExecDef,3.7, +function,PyModule_FromDefAndSpec2,3.7, +function,PyModule_GetDef,3.2, +function,PyModule_GetDict,3.2, +function,PyModule_GetFilename,3.2, +function,PyModule_GetFilenameObject,3.2, +function,PyModule_GetName,3.2, +function,PyModule_GetNameObject,3.7, +function,PyModule_GetState,3.2, +function,PyModule_New,3.2, +function,PyModule_NewObject,3.7, +function,PyModule_SetDocString,3.7, +var,PyModule_Type,3.2, +function,PyNumber_Absolute,3.2, +function,PyNumber_Add,3.2, +function,PyNumber_And,3.2, +function,PyNumber_AsSsize_t,3.2, +function,PyNumber_Check,3.2, +function,PyNumber_Divmod,3.2, +function,PyNumber_Float,3.2, +function,PyNumber_FloorDivide,3.2, +function,PyNumber_InPlaceAdd,3.2, +function,PyNumber_InPlaceAnd,3.2, +function,PyNumber_InPlaceFloorDivide,3.2, +function,PyNumber_InPlaceLshift,3.2, +function,PyNumber_InPlaceMatrixMultiply,3.7, +function,PyNumber_InPlaceMultiply,3.2, +function,PyNumber_InPlaceOr,3.2, +function,PyNumber_InPlacePower,3.2, +function,PyNumber_InPlaceRemainder,3.2, +function,PyNumber_InPlaceRshift,3.2, +function,PyNumber_InPlaceSubtract,3.2, +function,PyNumber_InPlaceTrueDivide,3.2, +function,PyNumber_InPlaceXor,3.2, +function,PyNumber_Index,3.2, +function,PyNumber_Invert,3.2, +function,PyNumber_Long,3.2, +function,PyNumber_Lshift,3.2, +function,PyNumber_MatrixMultiply,3.7, +function,PyNumber_Multiply,3.2, +function,PyNumber_Negative,3.2, +function,PyNumber_Or,3.2, +function,PyNumber_Positive,3.2, +function,PyNumber_Power,3.2, +function,PyNumber_Remainder,3.2, +function,PyNumber_Rshift,3.2, +function,PyNumber_Subtract,3.2, +function,PyNumber_ToBase,3.2, +function,PyNumber_TrueDivide,3.2, +function,PyNumber_Xor,3.2, +function,PyOS_AfterFork,3.2,on platforms with fork() +function,PyOS_AfterFork_Child,3.7,on platforms with fork() +function,PyOS_AfterFork_Parent,3.7,on platforms with fork() +function,PyOS_BeforeFork,3.7,on platforms with fork() +function,PyOS_CheckStack,3.7,on platforms with USE_STACKCHECK +function,PyOS_FSPath,3.6, +var,PyOS_InputHook,3.2, +function,PyOS_InterruptOccurred,3.2, +function,PyOS_double_to_string,3.2, +function,PyOS_getsig,3.2, +function,PyOS_mystricmp,3.2, +function,PyOS_mystrnicmp,3.2, +function,PyOS_setsig,3.2, +type,PyOS_sighandler_t,3.2, +function,PyOS_snprintf,3.2, +function,PyOS_string_to_double,3.2, +function,PyOS_strtol,3.2, +function,PyOS_strtoul,3.2, +function,PyOS_vsnprintf,3.2, +type,PyObject,3.2, +function,PyObject_ASCII,3.2, +function,PyObject_AsCharBuffer,3.2, +function,PyObject_AsFileDescriptor,3.2, +function,PyObject_AsReadBuffer,3.2, +function,PyObject_AsWriteBuffer,3.2, +function,PyObject_Bytes,3.2, +function,PyObject_Call,3.2, +function,PyObject_CallFunction,3.2, +function,PyObject_CallFunctionObjArgs,3.2, +function,PyObject_CallMethod,3.2, +function,PyObject_CallMethodObjArgs,3.2, +function,PyObject_CallNoArgs,3.10, +function,PyObject_CallObject,3.2, +function,PyObject_Calloc,3.7, +function,PyObject_CheckReadBuffer,3.2, +function,PyObject_ClearWeakRefs,3.2, +function,PyObject_DelItem,3.2, +function,PyObject_DelItemString,3.2, +function,PyObject_Dir,3.2, +function,PyObject_Format,3.2, +function,PyObject_Free,3.2, +function,PyObject_GC_Del,3.2, +function,PyObject_GC_IsFinalized,3.9, +function,PyObject_GC_IsTracked,3.9, +function,PyObject_GC_Track,3.2, +function,PyObject_GC_UnTrack,3.2, +function,PyObject_GenericGetAttr,3.2, +function,PyObject_GenericGetDict,3.10, +function,PyObject_GenericSetAttr,3.2, +function,PyObject_GenericSetDict,3.7, +function,PyObject_GetAIter,3.10, +function,PyObject_GetAttr,3.2, +function,PyObject_GetAttrString,3.2, +function,PyObject_GetItem,3.2, +function,PyObject_GetIter,3.2, +function,PyObject_HasAttr,3.2, +function,PyObject_HasAttrString,3.2, +function,PyObject_Hash,3.2, +function,PyObject_HashNotImplemented,3.2, +function,PyObject_Init,3.2, +function,PyObject_InitVar,3.2, +function,PyObject_IsInstance,3.2, +function,PyObject_IsSubclass,3.2, +function,PyObject_IsTrue,3.2, +function,PyObject_Length,3.2, +function,PyObject_Malloc,3.2, +function,PyObject_Not,3.2, +function,PyObject_Realloc,3.2, +function,PyObject_Repr,3.2, +function,PyObject_RichCompare,3.2, +function,PyObject_RichCompareBool,3.2, +function,PyObject_SelfIter,3.2, +function,PyObject_SetAttr,3.2, +function,PyObject_SetAttrString,3.2, +function,PyObject_SetItem,3.2, +function,PyObject_Size,3.2, +function,PyObject_Str,3.2, +function,PyObject_Type,3.2, +var,PyProperty_Type,3.2, +var,PyRangeIter_Type,3.2, +var,PyRange_Type,3.2, +var,PyReversed_Type,3.2, +function,PySeqIter_New,3.2, +var,PySeqIter_Type,3.2, +function,PySequence_Check,3.2, +function,PySequence_Concat,3.2, +function,PySequence_Contains,3.2, +function,PySequence_Count,3.2, +function,PySequence_DelItem,3.2, +function,PySequence_DelSlice,3.2, +function,PySequence_Fast,3.2, +function,PySequence_GetItem,3.2, +function,PySequence_GetSlice,3.2, +function,PySequence_In,3.2, +function,PySequence_InPlaceConcat,3.2, +function,PySequence_InPlaceRepeat,3.2, +function,PySequence_Index,3.2, +function,PySequence_Length,3.2, +function,PySequence_List,3.2, +function,PySequence_Repeat,3.2, +function,PySequence_SetItem,3.2, +function,PySequence_SetSlice,3.2, +function,PySequence_Size,3.2, +function,PySequence_Tuple,3.2, +var,PySetIter_Type,3.2, +function,PySet_Add,3.2, +function,PySet_Clear,3.2, +function,PySet_Contains,3.2, +function,PySet_Discard,3.2, +function,PySet_New,3.2, +function,PySet_Pop,3.2, +function,PySet_Size,3.2, +var,PySet_Type,3.2, +function,PySlice_AdjustIndices,3.7, +function,PySlice_GetIndices,3.2, +function,PySlice_GetIndicesEx,3.2, +function,PySlice_New,3.2, +var,PySlice_Type,3.2, +function,PySlice_Unpack,3.7, +function,PyState_AddModule,3.3, +function,PyState_FindModule,3.2, +function,PyState_RemoveModule,3.3, +type,PyStructSequence_Desc,3.2, +type,PyStructSequence_Field,3.2, +function,PyStructSequence_GetItem,3.2, +function,PyStructSequence_New,3.2, +function,PyStructSequence_NewType,3.2, +function,PyStructSequence_SetItem,3.2, +var,PySuper_Type,3.2, +function,PySys_AddWarnOption,3.2, +function,PySys_AddWarnOptionUnicode,3.2, +function,PySys_AddXOption,3.7, +function,PySys_FormatStderr,3.2, +function,PySys_FormatStdout,3.2, +function,PySys_GetObject,3.2, +function,PySys_GetXOptions,3.7, +function,PySys_HasWarnOptions,3.2, +function,PySys_ResetWarnOptions,3.2, +function,PySys_SetArgv,3.2, +function,PySys_SetArgvEx,3.2, +function,PySys_SetObject,3.2, +function,PySys_SetPath,3.2, +function,PySys_WriteStderr,3.2, +function,PySys_WriteStdout,3.2, +type,PyThreadState,3.2, +function,PyThreadState_Clear,3.2, +function,PyThreadState_Delete,3.2, +function,PyThreadState_Get,3.2, +function,PyThreadState_GetDict,3.2, +function,PyThreadState_GetFrame,3.10, +function,PyThreadState_GetID,3.10, +function,PyThreadState_GetInterpreter,3.10, +function,PyThreadState_New,3.2, +function,PyThreadState_SetAsyncExc,3.2, +function,PyThreadState_Swap,3.2, +function,PyThread_GetInfo,3.3, +function,PyThread_ReInitTLS,3.2, +function,PyThread_acquire_lock,3.2, +function,PyThread_acquire_lock_timed,3.2, +function,PyThread_allocate_lock,3.2, +function,PyThread_create_key,3.2, +function,PyThread_delete_key,3.2, +function,PyThread_delete_key_value,3.2, +function,PyThread_exit_thread,3.2, +function,PyThread_free_lock,3.2, +function,PyThread_get_key_value,3.2, +function,PyThread_get_stacksize,3.2, +function,PyThread_get_thread_ident,3.2, +function,PyThread_get_thread_native_id,3.2, +function,PyThread_init_thread,3.2, +function,PyThread_release_lock,3.2, +function,PyThread_set_key_value,3.2, +function,PyThread_set_stacksize,3.2, +function,PyThread_start_new_thread,3.2, +function,PyThread_tss_alloc,3.7, +function,PyThread_tss_create,3.7, +function,PyThread_tss_delete,3.7, +function,PyThread_tss_free,3.7, +function,PyThread_tss_get,3.7, +function,PyThread_tss_is_created,3.7, +function,PyThread_tss_set,3.7, +function,PyTraceBack_Here,3.2, +function,PyTraceBack_Print,3.2, +var,PyTraceBack_Type,3.2, +var,PyTupleIter_Type,3.2, +function,PyTuple_GetItem,3.2, +function,PyTuple_GetSlice,3.2, +function,PyTuple_New,3.2, +function,PyTuple_Pack,3.2, +function,PyTuple_SetItem,3.2, +function,PyTuple_Size,3.2, +var,PyTuple_Type,3.2, +type,PyTypeObject,3.2, +function,PyType_ClearCache,3.2, +function,PyType_FromModuleAndSpec,3.10, +function,PyType_FromSpec,3.2, +function,PyType_FromSpecWithBases,3.3, +function,PyType_GenericAlloc,3.2, +function,PyType_GenericNew,3.2, +function,PyType_GetFlags,3.2, +function,PyType_GetModule,3.10, +function,PyType_GetModuleState,3.10, +function,PyType_GetSlot,3.4, +function,PyType_IsSubtype,3.2, +function,PyType_Modified,3.2, +function,PyType_Ready,3.2, +type,PyType_Slot,3.2, +type,PyType_Spec,3.2, +var,PyType_Type,3.2, +function,PyUnicodeDecodeError_Create,3.2, +function,PyUnicodeDecodeError_GetEncoding,3.2, +function,PyUnicodeDecodeError_GetEnd,3.2, +function,PyUnicodeDecodeError_GetObject,3.2, +function,PyUnicodeDecodeError_GetReason,3.2, +function,PyUnicodeDecodeError_GetStart,3.2, +function,PyUnicodeDecodeError_SetEnd,3.2, +function,PyUnicodeDecodeError_SetReason,3.2, +function,PyUnicodeDecodeError_SetStart,3.2, +function,PyUnicodeEncodeError_GetEncoding,3.2, +function,PyUnicodeEncodeError_GetEnd,3.2, +function,PyUnicodeEncodeError_GetObject,3.2, +function,PyUnicodeEncodeError_GetReason,3.2, +function,PyUnicodeEncodeError_GetStart,3.2, +function,PyUnicodeEncodeError_SetEnd,3.2, +function,PyUnicodeEncodeError_SetReason,3.2, +function,PyUnicodeEncodeError_SetStart,3.2, +var,PyUnicodeIter_Type,3.2, +function,PyUnicodeTranslateError_GetEnd,3.2, +function,PyUnicodeTranslateError_GetObject,3.2, +function,PyUnicodeTranslateError_GetReason,3.2, +function,PyUnicodeTranslateError_GetStart,3.2, +function,PyUnicodeTranslateError_SetEnd,3.2, +function,PyUnicodeTranslateError_SetReason,3.2, +function,PyUnicodeTranslateError_SetStart,3.2, +function,PyUnicode_Append,3.2, +function,PyUnicode_AppendAndDel,3.2, +function,PyUnicode_AsASCIIString,3.2, +function,PyUnicode_AsCharmapString,3.2, +function,PyUnicode_AsDecodedObject,3.2, +function,PyUnicode_AsDecodedUnicode,3.2, +function,PyUnicode_AsEncodedObject,3.2, +function,PyUnicode_AsEncodedString,3.2, +function,PyUnicode_AsEncodedUnicode,3.2, +function,PyUnicode_AsLatin1String,3.2, +function,PyUnicode_AsMBCSString,3.7,on Windows +function,PyUnicode_AsRawUnicodeEscapeString,3.2, +function,PyUnicode_AsUCS4,3.7, +function,PyUnicode_AsUCS4Copy,3.7, +function,PyUnicode_AsUTF16String,3.2, +function,PyUnicode_AsUTF32String,3.2, +function,PyUnicode_AsUTF8AndSize,3.10, +function,PyUnicode_AsUTF8String,3.2, +function,PyUnicode_AsUnicodeEscapeString,3.2, +function,PyUnicode_AsWideChar,3.2, +function,PyUnicode_AsWideCharString,3.7, +function,PyUnicode_BuildEncodingMap,3.2, +function,PyUnicode_Compare,3.2, +function,PyUnicode_CompareWithASCIIString,3.2, +function,PyUnicode_Concat,3.2, +function,PyUnicode_Contains,3.2, +function,PyUnicode_Count,3.2, +function,PyUnicode_Decode,3.2, +function,PyUnicode_DecodeASCII,3.2, +function,PyUnicode_DecodeCharmap,3.2, +function,PyUnicode_DecodeCodePageStateful,3.7,on Windows +function,PyUnicode_DecodeFSDefault,3.2, +function,PyUnicode_DecodeFSDefaultAndSize,3.2, +function,PyUnicode_DecodeLatin1,3.2, +function,PyUnicode_DecodeLocale,3.7, +function,PyUnicode_DecodeLocaleAndSize,3.7, +function,PyUnicode_DecodeMBCS,3.7,on Windows +function,PyUnicode_DecodeMBCSStateful,3.7,on Windows +function,PyUnicode_DecodeRawUnicodeEscape,3.2, +function,PyUnicode_DecodeUTF16,3.2, +function,PyUnicode_DecodeUTF16Stateful,3.2, +function,PyUnicode_DecodeUTF32,3.2, +function,PyUnicode_DecodeUTF32Stateful,3.2, +function,PyUnicode_DecodeUTF7,3.2, +function,PyUnicode_DecodeUTF7Stateful,3.2, +function,PyUnicode_DecodeUTF8,3.2, +function,PyUnicode_DecodeUTF8Stateful,3.2, +function,PyUnicode_DecodeUnicodeEscape,3.2, +function,PyUnicode_EncodeCodePage,3.7,on Windows +function,PyUnicode_EncodeFSDefault,3.2, +function,PyUnicode_EncodeLocale,3.7, +function,PyUnicode_FSConverter,3.2, +function,PyUnicode_FSDecoder,3.2, +function,PyUnicode_Find,3.2, +function,PyUnicode_FindChar,3.7, +function,PyUnicode_Format,3.2, +function,PyUnicode_FromEncodedObject,3.2, +function,PyUnicode_FromFormat,3.2, +function,PyUnicode_FromFormatV,3.2, +function,PyUnicode_FromObject,3.2, +function,PyUnicode_FromOrdinal,3.2, +function,PyUnicode_FromString,3.2, +function,PyUnicode_FromStringAndSize,3.2, +function,PyUnicode_FromWideChar,3.2, +function,PyUnicode_GetDefaultEncoding,3.2, +function,PyUnicode_GetLength,3.7, +function,PyUnicode_GetSize,3.2, +function,PyUnicode_InternFromString,3.2, +function,PyUnicode_InternImmortal,3.2, +function,PyUnicode_InternInPlace,3.2, +function,PyUnicode_IsIdentifier,3.2, +function,PyUnicode_Join,3.2, +function,PyUnicode_Partition,3.2, +function,PyUnicode_RPartition,3.2, +function,PyUnicode_RSplit,3.2, +function,PyUnicode_ReadChar,3.7, +function,PyUnicode_Replace,3.2, +function,PyUnicode_Resize,3.2, +function,PyUnicode_RichCompare,3.2, +function,PyUnicode_Split,3.2, +function,PyUnicode_Splitlines,3.2, +function,PyUnicode_Substring,3.7, +function,PyUnicode_Tailmatch,3.2, +function,PyUnicode_Translate,3.2, +var,PyUnicode_Type,3.2, +function,PyUnicode_WriteChar,3.7, +type,PyVarObject,3.2, +type,PyWeakReference,3.2, +function,PyWeakref_GetObject,3.2, +function,PyWeakref_NewProxy,3.2, +function,PyWeakref_NewRef,3.2, +var,PyWrapperDescr_Type,3.2, +function,PyWrapper_New,3.2, +var,PyZip_Type,3.2, +function,Py_AddPendingCall,3.2, +function,Py_AtExit,3.2, +macro,Py_BEGIN_ALLOW_THREADS,3.2, +macro,Py_BLOCK_THREADS,3.2, +function,Py_BuildValue,3.2, +function,Py_BytesMain,3.8, +function,Py_CompileString,3.2, +function,Py_DecRef,3.2, +function,Py_DecodeLocale,3.7, +macro,Py_END_ALLOW_THREADS,3.2, +function,Py_EncodeLocale,3.7, +function,Py_EndInterpreter,3.2, +function,Py_EnterRecursiveCall,3.9, +function,Py_Exit,3.2, +function,Py_FatalError,3.2, +var,Py_FileSystemDefaultEncodeErrors,3.10, +var,Py_FileSystemDefaultEncoding,3.2, +function,Py_Finalize,3.2, +function,Py_FinalizeEx,3.6, +function,Py_GenericAlias,3.9, +var,Py_GenericAliasType,3.9, +function,Py_GetBuildInfo,3.2, +function,Py_GetCompiler,3.2, +function,Py_GetCopyright,3.2, +function,Py_GetExecPrefix,3.2, +function,Py_GetPath,3.2, +function,Py_GetPlatform,3.2, +function,Py_GetPrefix,3.2, +function,Py_GetProgramFullPath,3.2, +function,Py_GetProgramName,3.2, +function,Py_GetPythonHome,3.2, +function,Py_GetRecursionLimit,3.2, +function,Py_GetVersion,3.2, +var,Py_HasFileSystemDefaultEncoding,3.2, +function,Py_IncRef,3.2, +function,Py_Initialize,3.2, +function,Py_InitializeEx,3.2, +function,Py_Is,3.10, +function,Py_IsFalse,3.10, +function,Py_IsInitialized,3.2, +function,Py_IsNone,3.10, +function,Py_IsTrue,3.10, +function,Py_LeaveRecursiveCall,3.9, +function,Py_Main,3.2, +function,Py_MakePendingCalls,3.2, +function,Py_NewInterpreter,3.2, +function,Py_NewRef,3.10, +function,Py_ReprEnter,3.2, +function,Py_ReprLeave,3.2, +function,Py_SetPath,3.7, +function,Py_SetProgramName,3.2, +function,Py_SetPythonHome,3.2, +function,Py_SetRecursionLimit,3.2, +type,Py_UCS4,3.2, +macro,Py_UNBLOCK_THREADS,3.2, +var,Py_UTF8Mode,3.8, +function,Py_VaBuildValue,3.2, +function,Py_XNewRef,3.10, +type,Py_intptr_t,3.2, +type,Py_ssize_t,3.2, +type,Py_uintptr_t,3.2, +type,allocfunc,3.2, +type,binaryfunc,3.2, +type,descrgetfunc,3.2, +type,descrsetfunc,3.2, +type,destructor,3.2, +type,getattrfunc,3.2, +type,getattrofunc,3.2, +type,getiterfunc,3.2, +type,getter,3.2, +type,hashfunc,3.2, +type,initproc,3.2, +type,inquiry,3.2, +type,iternextfunc,3.2, +type,lenfunc,3.2, +type,newfunc,3.2, +type,objobjargproc,3.2, +type,objobjproc,3.2, +type,reprfunc,3.2, +type,richcmpfunc,3.2, +type,setattrfunc,3.2, +type,setattrofunc,3.2, +type,setter,3.2, +type,ssizeargfunc,3.2, +type,ssizeobjargproc,3.2, +type,ssizessizeargfunc,3.2, +type,ssizessizeobjargproc,3.2, +type,symtable,3.2, +type,ternaryfunc,3.2, +type,traverseproc,3.2, +type,unaryfunc,3.2, +type,visitproc,3.2, diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index fadce738..3291303c 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1452,6 +1452,8 @@ name. .. module:: distutils.sysconfig :synopsis: Low-level access to configuration information of the Python interpreter. +.. deprecated:: 3.10 + :mod:`distutils.sysconfig` has been merged into :mod:`sysconfig`. .. moduleauthor:: Fred L. Drake, Jr. .. moduleauthor:: Greg Ward .. sectionauthor:: Fred L. Drake, Jr. @@ -1510,6 +1512,9 @@ for other parts of the :mod:`distutils` package. meaning for other platforms will vary. The file is a platform-specific text file, if it exists. This function is only useful on POSIX platforms. +The following functions are deprecated together with this module and they +have no direct replacement. + .. function:: get_python_inc([plat_specific[, prefix]]) @@ -1862,11 +1867,6 @@ Subclasses of :class:`Command` must define the following methods. .. _Windows Installer: https://msdn.microsoft.com/en-us/library/cc185688(VS.85).aspx - In most cases, the ``bdist_msi`` installer is a better choice than the - ``bdist_wininst`` installer, because it provides better support for - Win64 platforms, allows administrators to perform non-interactive - installations, and allows installation through group policies. - :mod:`distutils.command.bdist_rpm` --- Build a binary distribution as a Redhat RPM and SRPM =========================================================================================== @@ -1878,19 +1878,6 @@ Subclasses of :class:`Command` must define the following methods. .. % todo -:mod:`distutils.command.bdist_wininst` --- Build a Windows installer -==================================================================== - -.. module:: distutils.command.bdist_wininst - :synopsis: Build a Windows installer - -.. deprecated:: 3.8 - Use bdist_wheel (wheel packages) instead. - - -.. % todo - - :mod:`distutils.command.sdist` --- Build a source distribution ============================================================== diff --git a/Doc/distutils/builtdist.rst b/Doc/distutils/builtdist.rst index e032c03e..c4409aca 100644 --- a/Doc/distutils/builtdist.rst +++ b/Doc/distutils/builtdist.rst @@ -96,9 +96,6 @@ The available formats for built distributions are: +-------------+------------------------------+---------+ | ``sdux`` | HP-UX :program:`swinstall` | | +-------------+------------------------------+---------+ -| ``wininst`` | self-extracting ZIP file for | \(4) | -| | Windows | | -+-------------+------------------------------+---------+ | ``msi`` | Microsoft Installer. | | +-------------+------------------------------+---------+ @@ -141,14 +138,9 @@ generated by each, are: +--------------------------+-------------------------------------+ | :command:`bdist_rpm` | rpm, srpm | +--------------------------+-------------------------------------+ -| :command:`bdist_wininst` | wininst | -+--------------------------+-------------------------------------+ | :command:`bdist_msi` | msi | +--------------------------+-------------------------------------+ -.. note:: - bdist_wininst is deprecated since Python 3.8. - .. note:: bdist_msi is deprecated since Python 3.9. @@ -190,8 +182,7 @@ The former allows you to specify RPM-specific options; the latter allows you to easily specify multiple formats in one run. If you need to do both, you can explicitly specify multiple :command:`bdist_\*` commands and their options:: - python setup.py bdist_rpm --packager="John Doe " \ - bdist_wininst --target-version="2.0" + python setup.py bdist_rpm --packager="John Doe " Creating RPM packages is driven by a :file:`.spec` file, much as using the Distutils is driven by the setup script. To make your life easier, the @@ -299,61 +290,6 @@ file winds up deep in the "build tree," in a temporary directory created by .. % to the \file{.spec} file.) -.. _creating-wininst: - -Creating Windows Installers -=========================== - -.. warning:: - bdist_wininst is deprecated since Python 3.8. - -.. warning:: - bdist_msi is deprecated since Python 3.9. - -Executable installers are the natural format for binary distributions on -Windows. They display a nice graphical user interface, display some information -about the module distribution to be installed taken from the metadata in the -setup script, let the user select a few options, and start or cancel the -installation. - -Since the metadata is taken from the setup script, creating Windows installers -is usually as easy as running:: - - python setup.py bdist_wininst - -or the :command:`bdist` command with the :option:`!--formats` option:: - - python setup.py bdist --formats=wininst - -If you have a pure module distribution (only containing pure Python modules and -packages), the resulting installer will be version independent and have a name -like :file:`foo-1.0.win32.exe`. Note that creating ``wininst`` binary -distributions in only supported on Windows systems. - -If you have a non-pure distribution, the extensions can only be created on a -Windows platform, and will be Python version dependent. The installer filename -will reflect this and now has the form :file:`foo-1.0.win32-py2.0.exe`. You -have to create a separate installer for every Python version you want to -support. - -The installer will try to compile pure modules into :term:`bytecode` after installation -on the target system in normal and optimizing mode. If you don't want this to -happen for some reason, you can run the :command:`bdist_wininst` command with -the :option:`!--no-target-compile` and/or the :option:`!--no-target-optimize` -option. - -By default the installer will display the cool "Python Powered" logo when it is -run, but you can also supply your own 152x261 bitmap which must be a Windows -:file:`.bmp` file with the :option:`!--bitmap` option. - -The installer will also display a large title on the desktop background window -when it is run, which is constructed from the name of your distribution and the -version number. This can be changed to another text by using the -:option:`!--title` option. - -The installer file will be written to the "distribution directory" --- normally -:file:`dist/`, but customizable with the :option:`!--dist-dir` option. - .. _cross-compile-windows: Cross-compiling on Windows @@ -370,10 +306,7 @@ For example, on a 32bit version of Windows, you could execute:: python setup.py build --plat-name=win-amd64 -to build a 64bit version of your extension. The Windows Installers also -support this option, so the command:: - - python setup.py build --plat-name=win-amd64 bdist_wininst +to build a 64bit version of your extension. would create a 64bit installation executable on your 32bit version of Windows. @@ -462,18 +395,3 @@ built-in functions in the installation script. and *iconindex* is the index of the icon in the file *iconpath*. Again, for details consult the Microsoft documentation for the :class:`IShellLink` interface. - - -Vista User Access Control (UAC) -=============================== - -Starting with Python 2.6, bdist_wininst supports a :option:`!--user-access-control` -option. The default is 'none' (meaning no UAC handling is done), and other -valid values are 'auto' (meaning prompt for UAC elevation if Python was -installed for all users) and 'force' (meaning always prompt for elevation). - -.. note:: - bdist_wininst is deprecated since Python 3.8. - -.. note:: - bdist_msi is deprecated since Python 3.9. diff --git a/Doc/distutils/commandref.rst b/Doc/distutils/commandref.rst index 0f6fe2ab..3e247e68 100644 --- a/Doc/distutils/commandref.rst +++ b/Doc/distutils/commandref.rst @@ -101,6 +101,5 @@ anything except backslash or colon. .. % \subsection{\protect\command{bdist}} .. % \subsection{\protect\command{bdist\_dumb}} .. % \subsection{\protect\command{bdist\_rpm}} -.. % \subsection{\protect\command{bdist\_wininst}} diff --git a/Doc/distutils/index.rst b/Doc/distutils/index.rst index 1f72a255..2ccddc38 100644 --- a/Doc/distutils/index.rst +++ b/Doc/distutils/index.rst @@ -12,6 +12,13 @@ :ref:`distributing-index` The up to date module distribution documentations +.. note:: + + The entire ``distutils`` package has been deprecated and will be + removed in Python 3.12. This documentation is retained as a + reference only, and will be removed with the package. See the + :ref:`What's New ` entry for more information. + .. include:: ./_setuptools_disclaimer.rst .. note:: diff --git a/Doc/distutils/introduction.rst b/Doc/distutils/introduction.rst index 1f8a560e..87ed178e 100644 --- a/Doc/distutils/introduction.rst +++ b/Doc/distutils/introduction.rst @@ -112,17 +112,6 @@ the setup script. The difference is which Distutils *commands* they use: the :command:`install` is more often for installers (although most developers will want to install their own code occasionally). -If you want to make things really easy for your users, you can create one or -more built distributions for them. For instance, if you are running on a -Windows machine, and want to make things easy for other Windows users, you can -create an executable installer (the most appropriate type of built distribution -for this platform) with the :command:`bdist_wininst` command. For example:: - - python setup.py bdist_wininst - -will create an executable installer, :file:`foo-1.0.win32.exe`, in the current -directory. - Other useful built distribution formats are RPM, implemented by the :command:`bdist_rpm` command, Solaris :program:`pkgtool` (:command:`bdist_pkgtool`), and HP-UX :program:`swinstall` diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst index 7b1e22f8..0600663d 100644 --- a/Doc/distutils/sourcedist.rst +++ b/Doc/distutils/sourcedist.rst @@ -23,25 +23,25 @@ option, for example:: to create a gzipped tarball and a zip file. The available formats are: -+-----------+-------------------------+-------------+ -| Format | Description | Notes | -+===========+=========================+=============+ -| ``zip`` | zip file (:file:`.zip`) | (1),(3) | -+-----------+-------------------------+-------------+ -| ``gztar`` | gzip'ed tar file | \(2) | -| | (:file:`.tar.gz`) | | -+-----------+-------------------------+-------------+ -| ``bztar`` | bzip2'ed tar file | \(5) | -| | (:file:`.tar.bz2`) | | -+-----------+-------------------------+-------------+ -| ``xztar`` | xz'ed tar file | \(5) | -| | (:file:`.tar.xz`) | | -+-----------+-------------------------+-------------+ -| ``ztar`` | compressed tar file | (4),(5) | -| | (:file:`.tar.Z`) | | -+-----------+-------------------------+-------------+ -| ``tar`` | tar file (:file:`.tar`) | \(5) | -+-----------+-------------------------+-------------+ ++-----------+-------------------------+---------+ +| Format | Description | Notes | ++===========+=========================+=========+ +| ``zip`` | zip file (:file:`.zip`) | (1),(3) | ++-----------+-------------------------+---------+ +| ``gztar`` | gzip'ed tar file | \(2) | +| | (:file:`.tar.gz`) | | ++-----------+-------------------------+---------+ +| ``bztar`` | bzip2'ed tar file | | +| | (:file:`.tar.bz2`) | | ++-----------+-------------------------+---------+ +| ``xztar`` | xz'ed tar file | | +| | (:file:`.tar.xz`) | | ++-----------+-------------------------+---------+ +| ``ztar`` | compressed tar file | \(4) | +| | (:file:`.tar.Z`) | | ++-----------+-------------------------+---------+ +| ``tar`` | tar file (:file:`.tar`) | | ++-----------+-------------------------+---------+ .. versionchanged:: 3.5 Added support for the ``xztar`` format. @@ -61,9 +61,6 @@ Notes: (4) requires the :program:`compress` program. Notice that this format is now pending for deprecation and will be removed in the future versions of Python. -(5) - deprecated by `PEP 527 `_; - `PyPI `_ only accepts ``.zip`` and ``.tar.gz`` files. When using any ``tar`` format (``gztar``, ``bztar``, ``xztar``, ``ztar`` or ``tar``), under Unix you can specify the ``owner`` and ``group`` names diff --git a/Doc/extending/building.rst b/Doc/extending/building.rst index 753b5511..69dffbd5 100644 --- a/Doc/extending/building.rst +++ b/Doc/extending/building.rst @@ -162,6 +162,5 @@ If the source distribution has been built successfully, maintainers can also create binary distributions. Depending on the platform, one of the following commands can be used to do so. :: - python setup.py bdist_wininst python setup.py bdist_rpm python setup.py bdist_dumb diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst index a7676708..561d1c61 100644 --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -127,11 +127,13 @@ Intermezzo: Errors and Exceptions An important convention throughout the Python interpreter is the following: when a function fails, it should set an exception condition and return an error value -(usually ``-1`` or a ``NULL`` pointer). Exception information is stored in -three members of the interpreter's thread state. These are ``NULL`` if -there is no exception. Otherwise they are the C equivalents of the members -of the Python tuple returned by :meth:`sys.exc_info`. These are the -exception type, exception instance, and a traceback object. It is important +(usually a ``NULL`` pointer). Exceptions are stored in a static global variable +inside the interpreter; if this variable is ``NULL`` no exception has occurred. A +second global variable stores the "associated value" of the exception (the +second argument to :keyword:`raise`). A third variable contains the stack +traceback in case the error originated in Python code. These three variables +are the C equivalents of the result in Python of :meth:`sys.exc_info` (see the +section on module :mod:`sys` in the Python Library Reference). It is important to know about them to understand how errors are passed around. The Python API defines a number of functions to set various types of exceptions. @@ -909,12 +911,7 @@ the cycle itself. The cycle detector is able to detect garbage cycles and can reclaim them. The :mod:`gc` module exposes a way to run the detector (the :func:`~gc.collect` function), as well as configuration -interfaces and the ability to disable the detector at runtime. The cycle -detector is considered an optional component; though it is included by default, -it can be disabled at build time using the :option:`!--without-cycle-gc` option -to the :program:`configure` script on Unix platforms (including Mac OS X). If -the cycle detector is disabled in this way, the :mod:`gc` module will not be -available. +interfaces and the ability to disable the detector at runtime. .. _refcountsinpython: diff --git a/Doc/extending/newtypes.rst b/Doc/extending/newtypes.rst index 7c51d8e2..6e17897e 100644 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -12,7 +12,7 @@ This section aims to give a quick fly-by on the various type methods you can implement and what they do. Here is the definition of :c:type:`PyTypeObject`, with some fields only used in -debug builds omitted: +:ref:`debug builds ` omitted: .. literalinclude:: ../includes/typestruct.h @@ -73,19 +73,7 @@ function:: newdatatype_dealloc(newdatatypeobject *obj) { free(obj->obj_UnderlyingDatatypePtr); - Py_TYPE(obj)->tp_free((PyObject *)obj); - } - -If your type supports garbage collection, the destructor should call -:c:func:`PyObject_GC_UnTrack` before clearing any member fields:: - - static void - newdatatype_dealloc(newdatatypeobject *obj) - { - PyObject_GC_UnTrack(obj); - Py_CLEAR(obj->other_obj); - ... - Py_TYPE(obj)->tp_free((PyObject *)obj); + Py_TYPE(obj)->tp_free(obj); } .. index:: @@ -299,18 +287,23 @@ combined using bitwise-OR. +===========================+==============================================+ | :const:`READONLY` | Never writable. | +---------------------------+----------------------------------------------+ -| :const:`READ_RESTRICTED` | Not readable in restricted mode. | -+---------------------------+----------------------------------------------+ -| :const:`WRITE_RESTRICTED` | Not writable in restricted mode. | -+---------------------------+----------------------------------------------+ -| :const:`RESTRICTED` | Not readable or writable in restricted mode. | +| :const:`PY_AUDIT_READ` | Emit an ``object.__getattr__`` | +| | :ref:`audit events ` before | +| | reading. | +---------------------------+----------------------------------------------+ +.. versionchanged:: 3.10 + :const:`RESTRICTED`, :const:`READ_RESTRICTED` and :const:`WRITE_RESTRICTED` + are deprecated. However, :const:`READ_RESTRICTED` is an alias for + :const:`PY_AUDIT_READ`, so fields that specify either :const:`RESTRICTED` + or :const:`READ_RESTRICTED` will also raise an audit event. + .. index:: single: READONLY single: READ_RESTRICTED single: WRITE_RESTRICTED single: RESTRICTED + single: PY_AUDIT_READ An interesting advantage of using the :c:member:`~PyTypeObject.tp_members` table to build descriptors that are used at runtime is that any attribute defined this way can @@ -388,7 +381,7 @@ analogous to the :ref:`rich comparison methods `, like :c:func:`PyObject_RichCompareBool`. This function is called with two Python objects and the operator as arguments, -where the operator is one of ``Py_EQ``, ``Py_NE``, ``Py_LE``, ``Py_GE``, +where the operator is one of ``Py_EQ``, ``Py_NE``, ``Py_LE``, ``Py_GT``, ``Py_LT`` or ``Py_GT``. It should compare the two objects with respect to the specified operator and return ``Py_True`` or ``Py_False`` if the comparison is successful, ``Py_NotImplemented`` to indicate that comparison is not diff --git a/Doc/extending/newtypes_tutorial.rst b/Doc/extending/newtypes_tutorial.rst index 7771e205..530e2c4d 100644 --- a/Doc/extending/newtypes_tutorial.rst +++ b/Doc/extending/newtypes_tutorial.rst @@ -67,9 +67,10 @@ The first bit is:: This is what a Custom object will contain. ``PyObject_HEAD`` is mandatory at the start of each object struct and defines a field called ``ob_base`` of type :c:type:`PyObject`, containing a pointer to a type object and a -reference count (these can be accessed using the macros :c:macro:`Py_TYPE` -and :c:macro:`Py_REFCNT` respectively). The reason for the macro is to -abstract away the layout and to enable additional fields in debug builds. +reference count (these can be accessed using the macros :c:macro:`Py_REFCNT` +and :c:macro:`Py_TYPE` respectively). The reason for the macro is to +abstract away the layout and to enable additional fields in :ref:`debug builds +`. .. note:: There is no semicolon above after the :c:macro:`PyObject_HEAD` macro. @@ -89,7 +90,7 @@ The second bit is the definition of the type object. :: static PyTypeObject CustomType = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom.Custom", - .tp_doc = PyDoc_STR("Custom objects"), + .tp_doc = "Custom objects", .tp_basicsize = sizeof(CustomObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT, @@ -160,7 +161,7 @@ you will need to OR the corresponding flags. We provide a doc string for the type in :c:member:`~PyTypeObject.tp_doc`. :: - .tp_doc = PyDoc_STR("Custom objects"), + .tp_doc = "Custom objects", To enable object creation, we have to provide a :c:member:`~PyTypeObject.tp_new` handler. This is the equivalent of the Python method :meth:`__new__`, but diff --git a/Doc/extending/windows.rst b/Doc/extending/windows.rst index 28d0350f..c7b92c6e 100644 --- a/Doc/extending/windows.rst +++ b/Doc/extending/windows.rst @@ -106,7 +106,8 @@ Using DLLs in Practice Windows Python is built in Microsoft Visual C++; using other compilers may or -may not work. The rest of this section is MSVC++ specific. +may not work (though Borland seems to). The rest of this section is MSVC++ +specific. When creating DLLs in Windows, you must pass :file:`pythonXY.lib` to the linker. To build two DLLs, spam and ni (which uses C functions found in spam), you could @@ -133,3 +134,4 @@ Developer Studio will throw in a lot of import libraries that you do not really need, adding about 100K to your executable. To get rid of them, use the Project Settings dialog, Link tab, to specify *ignore default libraries*. Add the correct :file:`msvcrtxx.lib` to the list of libraries. + diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst index 01fa5c77..720b1e49 100644 --- a/Doc/faq/design.rst +++ b/Doc/faq/design.rst @@ -259,17 +259,19 @@ Why isn't there a switch or case statement in Python? ----------------------------------------------------- You can do this easily enough with a sequence of ``if... elif... elif... else``. -There have been some proposals for switch statement syntax, but there is no -consensus (yet) on whether and how to do range tests. See :pep:`275` for -complete details and the current status. +For literal values, or constants within a namespace, you can also use a +``match ... case`` statement. For cases where you need to choose from a very large number of possibilities, you can create a dictionary mapping case values to functions to call. For example:: + def function_1(...): + ... + functions = {'a': function_1, 'b': function_2, - 'c': self.method_1} + 'c': self.method_1, ...} func = functions[value] func() @@ -277,14 +279,14 @@ example:: For calling methods on objects, you can simplify yet further by using the :func:`getattr` built-in to retrieve methods with a particular name:: - class MyVisitor: - def visit_a(self): - ... + def visit_a(self, ...): + ... + ... - def dispatch(self, value): - method_name = 'visit_' + str(value) - method = getattr(self, method_name) - method() + def dispatch(self, value): + method_name = 'visit_' + str(value) + method = getattr(self, method_name) + method() It's suggested that you use a prefix for the method names, such as ``visit_`` in this example. Without such a prefix, if values are coming from an untrusted @@ -712,7 +714,7 @@ Why don't generators support the with statement? For technical reasons, a generator used directly as a context manager would not work correctly. When, as is most common, a generator is used as an iterator run to completion, no closing is needed. When it is, wrap -it as "contextlib.closing(generator)" in the 'with' statement. +it as "contextlib.closing(generator)" in the 'with' statment. Why are colons required for the if/while/def/class statements? diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst index 1d2aca6f..3379e41d 100644 --- a/Doc/faq/extending.rst +++ b/Doc/faq/extending.rst @@ -254,6 +254,7 @@ For Red Hat, install the python-devel RPM to get the necessary files. For Debian, run ``apt-get install python-dev``. + How do I tell "incomplete input" from "invalid input"? ------------------------------------------------------ @@ -272,6 +273,130 @@ you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` to point at you custom input function. See ``Modules/readline.c`` and ``Parser/myreadline.c`` for more hints. +However sometimes you have to run the embedded Python interpreter in the same +thread as your rest application and you can't allow the +:c:func:`PyRun_InteractiveLoop` to stop while waiting for user input. +A solution is trying to compile the received string with +:c:func:`Py_CompileString`. If it compiles without errors, try to execute the +returned code object by calling :c:func:`PyEval_EvalCode`. Otherwise save the +input for later. If the compilation fails, find out if it's an error or just +more input is required - by extracting the message string from the exception +tuple and comparing it to the string "unexpected EOF while parsing". Here is a +complete example using the GNU readline library (you may want to ignore +**SIGINT** while calling readline()):: + + #include + #include + + #define PY_SSIZE_T_CLEAN + #include + #include + #include + #include + + int main (int argc, char* argv[]) + { + int i, j, done = 0; /* lengths of line, code */ + char ps1[] = ">>> "; + char ps2[] = "... "; + char *prompt = ps1; + char *msg, *line, *code = NULL; + PyObject *src, *glb, *loc; + PyObject *exc, *val, *trb, *obj, *dum; + + Py_Initialize (); + loc = PyDict_New (); + glb = PyDict_New (); + PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ()); + + while (!done) + { + line = readline (prompt); + + if (NULL == line) /* Ctrl-D pressed */ + { + done = 1; + } + else + { + i = strlen (line); + + if (i > 0) + add_history (line); /* save non-empty lines */ + + if (NULL == code) /* nothing in code yet */ + j = 0; + else + j = strlen (code); + + code = realloc (code, i + j + 2); + if (NULL == code) /* out of memory */ + exit (1); + + if (0 == j) /* code was empty, so */ + code[0] = '\0'; /* keep strncat happy */ + + strncat (code, line, i); /* append line to code */ + code[i + j] = '\n'; /* append '\n' to code */ + code[i + j + 1] = '\0'; + + src = Py_CompileString (code, "", Py_single_input); + + if (NULL != src) /* compiled just fine - */ + { + if (ps1 == prompt || /* ">>> " or */ + '\n' == code[i + j - 1]) /* "... " and double '\n' */ + { /* so execute it */ + dum = PyEval_EvalCode (src, glb, loc); + Py_XDECREF (dum); + Py_XDECREF (src); + free (code); + code = NULL; + if (PyErr_Occurred ()) + PyErr_Print (); + prompt = ps1; + } + } /* syntax error or E_EOF? */ + else if (PyErr_ExceptionMatches (PyExc_SyntaxError)) + { + PyErr_Fetch (&exc, &val, &trb); /* clears exception! */ + + if (PyArg_ParseTuple (val, "sO", &msg, &obj) && + !strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */ + { + Py_XDECREF (exc); + Py_XDECREF (val); + Py_XDECREF (trb); + prompt = ps2; + } + else /* some other syntax error */ + { + PyErr_Restore (exc, val, trb); + PyErr_Print (); + free (code); + code = NULL; + prompt = ps1; + } + } + else /* some non-syntax error */ + { + PyErr_Print (); + free (code); + code = NULL; + prompt = ps1; + } + + free (line); + } + } + + Py_XDECREF(glb); + Py_XDECREF(loc); + Py_Finalize(); + exit(0); + } + + How do I find undefined g++ symbols __builtin_new or __pure_virtual? -------------------------------------------------------------------- diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst index cf70f16c..7723114b 100644 --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -113,7 +113,7 @@ to many different classes of problems. The language comes with a large standard library that covers areas such as string processing (regular expressions, Unicode, calculating differences between -files), Internet protocols (HTTP, FTP, SMTP, XML-RPC, POP, IMAP, CGI +files), internet protocols (HTTP, FTP, SMTP, XML-RPC, POP, IMAP, CGI programming), software engineering (unit testing, logging, profiling, parsing Python code), and operating system interfaces (system calls, filesystems, TCP/IP sockets). Look at the table of contents for :ref:`library-index` to get an idea diff --git a/Doc/faq/library.rst b/Doc/faq/library.rst index 96525ddc..45c20bd6 100644 --- a/Doc/faq/library.rst +++ b/Doc/faq/library.rst @@ -20,7 +20,7 @@ library and will be able to skip this step.) For third-party packages, search the `Python Package Index `_ or try `Google `_ or -another Web search engine. Searching for "Python" plus a keyword or two for +another web search engine. Searching for "Python" plus a keyword or two for your topic of interest will usually find something helpful. @@ -106,6 +106,9 @@ support, pads, and mouse support. This means the module isn't compatible with operating systems that only have BSD curses, but there don't seem to be any currently maintained OSes that fall into this category. +For Windows: use `the consolelib module +`_. + Is there an equivalent to C's onexit() in Python? ------------------------------------------------- @@ -240,6 +243,9 @@ Be sure to use the :mod:`threading` module and not the :mod:`_thread` module. The :mod:`threading` module builds convenient abstractions on top of the low-level primitives provided by the :mod:`_thread` module. +Aahz has a set of slides from his threading tutorial that are helpful; see +http://www.pythoncraft.com/OSCON2001/. + None of my threads seem to run: why? ------------------------------------ @@ -313,11 +319,11 @@ Here's a trivial example:: try: arg = q.get(block=False) except queue.Empty: - print('Worker', threading.currentThread(), end=' ') + print('Worker', threading.current_thread(), end=' ') print('queue empty') break else: - print('Worker', threading.currentThread(), end=' ') + print('Worker', threading.current_thread(), end=' ') print('running with argument', arg) time.sleep(0.5) @@ -611,9 +617,9 @@ use ``p.read(n)``. How do I access the serial (RS232) port? ---------------------------------------- -For Win32, OSX, Linux, BSD, Jython, IronPython: +For Win32, POSIX (Linux, BSD, etc.), Jython: - https://pypi.org/project/pyserial/ + http://pyserial.sourceforge.net For Unix, see a Usenet post by Mitch Chapman: diff --git a/Doc/faq/programming.rst b/Doc/faq/programming.rst index c2656382..ef80808a 100644 --- a/Doc/faq/programming.rst +++ b/Doc/faq/programming.rst @@ -78,7 +78,7 @@ set of modules required by a program and bind these modules together with a Python binary to produce a single executable. One is to use the freeze tool, which is included in the Python source tree as -``Tools/freeze``. It converts Python byte code to C arrays; with a C compiler you can +``Tools/freeze``. It converts Python byte code to C arrays; a C compiler you can embed all your modules into a new program, which is then linked with the standard Python modules. @@ -836,27 +836,6 @@ ago? ``-190 % 12 == 2`` is useful; ``-190 % 12 == -10`` is a bug waiting to bite. -How do I get int literal attribute instead of SyntaxError? ----------------------------------------------------------- - -Trying to lookup an ``int`` literal attribute in the normal manner gives -a syntax error because the period is seen as a decimal point:: - - >>> 1.__class__ - File "", line 1 - 1.__class__ - ^ - SyntaxError: invalid decimal literal - -The solution is to separate the literal from the period -with either a space or parentheses. - - >>> 1 .__class__ - - >>> (1).__class__ - - - How do I convert a string to a number? -------------------------------------- @@ -1554,20 +1533,19 @@ Most :meth:`__setattr__` implementations must modify ``self.__dict__`` to store local state for self without causing an infinite recursion. -How do I call a method defined in a base class from a derived class that overrides it? --------------------------------------------------------------------------------------- +How do I call a method defined in a base class from a derived class that extends it? +------------------------------------------------------------------------------------ Use the built-in :func:`super` function:: class Derived(Base): def meth(self): - super(Derived, self).meth() + super().meth() # calls Base.meth -For version prior to 3.0, you may be using classic classes: For a class -definition such as ``class Derived(Base): ...`` you can call method ``meth()`` -defined in ``Base`` (or one of ``Base``'s base classes) as ``Base.meth(self, -arguments...)``. Here, ``Base.meth`` is an unbound method, so you need to -provide the ``self`` argument. +In the example, :func:`super` will automatically determine the instance from +which it was called (the ``self`` value), look up the :term:`method resolution +order` (MRO) with ``type(self).__mro__``, and return the next in line after +``Derived`` in the MRO: ``Base``. How can I organize my code to make it easier to change the base class? @@ -1820,7 +1798,7 @@ for ``None``. This reads like plain English in code and avoids confusion with other objects that may have boolean values that evaluate to false. 2) Detecting optional arguments can be tricky when ``None`` is a valid input -value. In those situations, you can create a singleton sentinel object +value. In those situations, you can create an singleton sentinel object guaranteed to be distinct from other objects. For example, here is how to implement a method that behaves like :meth:`dict.pop`:: @@ -1897,6 +1875,86 @@ The classes can be used like this: 'blog-why-python-rocks' +How do I cache method calls? +---------------------------- + +The two principal tools for caching methods are +:func:`functools.cached_property` and :func:`functools.lru_cache`. The +former stores results at the instance level and the latter at the class +level. + +The *cached_property* approach only works with methods that do not take +any arguments. It does not create a reference to the instance. The +cached method result will be kept only as long as the instance is alive. + +The advantage is that when an instance is not longer used, the cached +method result will be released right away. The disadvantage is that if +instances accumulate, so too will the accumulated method results. They +can grow without bound. + +The *lru_cache* approach works with methods that have hashable +arguments. It creates a reference to the instance unless special +efforts are made to pass in weak references. + +The advantage of the least recently used algorithm is that the cache is +bounded by the specified *maxsize*. The disadvantage is that instances +are kept alive until they age out of the cache or until the cache is +cleared. + +This example shows the various techniques:: + + class Weather: + "Lookup weather information on a government website" + + def __init__(self, station_id): + self._station_id = station_id + # The _station_id is private and immutable + + def current_temperature(self): + "Latest hourly observation" + # Do not cache this because old results + # can be out of date. + + @cached_property + def location(self): + "Return the longitude/latitude coordinates of the station" + # Result only depends on the station_id + + @lru_cache(maxsize=20) + def historic_rainfall(self, date, units='mm'): + "Rainfall on a given date" + # Depends on the station_id, date, and units. + +The above example assumes that the *station_id* never changes. If the +relevant instance attributes are mutable, the *cached_property* approach +can't be made to work because it cannot detect changes to the +attributes. + +The *lru_cache* approach can be made to work, but the class needs to define the +*__eq__* and *__hash__* methods so the cache can detect relevant attribute +updates:: + + class Weather: + "Example with a mutable station identifier" + + def __init__(self, station_id): + self.station_id = station_id + + def change_station(self, station_id): + self.station_id = station_id + + def __eq__(self, other): + return self.station_id == other.station_id + + def __hash__(self): + return hash(self.station_id) + + @lru_cache(maxsize=20) + def historic_rainfall(self, date, units='cm'): + 'Rainfall on a given date' + # Depends on the station_id, date, and units. + + Modules ======= @@ -1972,26 +2030,26 @@ How can I have modules that mutually import each other? Suppose you have the following modules: -foo.py:: +:file:`foo.py`:: from bar import bar_var foo_var = 1 -bar.py:: +:file:`bar.py`:: from foo import foo_var bar_var = 2 The problem is that the interpreter will perform the following steps: -* main imports foo -* Empty globals for foo are created -* foo is compiled and starts executing -* foo imports bar -* Empty globals for bar are created -* bar is compiled and starts executing -* bar imports foo (which is a no-op since there already is a module named foo) -* bar.foo_var = foo.foo_var +* main imports ``foo`` +* Empty globals for ``foo`` are created +* ``foo`` is compiled and starts executing +* ``foo`` imports ``bar`` +* Empty globals for ``bar`` are created +* ``bar`` is compiled and starts executing +* ``bar`` imports ``foo`` (which is a no-op since there already is a module named ``foo``) +* The import mechanism tries to read ``foo_var`` from ``foo`` globals, to set ``bar.foo_var = foo.foo_var`` The last step fails, because Python isn't done with interpreting ``foo`` yet and the global symbol dictionary for ``foo`` is still empty. @@ -2013,7 +2071,7 @@ Jim Roskind suggests performing steps in the following order in each module: * ``import`` statements * active code (including globals that are initialized from imported values). -Van Rossum doesn't like this approach much because the imports appear in a +van Rossum doesn't like this approach much because the imports appear in a strange place, but it does work. Matthias Urlichs recommends restructuring your code so that the recursive import diff --git a/Doc/faq/windows.rst b/Doc/faq/windows.rst index 4f50b3f1..0153a4f3 100644 --- a/Doc/faq/windows.rst +++ b/Doc/faq/windows.rst @@ -26,8 +26,8 @@ with running programs from the Windows command line then everything will seem obvious; otherwise, you might need a little more guidance. Unless you use some sort of integrated development environment, you will end up -*typing* Windows commands into what is referred to as a -"Command prompt window". Usually you can create such a window from your +*typing* Windows commands into what is variously referred to as a "DOS window" +or "Command prompt window". Usually you can create such a window from your search bar by searching for ``cmd``. You should be able to recognize when you have started such a window because you will see a Windows "command prompt", which usually looks like this: @@ -186,6 +186,9 @@ Embedding the Python interpreter in a Windows app can be summarized as follows: by the Windows ``GetProcAddress()`` routine. Macros can make using these pointers transparent to any C code that calls routines in Python's C API. + Borland note: convert :file:`python{NN}.lib` to OMF format using Coff2Omf.exe + first. + .. XXX what about static linking? 2. If you use SWIG, it is easy to create a Python "extension module" that will @@ -276,3 +279,4 @@ How do I check for a keypress without blocking? Use the :mod:`msvcrt` module. This is a standard Windows-specific extension module. It defines a function ``kbhit()`` which checks whether a keyboard hit is present, and ``getch()`` which gets one character without echoing it. + diff --git a/Doc/glossary.rst b/Doc/glossary.rst index b08e395b..652f8d91 100644 --- a/Doc/glossary.rst +++ b/Doc/glossary.rst @@ -57,6 +57,8 @@ Glossary See :term:`variable annotation`, :term:`function annotation`, :pep:`484` and :pep:`526`, which describe this functionality. + Also see :ref:`annotations-howto` + for best practices on working with annotations. argument A value passed to a :term:`function` (or :term:`method`) when calling the @@ -158,6 +160,18 @@ Glossary See also :term:`text file` for a file object able to read and write :class:`str` objects. + borrowed reference + In Python's C API, a borrowed reference is a reference to an object. + It does not modify the object reference count. It becomes a dangling + pointer if the object is destroyed. For example, a garbage collection can + remove the last :term:`strong reference` to the object and so destroy it. + + Calling :c:func:`Py_INCREF` on the :term:`borrowed reference` is + recommended to convert it to a :term:`strong reference` in-place, except + when the object cannot be destroyed before the last usage of the borrowed + reference. The :c:func:`Py_NewRef` function can be used to create a new + :term:`strong reference`. + bytes-like object An object that supports the :ref:`bufferobjects` and can export a C-:term:`contiguous` buffer. This includes all :class:`bytes`, @@ -278,12 +292,12 @@ Glossary The decorator syntax is merely syntactic sugar, the following two function definitions are semantically equivalent:: - def f(arg): + def f(...): ... f = staticmethod(f) @staticmethod - def f(arg): + def f(...): ... The same concept exists for classes, but is less commonly used there. See @@ -386,6 +400,25 @@ Glossary file-like object A synonym for :term:`file object`. + filesystem encoding and error handler + Encoding and error handler used by Python to decode bytes from the + operating system and encode Unicode to the operating system. + + The filesystem encoding must guarantee to successfully decode all bytes + below 128. If the file system encoding fails to provide this guarantee, + API functions can raise :exc:`UnicodeError`. + + The :func:`sys.getfilesystemencoding` and + :func:`sys.getfilesystemencodeerrors` functions can be used to get the + filesystem encoding and error handler. + + The :term:`filesystem encoding and error handler` are configured at + Python startup by the :c:func:`PyConfig_Read` function: see + :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + + See also the :term:`locale encoding`. + finder An object that tries to find the :term:`loader` for a module that is being imported. @@ -424,6 +457,8 @@ Glossary See :term:`variable annotation` and :pep:`484`, which describe this functionality. + Also see :ref:`annotations-howto` + for best practices on working with annotations. __future__ A :ref:`future statement `, ``from __future__ import ``, @@ -485,13 +520,12 @@ Glossary :func:`functools.singledispatch` decorator, and :pep:`443`. generic type - A :term:`type` that can be parameterized; typically a - :ref:`container class` such as :class:`list` or - :class:`dict`. Used for :term:`type hints ` and + A :term:`type` that can be parameterized; typically a container like + :class:`list`. Used for :term:`type hints ` and :term:`annotations `. - For more details, see :ref:`generic alias types`, - :pep:`483`, :pep:`484`, :pep:`585`, and the :mod:`typing` module. + See :pep:`483` for more details, and :mod:`typing` or + :ref:`generic alias type ` for its uses. GIL See :term:`global interpreter lock`. @@ -675,6 +709,18 @@ Glossary thread removes *key* from *mapping* after the test, but before the lookup. This issue can be solved with locks or by using the EAFP approach. + locale encoding + On Unix, it is the encoding of the LC_CTYPE locale. It can be set with + ``locale.setlocale(locale.LC_CTYPE, new_locale)``. + + On Windows, it is the ANSI code page (ex: ``cp1252``). + + ``locale.getpreferredencoding(False)`` can be used to get the locale + encoding. + + Python uses the :term:`filesystem encoding and error handler` to convert + between Unicode filenames and bytes filenames. + list A built-in Python :term:`sequence`. Despite its name it is more akin to an array in other languages than to a linked list since access to @@ -1071,17 +1117,20 @@ Glossary an :term:`expression` or one of several constructs with a keyword, such as :keyword:`if`, :keyword:`while` or :keyword:`for`. - text encoding - A string in Python is a sequence of Unicode code points (in range - ``U+0000``--``U+10FFFF``). To store or transfer a string, it needs to be - serialized as a sequence of bytes. + strong reference + In Python's C API, a strong reference is a reference to an object + which increments the object's reference count when it is created and + decrements the object's reference count when it is deleted. + + The :c:func:`Py_NewRef` function can be used to create a strong reference + to an object. Usually, the :c:func:`Py_DECREF` function must be called on + the strong reference before exiting the scope of the strong reference, to + avoid leaking one reference. - Serializing a string into a sequence of bytes is known as "encoding", and - recreating the string from the sequence of bytes is known as "decoding". + See also :term:`borrowed reference`. - There are a variety of different text serialization - :ref:`codecs `, which are collectively referred to as - "text encodings". + text encoding + A codec which encodes Unicode strings to bytes. text file A :term:`file object` able to read and write :class:`str` objects. @@ -1167,6 +1216,8 @@ Glossary See :term:`function annotation`, :pep:`484` and :pep:`526`, which describe this functionality. + Also see :ref:`annotations-howto` + for best practices on working with annotations. virtual environment A cooperatively isolated runtime environment that allows Python users diff --git a/Doc/howto/annotations.rst b/Doc/howto/annotations.rst new file mode 100644 index 00000000..3e61103e --- /dev/null +++ b/Doc/howto/annotations.rst @@ -0,0 +1,226 @@ +.. _annotations-howto: + +************************** +Annotations Best Practices +************************** + +:author: Larry Hastings + +.. topic:: Abstract + + This document is designed to encapsulate the best practices + for working with annotations dicts. If you write Python code + that examines ``__annotations__`` on Python objects, we + encourage you to follow the guidelines described below. + + The document is organized into four sections: + best practices for accessing the annotations of an object + in Python versions 3.10 and newer, + best practices for accessing the annotations of an object + in Python versions 3.9 and older, + other best practices + for ``__annotations__`` that apply to any Python version, + and + quirks of ``__annotations__``. + + Note that this document is specifically about working with + ``__annotations__``, not uses *for* annotations. + If you're looking for information on how to use "type hints" + in your code, please see the :mod:`typing` module. + + +Accessing The Annotations Dict Of An Object In Python 3.10 And Newer +==================================================================== + + Python 3.10 adds a new function to the standard library: + :func:`inspect.get_annotations`. In Python versions 3.10 + and newer, calling this function is the best practice for + accessing the annotations dict of any object that supports + annotations. This function can also "un-stringize" + stringized annotations for you. + + If for some reason :func:`inspect.get_annotations` isn't + viable for your use case, you may access the + ``__annotations__`` data member manually. Best practice + for this changed in Python 3.10 as well: as of Python 3.10, + ``o.__annotations__`` is guaranteed to *always* work + on Python functions, classes, and modules. If you're + certain the object you're examining is one of these three + *specific* objects, you may simply use ``o.__annotations__`` + to get at the object's annotations dict. + + However, other types of callables--for example, + callables created by :func:`functools.partial`--may + not have an ``__annotations__`` attribute defined. When + accessing the ``__annotations__`` of a possibly unknown + object, best practice in Python versions 3.10 and + newer is to call :func:`getattr` with three arguments, + for example ``getattr(o, '__annotations__', None)``. + + +Accessing The Annotations Dict Of An Object In Python 3.9 And Older +=================================================================== + + In Python 3.9 and older, accessing the annotations dict + of an object is much more complicated than in newer versions. + The problem is a design flaw in these older versions of Python, + specifically to do with class annotations. + + Best practice for accessing the annotations dict of other + objects--functions, other callables, and modules--is the same + as best practice for 3.10, assuming you aren't calling + :func:`inspect.get_annotations`: you should use three-argument + :func:`getattr` to access the object's ``__annotations__`` + attribute. + + Unfortunately, this isn't best practice for classes. The problem + is that, since ``__annotations__`` is optional on classes, and + because classes can inherit attributes from their base classes, + accessing the ``__annotations__`` attribute of a class may + inadvertently return the annotations dict of a *base class.* + As an example:: + + class Base: + a: int = 3 + b: str = 'abc' + + class Derived(Base): + pass + + print(Derived.__annotations__) + + This will print the annotations dict from ``Base``, not + ``Derived``. + + Your code will have to have a separate code path if the object + you're examining is a class (``isinstance(o, type)``). + In that case, best practice relies on an implementation detail + of Python 3.9 and before: if a class has annotations defined, + they are stored in the class's ``__dict__`` dictionary. Since + the class may or may not have annotations defined, best practice + is to call the ``get`` method on the class dict. + + To put it all together, here is some sample code that safely + accesses the ``__annotations__`` attribute on an arbitrary + object in Python 3.9 and before:: + + if isinstance(o, type): + ann = o.__dict__.get('__annotations__', None) + else: + ann = getattr(o, '__annotations__', None) + + After running this code, ``ann`` should be either a + dictionary or ``None``. You're encouraged to double-check + the type of ``ann`` using :func:`isinstance` before further + examination. + + Note that some exotic or malformed type objects may not have + a ``__dict__`` attribute, so for extra safety you may also wish + to use :func:`getattr` to access ``__dict__``. + + +Manually Un-Stringizing Stringized Annotations +============================================== + + In situations where some annotations may be "stringized", + and you wish to evaluate those strings to produce the + Python values they represent, it really is best to + call :func:`inspect.get_annotations` to do this work + for you. + + If you're using Python 3.9 or older, or if for some reason + you can't use :func:`inspect.get_annotations`, you'll need + to duplicate its logic. You're encouraged to examine the + implementation of :func:`inspect.get_annotations` in the + current Python version and follow a similar approach. + + In a nutshell, if you wish to evaluate a stringized annotation + on an arbitrary object ``o``: + + * If ``o`` is a module, use ``o.__dict__`` as the + ``globals`` when calling :func:`eval`. + * If ``o`` is a class, use ``sys.modules[o.__module__].__dict__`` + as the ``globals``, and ``dict(vars(o))`` as the ``locals``, + when calling :func:`eval`. + * If ``o`` is a wrapped callable using :func:`functools.update_wrapper`, + :func:`functools.wraps`, or :func:`functools.partial`, iteratively + unwrap it by accessing either ``o.__wrapped__`` or ``o.func`` as + appropriate, until you have found the root unwrapped function. + * If ``o`` is a callable (but not a class), use + ``o.__globals__`` as the globals when calling :func:`eval`. + + However, not all string values used as annotations can + be successfully turned into Python values by :func:`eval`. + String values could theoretically contain any valid string, + and in practice there are valid use cases for type hints that + require annotating with string values that specifically + *can't* be evaluated. For example: + + * :pep:`604` union types using `|`, before support for this + was added to Python 3.10. + * Definitions that aren't needed at runtime, only imported + when :const:`typing.TYPE_CHECKING` is true. + + If :func:`eval` attempts to evaluate such values, it will + fail and raise an exception. So, when designing a library + API that works with annotations, it's recommended to only + attempt to evaluate string values when explicitly requested + to by the caller. + + +Best Practices For ``__annotations__`` In Any Python Version +============================================================ + + * You should avoid assigning to the ``__annotations__`` member + of objects directly. Let Python manage setting ``__annotations__``. + + * If you do assign directly to the ``__annotations__`` member + of an object, you should always set it to a ``dict`` object. + + * If you directly access the ``__annotations__`` member + of an object, you should ensure that it's a + dictionary before attempting to examine its contents. + + * You should avoid modifying ``__annotations__`` dicts. + + * You should avoid deleting the ``__annotations__`` attribute + of an object. + + +``__annotations__`` Quirks +========================== + + In all versions of Python 3, function + objects lazy-create an annotations dict if no annotations + are defined on that object. You can delete the ``__annotations__`` + attribute using ``del fn.__annotations__``, but if you then + access ``fn.__annotations__`` the object will create a new empty dict + that it will store and return as its annotations. Deleting the + annotations on a function before it has lazily created its annotations + dict will throw an ``AttributeError``; using ``del fn.__annotations__`` + twice in a row is guaranteed to always throw an ``AttributeError``. + + Everything in the above paragraph also applies to class and module + objects in Python 3.10 and newer. + + In all versions of Python 3, you can set ``__annotations__`` + on a function object to ``None``. However, subsequently + accessing the annotations on that object using ``fn.__annotations__`` + will lazy-create an empty dictionary as per the first paragraph of + this section. This is *not* true of modules and classes, in any Python + version; those objects permit setting ``__annotations__`` to any + Python value, and will retain whatever value is set. + + If Python stringizes your annotations for you + (using ``from __future__ import annotations``), and you + specify a string as an annotation, the string will + itself be quoted. In effect the annotation is quoted + *twice.* For example:: + + from __future__ import annotations + def foo(a: "str"): pass + + print(foo.__annotations__) + + This prints ``{'a': "'str'"}``. This shouldn't really be considered + a "quirk"; it's mentioned here simply because it might be surprising. diff --git a/Doc/howto/argparse.rst b/Doc/howto/argparse.rst index e78a022b..a97d10cf 100644 --- a/Doc/howto/argparse.rst +++ b/Doc/howto/argparse.rst @@ -83,7 +83,7 @@ Following is a result of running the code: $ python3 prog.py --help usage: prog.py [-h] - optional arguments: + options: -h, --help show this help message and exit $ python3 prog.py --verbose usage: prog.py [-h] @@ -130,7 +130,7 @@ And running the code: positional arguments: echo - optional arguments: + options: -h, --help show this help message and exit $ python3 prog.py foo foo @@ -172,7 +172,7 @@ And we get: positional arguments: echo echo the string you use here - optional arguments: + options: -h, --help show this help message and exit Now, how about doing something even more useful:: @@ -241,7 +241,7 @@ And the output: $ python3 prog.py --help usage: prog.py [-h] [--verbosity VERBOSITY] - optional arguments: + options: -h, --help show this help message and exit --verbosity VERBOSITY increase output verbosity @@ -289,7 +289,7 @@ And the output: $ python3 prog.py --help usage: prog.py [-h] [--verbose] - optional arguments: + options: -h, --help show this help message and exit --verbose increase output verbosity @@ -332,7 +332,7 @@ And here goes: $ python3 prog.py --help usage: prog.py [-h] [-v] - optional arguments: + options: -h, --help show this help message and exit -v, --verbose increase output verbosity @@ -353,7 +353,7 @@ Our program keeps growing in complexity:: args = parser.parse_args() answer = args.square**2 if args.verbose: - print("the square of {} equals {}".format(args.square, answer)) + print(f"the square of {args.square} equals {answer}") else: print(answer) @@ -387,9 +387,9 @@ multiple verbosity values, and actually get to use them:: args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: - print("the square of {} equals {}".format(args.square, answer)) + print(f"the square of {args.square} equals {answer}") elif args.verbosity == 1: - print("{}^2 == {}".format(args.square, answer)) + print(f"{args.square}^2 == {answer}") else: print(answer) @@ -421,9 +421,9 @@ Let's fix it by restricting the values the ``--verbosity`` option can accept:: args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: - print("the square of {} equals {}".format(args.square, answer)) + print(f"the square of {args.square} equals {answer}") elif args.verbosity == 1: - print("{}^2 == {}".format(args.square, answer)) + print(f"{args.square}^2 == {answer}") else: print(answer) @@ -440,7 +440,7 @@ And the output: positional arguments: square display a square of a given number - optional arguments: + options: -h, --help show this help message and exit -v {0,1,2}, --verbosity {0,1,2} increase output verbosity @@ -461,14 +461,15 @@ verbosity argument (check the output of ``python --help``):: args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: - print("the square of {} equals {}".format(args.square, answer)) + print(f"the square of {args.square} equals {answer}") elif args.verbosity == 1: - print("{}^2 == {}".format(args.square, answer)) + print(f"{args.square}^2 == {answer}") else: print(answer) We have introduced another action, "count", -to count the number of occurrences of a specific optional arguments: +to count the number of occurrences of specific options. + .. code-block:: shell-session @@ -489,7 +490,7 @@ to count the number of occurrences of a specific optional arguments: positional arguments: square display a square of a given number - optional arguments: + options: -h, --help show this help message and exit -v, --verbosity increase output verbosity $ python3 prog.py 4 -vvv @@ -529,9 +530,9 @@ Let's fix:: # bugfix: replace == with >= if args.verbosity >= 2: - print("the square of {} equals {}".format(args.square, answer)) + print(f"the square of {args.square} equals {answer}") elif args.verbosity >= 1: - print("{}^2 == {}".format(args.square, answer)) + print(f"{args.square}^2 == {answer}") else: print(answer) @@ -566,9 +567,9 @@ Let's fix that bug:: args = parser.parse_args() answer = args.square**2 if args.verbosity >= 2: - print("the square of {} equals {}".format(args.square, answer)) + print(f"the square of {args.square} equals {answer}") elif args.verbosity >= 1: - print("{}^2 == {}".format(args.square, answer)) + print(f"{args.square}^2 == {answer}") else: print(answer) @@ -606,9 +607,9 @@ not just squares:: args = parser.parse_args() answer = args.x**args.y if args.verbosity >= 2: - print("{} to the power {} equals {}".format(args.x, args.y, answer)) + print(f"{args.x} to the power {args.y} equals {answer}") elif args.verbosity >= 1: - print("{}^{} == {}".format(args.x, args.y, answer)) + print(f"{args.x}^{args.y} == {answer}") else: print(answer) @@ -626,7 +627,7 @@ Output: x the base y the exponent - optional arguments: + options: -h, --help show this help message and exit -v, --verbosity $ python3 prog.py 4 2 -v @@ -645,9 +646,9 @@ to display *more* text instead:: args = parser.parse_args() answer = args.x**args.y if args.verbosity >= 2: - print("Running '{}'".format(__file__)) + print(f"Running '{__file__}'") if args.verbosity >= 1: - print("{}^{} == ".format(args.x, args.y), end="") + print(f"{args.x}^{args.y} == ", end="") print(answer) Output: @@ -688,9 +689,9 @@ which will be the opposite of the ``--verbose`` one:: if args.quiet: print(answer) elif args.verbose: - print("{} to the power {} equals {}".format(args.x, args.y, answer)) + print(f"{args.x} to the power {args.y} equals {answer}") else: - print("{}^{} == {}".format(args.x, args.y, answer)) + print(f"{args.x}^{args.y} == {answer}") Our program is now simpler, and we've lost some functionality for the sake of demonstration. Anyways, here's the output: @@ -750,7 +751,7 @@ but not both at the same time: x the base y the exponent - optional arguments: + options: -h, --help show this help message and exit -v, --verbose -q, --quiet diff --git a/Doc/howto/clinic.rst b/Doc/howto/clinic.rst index 145febe0..3a3653a5 100644 --- a/Doc/howto/clinic.rst +++ b/Doc/howto/clinic.rst @@ -1206,6 +1206,68 @@ type for ``self``, it's best to create your own converter, subclassing [clinic start generated code]*/ +Using a "defining class" converter +---------------------------------- + +Argument Clinic facilitates gaining access to the defining class of a method. +This is useful for :ref:`heap type ` methods that need to fetch +module level state. Use :c:func:`PyType_FromModuleAndSpec` to associate a new +heap type with a module. You can now use :c:func:`PyType_GetModuleState` on +the defining class to fetch the module state, for example from a module method. + +Example from ``Modules/zlibmodule.c``. First, ``defining_class`` is added to +the clinic input:: + + /*[clinic input] + zlib.Compress.compress + + cls: defining_class + data: Py_buffer + Binary data to be compressed. + / + + +After running the Argument Clinic tool, the following function signature is +generated:: + + /*[clinic start generated code]*/ + static PyObject * + zlib_Compress_compress_impl(compobject *self, PyTypeObject *cls, + Py_buffer *data) + /*[clinic end generated code: output=6731b3f0ff357ca6 input=04d00f65ab01d260]*/ + + +The following code can now use ``PyType_GetModuleState(cls)`` to fetch the +module state:: + + zlibstate *state = PyType_GetModuleState(cls); + + +Each method may only have one argument using this converter, and it must appear +after ``self``, or, if ``self`` is not used, as the first argument. The argument +will be of type ``PyTypeObject *``. The argument will not appear in the +``__text_signature__``. + +The ``defining_class`` converter is not compatible with ``__init__`` and ``__new__`` +methods, which cannot use the ``METH_METHOD`` convention. + +It is not possible to use ``defining_class`` with slot methods. In order to +fetch the module state from such methods, use ``_PyType_GetModuleByDef`` to +look up the module and then :c:func:`PyModule_GetState` to fetch the module +state. Example from the ``setattro`` slot method in +``Modules/_threadmodule.c``:: + + static int + local_setattro(localobject *self, PyObject *name, PyObject *v) + { + PyObject *module = _PyType_GetModuleByDef(Py_TYPE(self), &thread_module); + thread_module_state *state = get_thread_state(module); + ... + } + + +See also :pep:`573`. + Writing a custom converter -------------------------- @@ -1288,7 +1350,7 @@ Here's the simplest example of a custom converter, from ``Modules/zlibmodule.c`` /*[python end generated code: output=da39a3ee5e6b4b0d input=35521e4e733823c7]*/ This block adds a converter to Argument Clinic named ``ssize_t``. Parameters -declared as ``ssize_t`` will be declared as type :c:type:`Py_ssize_t`, and will +declared as ``ssize_t`` will be declared as type ``Py_ssize_t``, and will be parsed by the ``'O&'`` format unit, which will call the ``ssize_t_converter`` converter function. ``ssize_t`` variables automatically support default values. diff --git a/Doc/howto/curses.rst b/Doc/howto/curses.rst index c0149fff..cc4b4785 100644 --- a/Doc/howto/curses.rst +++ b/Doc/howto/curses.rst @@ -55,7 +55,11 @@ everything, though. The Windows version of Python doesn't include the :mod:`curses` module. A ported version called `UniCurses -`_ is available. +`_ is available. You could +also try `the Console module `_ +written by Fredrik Lundh, which doesn't +use the same API as curses but provides cursor-addressable text output +and full support for mouse and keyboard input. The Python curses module diff --git a/Doc/howto/descriptor.rst b/Doc/howto/descriptor.rst index 4b76e061..575caeb7 100644 --- a/Doc/howto/descriptor.rst +++ b/Doc/howto/descriptor.rst @@ -42,8 +42,8 @@ add new capabilities one by one. Simple example: A descriptor that returns a constant ---------------------------------------------------- -The :class:`Ten` class is a descriptor that always returns the constant ``10`` -from its :meth:`__get__` method: +The :class:`Ten` class is a descriptor whose :meth:`__get__` method always +returns the constant ``10``: .. testcode:: @@ -70,10 +70,10 @@ and descriptor lookup: >>> a.y # Descriptor lookup 10 -In the ``a.x`` attribute lookup, the dot operator finds the key ``x`` and the -value ``5`` in the class dictionary. In the ``a.y`` lookup, the dot operator -finds a descriptor instance, recognized by its ``__get__`` method, and calls -that method which returns ``10``. +In the ``a.x`` attribute lookup, the dot operator finds ``'x': 5`` +in the class dictionary. In the ``a.y`` lookup, the dot operator +finds a descriptor instance, recognized by its ``__get__`` method. +Calling that method returns ``10``. Note that the value ``10`` is not stored in either the class dictionary or the instance dictionary. Instead, the value ``10`` is computed on demand. @@ -302,7 +302,7 @@ used in cases where a descriptor needs to know either the class where it was created or the name of class variable it was assigned to. (This method, if present, is called even if the class is not a descriptor.) -Descriptors get invoked by the dot "operator" during attribute lookup. If a +Descriptors get invoked by the dot operator during attribute lookup. If a descriptor is accessed indirectly with ``vars(some_class)[descriptor_name]``, the descriptor instance is returned without invoking it. @@ -696,14 +696,10 @@ a pure Python equivalent: >>> b.g == b['g'] == ('getattr_hook', b, 'g') True -Note, there is no :meth:`__getattr__` hook in the :meth:`__getattribute__` -code. That is why calling :meth:`__getattribute__` directly or with -``super().__getattribute__`` will bypass :meth:`__getattr__` entirely. -Instead, it is the dot operator and the :func:`getattr` function that are -responsible for invoking :meth:`__getattr__` whenever :meth:`__getattribute__` -raises an :exc:`AttributeError`. Their logic is encapsulated in a helper -function: +Interestingly, attribute lookup doesn't call :meth:`object.__getattribute__` +directly. Instead, both the dot operator and the :func:`getattr` function +perform attribute lookup by way of a helper function: .. testcode:: @@ -748,6 +744,12 @@ function: ... AttributeError: 'ClassWithoutGetAttr' object has no attribute 'z' +So if :meth:`__getattr__` exists, it is called whenever :meth:`__getattribute__` +raises :exc:`AttributeError` (either directly or in one of the descriptor calls). + +Also, if a user calls :meth:`object.__getattribute__` directly, the +:meth:`__getattr__` hook is bypassed entirely. + Invocation from a class ----------------------- @@ -980,32 +982,42 @@ here is a pure Python equivalent: if doc is None and fget is not None: doc = fget.__doc__ self.__doc__ = doc + self._name = '' + + def __set_name__(self, owner, name): + self._name = name def __get__(self, obj, objtype=None): if obj is None: return self if self.fget is None: - raise AttributeError("unreadable attribute") + raise AttributeError(f'unreadable attribute {self._name}') return self.fget(obj) def __set__(self, obj, value): if self.fset is None: - raise AttributeError("can't set attribute") + raise AttributeError(f"can't set attribute {self._name}") self.fset(obj, value) def __delete__(self, obj): if self.fdel is None: - raise AttributeError("can't delete attribute") + raise AttributeError(f"can't delete attribute {self._name}") self.fdel(obj) def getter(self, fget): - return type(self)(fget, self.fset, self.fdel, self.__doc__) + prop = type(self)(fget, self.fset, self.fdel, self.__doc__) + prop._name = self._name + return prop def setter(self, fset): - return type(self)(self.fget, fset, self.fdel, self.__doc__) + prop = type(self)(self.fget, fset, self.fdel, self.__doc__) + prop._name = self._name + return prop def deleter(self, fdel): - return type(self)(self.fget, self.fset, fdel, self.__doc__) + prop = type(self)(self.fget, self.fset, fdel, self.__doc__) + prop._name = self._name + return prop .. testcode:: :hide: @@ -1448,7 +1460,10 @@ takes 48 bytes with ``__slots__`` and 152 bytes without. This `flyweight design pattern `_ likely only matters when a large number of instances are going to be created. -4. Blocks tools like :func:`functools.cached_property` which require an +4. Improves speed. Reading instance variables is 35% faster with +``__slots__`` (as measured with Python 3.10 on an Apple M1 processor). + +5. Blocks tools like :func:`functools.cached_property` which require an instance dictionary to function correctly: .. testcode:: diff --git a/Doc/howto/functional.rst b/Doc/howto/functional.rst index 695b9b31..74e86148 100644 --- a/Doc/howto/functional.rst +++ b/Doc/howto/functional.rst @@ -65,10 +65,11 @@ output must only depend on its input. Some languages are very strict about purity and don't even have assignment statements such as ``a=3`` or ``c = a + b``, but it's difficult to avoid all -side effects, such as printing to the screen or writing to a disk file. Another -example is a call to the :func:`print` or :func:`time.sleep` function, neither -of which returns a useful value. Both are called only for their side effects -of sending some text to the screen or pausing execution for a second. +side effects. Printing to the screen or writing to a disk file are side +effects, for example. For example, in Python a call to the :func:`print` or +:func:`time.sleep` function both return no useful value; they're only called for +their side effects of sending some text to the screen or pausing execution for a +second. Python programs written in functional style usually won't go to the extreme of avoiding all I/O or all assignments; instead, they'll provide a @@ -589,7 +590,7 @@ generator function. In addition to :meth:`~generator.send`, there are two other methods on generators: -* :meth:`throw(value) ` is used to +* :meth:`throw(type, value=None, traceback=None) ` is used to raise an exception inside the generator; the exception is raised by the ``yield`` expression where the generator's execution is paused. diff --git a/Doc/howto/index.rst b/Doc/howto/index.rst index 593341cc..01a78a55 100644 --- a/Doc/howto/index.rst +++ b/Doc/howto/index.rst @@ -29,4 +29,5 @@ Currently, the HOWTOs are: ipaddress.rst clinic.rst instrumentation.rst + annotations.rst diff --git a/Doc/howto/instrumentation.rst b/Doc/howto/instrumentation.rst index f0081e4e..4a59ae82 100644 --- a/Doc/howto/instrumentation.rst +++ b/Doc/howto/instrumentation.rst @@ -46,7 +46,8 @@ or:: $ sudo apt-get install systemtap-sdt-dev -CPython must then be configured ``--with-dtrace``: +CPython must then be :option:`configured with the --with-dtrace option +<--with-dtrace>`: .. code-block:: none @@ -77,7 +78,8 @@ the built binary by seeing if it contains a ".note.stapsdt" section. $ readelf -S ./python | grep .note.stapsdt [30] .note.stapsdt NOTE 0000000000000000 00308d78 -If you've built Python as a shared library (with --enable-shared), you +If you've built Python as a shared library +(with the :option:`--enable-shared` configure option), you need to look instead within the shared library. For example:: $ readelf -S libpython3.3dm.so.1.0 | grep .note.stapsdt @@ -252,7 +254,7 @@ where the columns are: and the remainder indicates the call/return hierarchy as the script executes. -For a `--enable-shared` build of CPython, the markers are contained within the +For a :option:`--enable-shared` build of CPython, the markers are contained within the libpython shared library, and the probe's dotted path needs to reflect this. For example, this line from the above example: @@ -266,7 +268,7 @@ should instead read: probe process("python").library("libpython3.6dm.so.1.0").mark("function__entry") { -(assuming a debug build of CPython 3.6) +(assuming a :ref:`debug build ` of CPython 3.6) Available static markers diff --git a/Doc/howto/ipaddress.rst b/Doc/howto/ipaddress.rst index 452e3671..e852db98 100644 --- a/Doc/howto/ipaddress.rst +++ b/Doc/howto/ipaddress.rst @@ -32,7 +32,7 @@ A Note on IP Versions --------------------- For readers that aren't particularly familiar with IP addressing, it's -important to know that the Internet Protocol is currently in the process +important to know that the Internet Protocol (IP) is currently in the process of moving from version 4 of the protocol to version 6. This transition is occurring largely because version 4 of the protocol doesn't provide enough addresses to handle the needs of the whole world, especially given the diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst index bc9b2499..2ab8c52e 100644 --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -332,7 +332,7 @@ Dealing with handlers that block .. currentmodule:: logging.handlers Sometimes you have to get your logging handlers to do their work without -blocking the thread you're logging from. This is common in Web applications, +blocking the thread you're logging from. This is common in web applications, though of course it also occurs in other scenarios. A common culprit which demonstrates sluggish behaviour is the @@ -541,17 +541,6 @@ alternative there, as well as adapting the above script to use your alternative serialization. -Running a logging socket listener in production -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To run a logging listener in production, you may need to use a process-management tool -such as `Supervisor `_. `Here -`_ is a Gist which -provides the bare-bones files to run the above functionality using Supervisor: you -will need to change the `/path/to/` parts in the Gist to reflect the actual paths you -want to use. - - .. _context-info: Adding contextual information to your logging output @@ -993,17 +982,6 @@ to this (remembering to first import :mod:`concurrent.futures`):: for i in range(10): executor.submit(worker_process, queue, worker_configurer) -Deploying Web applications using Gunicorn and uWSGI -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -When deploying Web applications using `Gunicorn `_ or `uWSGI -`_ (or similar), multiple worker -processes are created to handle client requests. In such environments, avoid creating -file-based handlers directly in your web application. Instead, use a -:class:`SocketHandler` to log from the web application to a listener in a separate -process. This can be set up using a process management tool such as Supervisor - see -`Running a logging socket listener in production`_ for more details. - Using file rotation ------------------- diff --git a/Doc/howto/logging.rst b/Doc/howto/logging.rst index 6316e086..fcc6bec7 100644 --- a/Doc/howto/logging.rst +++ b/Doc/howto/logging.rst @@ -684,7 +684,6 @@ Here is the logging.conf file: [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s - datefmt= The output is nearly identical to that of the non-config-file-based example: @@ -1078,20 +1077,22 @@ need more precise control over what logging information is collected. Here's a list of things you can do to avoid processing during logging which you don't need: -+-----------------------------------------------+----------------------------------------+ -| What you don't want to collect | How to avoid collecting it | -+===============================================+========================================+ -| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. | -| | This avoids calling | -| | :func:`sys._getframe`, which may help | -| | to speed up your code in environments | -| | like PyPy (which can't speed up code | -| | that uses :func:`sys._getframe`). | -+-----------------------------------------------+----------------------------------------+ -| Threading information. | Set ``logging.logThreads`` to ``0``. | -+-----------------------------------------------+----------------------------------------+ -| Process information. | Set ``logging.logProcesses`` to ``0``. | -+-----------------------------------------------+----------------------------------------+ ++-----------------------------------------------------+---------------------------------------------------+ +| What you don't want to collect | How to avoid collecting it | ++=====================================================+===================================================+ +| Information about where calls were made from. | Set ``logging._srcfile`` to ``None``. | +| | This avoids calling :func:`sys._getframe`, which | +| | may help to speed up your code in environments | +| | like PyPy (which can't speed up code that uses | +| | :func:`sys._getframe`). | ++-----------------------------------------------------+---------------------------------------------------+ +| Threading information. | Set ``logging.logThreads`` to ``False``. | ++-----------------------------------------------------+---------------------------------------------------+ +| Current process ID (:func:`os.getpid`) | Set ``logging.logProcesses`` to ``False``. | ++-----------------------------------------------------+---------------------------------------------------+ +| Current process name when using ``multiprocessing`` | Set ``logging.logMultiprocessing`` to ``False``. | +| to manage multiple processes. | | ++-----------------------------------------------------+---------------------------------------------------+ Also note that the core logging module only includes the basic handlers. If you don't import :mod:`logging.handlers` and :mod:`logging.config`, they won't diff --git a/Doc/howto/logging_flow.png b/Doc/howto/logging_flow.png index d65e597f811db5e0a70e6c3ce7124e23b6be86de..fac4acd775530259deeef077a125fb2e6fb5502b 100644 GIT binary patch literal 22058 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 GxBmyOs;SEW diff --git a/Doc/howto/regex.rst b/Doc/howto/regex.rst index c4ebbd31..d574c373 100644 --- a/Doc/howto/regex.rst +++ b/Doc/howto/regex.rst @@ -89,7 +89,7 @@ is the same as ``[a-c]``, which uses a range to express the same set of characters. If you wanted to match only lowercase letters, your RE would be ``[a-z]``. -Metacharacters (except ``\``) are not active inside classes. For example, ``[akm$]`` will +Metacharacters are not active inside classes. For example, ``[akm$]`` will match any of the characters ``'a'``, ``'k'``, ``'m'``, or ``'$'``; ``'$'`` is usually a metacharacter, but inside a character class it's stripped of its special nature. diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst index d6ed128e..e58f78a7 100644 --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -45,7 +45,7 @@ likely to be other forms of IPC that are faster, but for cross-platform communication, sockets are about the only game in town. They were invented in Berkeley as part of the BSD flavor of Unix. They spread -like wildfire with the Internet. With good reason --- the combination of sockets +like wildfire with the internet. With good reason --- the combination of sockets with INET makes talking to arbitrary machines around the world unbelievably easy (at least compared to other schemes). diff --git a/Doc/howto/sorting.rst b/Doc/howto/sorting.rst index be017cfb..37328c82 100644 --- a/Doc/howto/sorting.rst +++ b/Doc/howto/sorting.rst @@ -18,7 +18,9 @@ Sorting Basics ============== A simple ascending sort is very easy: just call the :func:`sorted` function. It -returns a new sorted list:: +returns a new sorted list: + +.. doctest:: >>> sorted([5, 2, 3, 1, 4]) [1, 2, 3, 4, 5] @@ -28,6 +30,8 @@ in-place (and returns ``None`` to avoid confusion). Usually it's less convenient than :func:`sorted` - but if you don't need the original list, it's slightly more efficient. +.. doctest:: + >>> a = [5, 2, 3, 1, 4] >>> a.sort() >>> a @@ -36,6 +40,8 @@ more efficient. Another difference is that the :meth:`list.sort` method is only defined for lists. In contrast, the :func:`sorted` function accepts any iterable. +.. doctest:: + >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) [1, 2, 3, 4, 5] @@ -48,6 +54,8 @@ comparisons. For example, here's a case-insensitive string comparison: +.. doctest:: + >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] @@ -59,6 +67,8 @@ input record. A common pattern is to sort complex objects using some of the object's indices as keys. For example: +.. doctest:: + >>> student_tuples = [ ... ('john', 'A', 15), ... ('jane', 'B', 12), @@ -69,6 +79,8 @@ as keys. For example: The same technique works for objects with named attributes. For example: +.. doctest:: + >>> class Student: ... def __init__(self, name, grade, age): ... self.name = name @@ -95,6 +107,8 @@ convenience functions to make accessor functions easier and faster. The Using those functions, the above examples become simpler and faster: +.. doctest:: + >>> from operator import itemgetter, attrgetter >>> sorted(student_tuples, key=itemgetter(2)) @@ -106,6 +120,8 @@ Using those functions, the above examples become simpler and faster: The operator module functions allow multiple levels of sorting. For example, to sort by *grade* then by *age*: +.. doctest:: + >>> sorted(student_tuples, key=itemgetter(1,2)) [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] @@ -119,6 +135,8 @@ Both :meth:`list.sort` and :func:`sorted` accept a *reverse* parameter with a boolean value. This is used to flag descending sorts. For example, to get the student data in reverse *age* order: +.. doctest:: + >>> sorted(student_tuples, key=itemgetter(2), reverse=True) [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] @@ -132,6 +150,8 @@ Sorts are guaranteed to be `stable `_\. That means that when multiple records have the same key, their original order is preserved. +.. doctest:: + >>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] >>> sorted(data, key=itemgetter(0)) [('blue', 1), ('blue', 2), ('red', 1), ('red', 2)] @@ -143,6 +163,8 @@ This wonderful property lets you build complex sorts in a series of sorting steps. For example, to sort the student data by descending *grade* and then ascending *age*, do the *age* sort first and then sort again using *grade*: +.. doctest:: + >>> s = sorted(student_objects, key=attrgetter('age')) # sort on secondary key >>> sorted(s, key=attrgetter('grade'), reverse=True) # now sort on primary key, descending [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] @@ -150,6 +172,8 @@ ascending *age*, do the *age* sort first and then sort again using *grade*: This can be abstracted out into a wrapper function that can take a list and tuples of field and order to sort them on multiple passes. +.. doctest:: + >>> def multisort(xs, specs): ... for key, reverse in reversed(specs): ... xs.sort(key=attrgetter(key), reverse=reverse) @@ -220,6 +244,8 @@ comparisons. That function should take two arguments to be compared and then return a negative value for less-than, return zero if they are equal, or return a positive value for greater-than. For example, we can do: +.. doctest:: + >>> def numeric_compare(x, y): ... return x - y >>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare) # doctest: +SKIP @@ -227,6 +253,8 @@ a positive value for greater-than. For example, we can do: Or you can reverse the order of comparison with: +.. doctest:: + >>> def reverse_numeric(x, y): ... return y - x >>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric) # doctest: +SKIP @@ -234,7 +262,9 @@ Or you can reverse the order of comparison with: When porting code from Python 2.x to 3.x, the situation can arise when you have the user supplying a comparison function and you need to convert that to a key -function. The following wrapper makes that easy to do:: +function. The following wrapper makes that easy to do: + +.. testcode:: def cmp_to_key(mycmp): 'Convert a cmp= function into a key= function' @@ -255,6 +285,12 @@ function. The following wrapper makes that easy to do:: return mycmp(self.obj, other.obj) != 0 return K +.. doctest:: + :hide: + + >>> sorted([5, 2, 4, 1, 3], key=cmp_to_key(reverse_numeric)) + [5, 4, 3, 2, 1] + To convert to a key function, just wrap the old comparison function: .. testsetup:: @@ -280,6 +316,8 @@ Odd and Ends simulated without the parameter by using the builtin :func:`reversed` function twice: + .. doctest:: + >>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] >>> standard_way = sorted(data, key=itemgetter(0), reverse=True) >>> double_reversed = list(reversed(sorted(reversed(data), key=itemgetter(0)))) @@ -287,22 +325,23 @@ Odd and Ends >>> standard_way [('red', 1), ('red', 2), ('blue', 1), ('blue', 2)] -* The sort routines use ``<`` when making comparisons +* The sort routines are guaranteed to use :meth:`__lt__` when making comparisons between two objects. So, it is easy to add a standard sort order to a class by - defining an :meth:`__lt__` method:: + defining an :meth:`__lt__` method: + + .. doctest:: >>> Student.__lt__ = lambda self, other: self.age < other.age >>> sorted(student_objects) [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] - However, note that ``<`` can fall back to using :meth:`__gt__` if - :meth:`__lt__` is not implemented (see :func:`object.__lt__`). - * Key functions need not depend directly on the objects being sorted. A key function can also access external resources. For instance, if the student grades are stored in a dictionary, they can be used to sort a separate list of student names: + .. doctest:: + >>> students = ['dave', 'john', 'jane'] >>> newgrades = {'john': 'F', 'jane':'A', 'dave': 'C'} >>> sorted(students, key=newgrades.__getitem__) diff --git a/Doc/howto/unicode.rst b/Doc/howto/unicode.rst index e948c1e3..535b21bd 100644 --- a/Doc/howto/unicode.rst +++ b/Doc/howto/unicode.rst @@ -609,9 +609,9 @@ implemented by converting the Unicode string into some encoding that varies depending on the system. Today Python is converging on using UTF-8: Python on MacOS has used UTF-8 for several versions, and Python 3.6 switched to using UTF-8 on Windows as well. On Unix systems, -there will only be a filesystem encoding if you've set the ``LANG`` or -``LC_CTYPE`` environment variables; if you haven't, the default -encoding is again UTF-8. +there will only be a :term:`filesystem encoding `. if you've set the ``LANG`` or ``LC_CTYPE`` environment variables; if +you haven't, the default encoding is again UTF-8. The :func:`sys.getfilesystemencoding` function returns the encoding to use on your current system, in case you want to do the encoding manually, but there's @@ -633,8 +633,8 @@ provided the directory path as bytes or a Unicode string. If you pass a Unicode string as the path, filenames will be decoded using the filesystem's encoding and a list of Unicode strings will be returned, while passing a byte path will return the filenames as bytes. For example, -assuming the default filesystem encoding is UTF-8, running the following -program:: +assuming the default :term:`filesystem encoding ` is UTF-8, running the following program:: fn = 'filename\u4500abc' f = open(fn, 'w') diff --git a/Doc/includes/custom.c b/Doc/includes/custom.c index 26ca7549..f361baf8 100644 --- a/Doc/includes/custom.c +++ b/Doc/includes/custom.c @@ -9,7 +9,7 @@ typedef struct { static PyTypeObject CustomType = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom.Custom", - .tp_doc = PyDoc_STR("Custom objects"), + .tp_doc = "Custom objects", .tp_basicsize = sizeof(CustomObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT, diff --git a/Doc/includes/custom2.c b/Doc/includes/custom2.c index 2a3c59f8..5bacab7a 100644 --- a/Doc/includes/custom2.c +++ b/Doc/includes/custom2.c @@ -98,7 +98,7 @@ static PyMethodDef Custom_methods[] = { static PyTypeObject CustomType = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom2.Custom", - .tp_doc = PyDoc_STR("Custom objects"), + .tp_doc = "Custom objects", .tp_basicsize = sizeof(CustomObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, diff --git a/Doc/includes/custom3.c b/Doc/includes/custom3.c index 5a47530f..2b7a99ec 100644 --- a/Doc/includes/custom3.c +++ b/Doc/includes/custom3.c @@ -148,7 +148,7 @@ static PyMethodDef Custom_methods[] = { static PyTypeObject CustomType = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom3.Custom", - .tp_doc = PyDoc_STR("Custom objects"), + .tp_doc = "Custom objects", .tp_basicsize = sizeof(CustomObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, diff --git a/Doc/includes/custom4.c b/Doc/includes/custom4.c index c7ee5557..584992fc 100644 --- a/Doc/includes/custom4.c +++ b/Doc/includes/custom4.c @@ -160,7 +160,7 @@ static PyMethodDef Custom_methods[] = { static PyTypeObject CustomType = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "custom4.Custom", - .tp_doc = PyDoc_STR("Custom objects"), + .tp_doc = "Custom objects", .tp_basicsize = sizeof(CustomObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py index c0d87cd5..a857a155 100644 --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -3,9 +3,9 @@ import sqlite3 con = sqlite3.connect(":memory:") cur = con.cursor() -AUSTRIA = "Österreich" +AUSTRIA = "\xd6sterreich" -# by default, rows are returned as str +# by default, rows are returned as Unicode cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert row[0] == AUSTRIA diff --git a/Doc/includes/sublist.c b/Doc/includes/sublist.c index b36dadf0..b2c26e73 100644 --- a/Doc/includes/sublist.c +++ b/Doc/includes/sublist.c @@ -31,7 +31,7 @@ SubList_init(SubListObject *self, PyObject *args, PyObject *kwds) static PyTypeObject SubListType = { PyVarObject_HEAD_INIT(NULL, 0) .tp_name = "sublist.SubList", - .tp_doc = PyDoc_STR("SubList objects"), + .tp_doc = "SubList objects", .tp_basicsize = sizeof(SubListObject), .tp_itemsize = 0, .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, diff --git a/Doc/includes/typestruct.h b/Doc/includes/typestruct.h index 9ada03cf..02f8ccfe 100644 --- a/Doc/includes/typestruct.h +++ b/Doc/includes/typestruct.h @@ -35,12 +35,14 @@ typedef struct _typeobject { const char *tp_doc; /* Documentation string */ + /* Assigned meaning in release 2.0 */ /* call function for all accessible objects */ traverseproc tp_traverse; /* delete references to contained objects */ inquiry tp_clear; + /* Assigned meaning in release 2.1 */ /* rich comparisons */ richcmpfunc tp_richcompare; @@ -55,6 +57,7 @@ typedef struct _typeobject { struct PyMethodDef *tp_methods; struct PyMemberDef *tp_members; struct PyGetSetDef *tp_getset; + // Strong reference on a heap type, borrowed reference on a static type struct _typeobject *tp_base; PyObject *tp_dict; descrgetfunc tp_descr_get; @@ -76,5 +79,5 @@ typedef struct _typeobject { unsigned int tp_version_tag; destructor tp_finalize; - + vectorcallfunc tp_vectorcall; } PyTypeObject; diff --git a/Doc/install/index.rst b/Doc/install/index.rst index eb4de247..7f7be117 100644 --- a/Doc/install/index.rst +++ b/Doc/install/index.rst @@ -10,6 +10,13 @@ .. TODO: Fill in XXX comments +.. note:: + + The entire ``distutils`` package has been deprecated and will be + removed in Python 3.12. This documentation is retained as a + reference only, and will be removed with the package. See the + :ref:`What's New ` entry for more information. + .. seealso:: :ref:`installing-index` @@ -946,7 +953,7 @@ Borland/CodeGear C++ This subsection describes the necessary steps to use Distutils with the Borland C++ compiler version 5.5. First you have to know that Borland's object file format (OMF) is different from the format used by the Python version you can -download from the Python or ActiveState Web site. (Python is built with +download from the Python or ActiveState web site. (Python is built with Microsoft Visual C++, which uses COFF as the object file format.) For this reason you have to convert Python's library :file:`python25.lib` into the Borland format. You can do this as follows: diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index 36c051db..2a13776e 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -333,8 +333,7 @@ and off individually. They are described here in more detail. .. 2to3fixer:: nonzero - Renames definitions of methods called :meth:`__nonzero__` - to :meth:`~object.__bool__`. + Renames :meth:`__nonzero__` to :meth:`~object.__bool__`. .. 2to3fixer:: numliterals @@ -465,12 +464,15 @@ and off individually. They are described here in more detail. -------------- -.. deprecated:: 3.10 - Python 3.9 will switch to a PEG parser (see :pep:`617`), and Python 3.10 may - include new language syntax that is not parsable by lib2to3's LL(1) parser. - The ``lib2to3`` module may be removed from the standard library in a future - Python version. Consider third-party alternatives such as `LibCST`_ or - `parso`_. +.. deprecated-removed:: 3.11 3.13 + Python 3.9 switched to a PEG parser (see :pep:`617`) while lib2to3 is + using a less flexible LL(1) parser. Python 3.10 includes new language + syntax that is not parsable by lib2to3's LL(1) parser (see :pep:`634`). + The ``lib2to3`` module was marked pending for deprecation in Python 3.9 + (raising :exc:`PendingDeprecationWarning` on import) and fully deprecated + in Python 3.11 (raising :exc:`DeprecationWarning`). + It will be removed from the standard library in Python 3.13. + Consider third-party alternatives such as `LibCST`_ or `parso`_. .. note:: diff --git a/Doc/library/__future__.rst b/Doc/library/__future__.rst index 8bd23dae..24bbd90d 100644 --- a/Doc/library/__future__.rst +++ b/Doc/library/__future__.rst @@ -90,20 +90,12 @@ language using this mechanism: | generator_stop | 3.5.0b1 | 3.7 | :pep:`479`: | | | | | *StopIteration handling inside generators* | +------------------+-------------+--------------+---------------------------------------------+ -| annotations | 3.7.0b1 | TBD [1]_ | :pep:`563`: | +| annotations | 3.7.0b1 | 3.11 | :pep:`563`: | | | | | *Postponed evaluation of annotations* | +------------------+-------------+--------------+---------------------------------------------+ .. XXX Adding a new entry? Remember to update simple_stmts.rst, too. -.. [1] - ``from __future__ import annotations`` was previously scheduled to - become mandatory in Python 3.10, but the Python Steering Council - twice decided to delay the change - (`announcement for Python 3.10 `__; - `announcement for Python 3.11 `__). - No final decision has been made yet. See also :pep:`563` and :pep:`649`. - .. seealso:: diff --git a/Doc/library/__main__.rst b/Doc/library/__main__.rst index a64faf1b..116a9a9d 100644 --- a/Doc/library/__main__.rst +++ b/Doc/library/__main__.rst @@ -1,25 +1,368 @@ - -:mod:`__main__` --- Top-level script environment -================================================ +:mod:`__main__` --- Top-level code environment +============================================== .. module:: __main__ - :synopsis: The environment where the top-level script is run. + :synopsis: The environment where top-level code is run. Covers command-line + interfaces, import-time behavior, and ``__name__ == '__main__'``. -------------- -``'__main__'`` is the name of the scope in which top-level code executes. -A module's __name__ is set equal to ``'__main__'`` when read from -standard input, a script, or from an interactive prompt. +In Python, the special name ``__main__`` is used for two important constructs: + +1. the name of the top-level environment of the program, which can be + checked using the ``__name__ == '__main__'`` expression; and +2. the ``__main__.py`` file in Python packages. + +Both of these mechanisms are related to Python modules; how users interact with +them and how they interact with each other. They are explained in detail +below. If you're new to Python modules, see the tutorial section +:ref:`tut-modules` for an introduction. + + +.. _name_equals_main: + +``__name__ == '__main__'`` +--------------------------- + +When a Python module or package is imported, ``__name__`` is set to the +module's name. Usually, this is the name of the Python file itself without the +``.py`` extension:: + + >>> import configparser + >>> configparser.__name__ + 'configparser' + +If the file is part of a package, ``__name__`` will also include the parent +package's path:: + + >>> from concurrent.futures import process + >>> process.__name__ + 'concurrent.futures.process' + +However, if the module is executed in the top-level code environment, +its ``__name__`` is set to the string ``'__main__'``. + +What is the "top-level code environment"? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +``__main__`` is the name of the environment where top-level code is run. +"Top-level code" is the first user-specified Python module that starts running. +It's "top-level" because it imports all other modules that the program needs. +Sometimes "top-level code" is called an *entry point* to the application. + +The top-level code environment can be: + +* the scope of an interactive prompt:: + + >>> __name__ + '__main__' + +* the Python module passed to the Python interpreter as a file argument: + + .. code-block:: shell-session + + $ python3 helloworld.py + Hello, world! + +* the Python module or package passed to the Python interpreter with the + :option:`-m` argument: + + .. code-block:: shell-session + + $ python3 -m tarfile + usage: tarfile.py [-h] [-v] (...) + +* Python code read by the Python interpreter from standard input: + + .. code-block:: shell-session + + $ echo "import this" | python3 + The Zen of Python, by Tim Peters + + Beautiful is better than ugly. + Explicit is better than implicit. + ... + +* Python code passed to the Python interpreter with the :option:`-c` argument: + + .. code-block:: shell-session + + $ python3 -c "import this" + The Zen of Python, by Tim Peters + + Beautiful is better than ugly. + Explicit is better than implicit. + ... + +In each of these situations, the top-level module's ``__name__`` is set to +``'__main__'``. + +As a result, a module can discover whether or not it is running in the +top-level environment by checking its own ``__name__``, which allows a common +idiom for conditionally executing code when the module is not initialized from +an import statement:: + + if __name__ == '__main__': + # Execute when the module is not initialized from an import statement. + ... + +.. seealso:: + + For a more detailed look at how ``__name__`` is set in all situations, see + the tutorial section :ref:`tut-modules`. + + +Idiomatic Usage +^^^^^^^^^^^^^^^ + +Some modules contain code that is intended for script use only, like parsing +command-line arguments or fetching data from standard input. When a module +like this were to be imported from a different module, for example to unit test +it, the script code would unintentionally execute as well. + +This is where using the ``if __name__ == '__main__'`` code block comes in +handy. Code within this block won't run unless the module is executed in the +top-level environment. + +Putting as few statements as possible in the block below ``if __name___ == +'__main__'`` can improve code clarity and correctness. Most often, a function +named ``main`` encapsulates the program's primary behavior:: + + # echo.py + + import shlex + import sys + + def echo(phrase: str) -> None: + """A dummy wrapper around print.""" + # for demonstration purposes, you can imagine that there is some + # valuable and reusable logic inside this function + print(phrase) + + def main() -> int: + """Echo the input arguments to standard output""" + phrase = shlex.join(sys.argv) + echo(phrase) + return 0 + + if __name__ == '__main__': + sys.exit(main()) # next section explains the use of sys.exit + +Note that if the module didn't encapsulate code inside the ``main`` function +but instead put it directly within the ``if __name__ == '__main__'`` block, +the ``phrase`` variable would be global to the entire module. This is +error-prone as other functions within the module could be unintentionally using +the global variable instead of a local name. A ``main`` function solves this +problem. + +Using a ``main`` function has the added benefit of the ``echo`` function itself +being isolated and importable elsewhere. When ``echo.py`` is imported, the +``echo`` and ``main`` functions will be defined, but neither of them will be +called, because ``__name__ != '__main__'``. + + +Packaging Considerations +^^^^^^^^^^^^^^^^^^^^^^^^ + +``main`` functions are often used to create command-line tools by specifying +them as entry points for console scripts. When this is done, +`pip `_ inserts the function call into a template script, +where the return value of ``main`` is passed into :func:`sys.exit`. +For example:: + + sys.exit(main()) + +Since the call to ``main`` is wrapped in :func:`sys.exit`, the expectation is +that your function will return some value acceptable as an input to +:func:`sys.exit`; typically, an integer or ``None`` (which is implicitly +returned if your function does not have a return statement). + +By proactively following this convention ourselves, our module will have the +same behavior when run directly (i.e. ``python3 echo.py``) as it will have if +we later package it as a console script entry-point in a pip-installable +package. + +In particular, be careful about returning strings from your ``main`` function. +:func:`sys.exit` will interpret a string argument as a failure message, so +your program will have an exit code of ``1``, indicating failure, and the +string will be written to :data:`sys.stderr`. The ``echo.py`` example from +earlier exemplifies using the ``sys.exit(main())`` convention. + +.. seealso:: + + `Python Packaging User Guide `_ + contains a collection of tutorials and references on how to distribute and + install Python packages with modern tools. + + +``__main__.py`` in Python Packages +---------------------------------- + +If you are not familiar with Python packages, see section :ref:`tut-packages` +of the tutorial. Most commonly, the ``__main__.py`` file is used to provide +a command-line interface for a package. Consider the following hypothetical +package, "bandclass": + +.. code-block:: text + + bandclass + ├── __init__.py + ├── __main__.py + └── student.py + +``__main__.py`` will be executed when the package itself is invoked +directly from the command line using the :option:`-m` flag. For example: + +.. code-block:: shell-session + + $ python3 -m bandclass + +This command will cause ``__main__.py`` to run. How you utilize this mechanism +will depend on the nature of the package you are writing, but in this +hypothetical case, it might make sense to allow the teacher to search for +students:: + + # bandclass/__main__.py + + import sys + from .student import search_students + + student_name = sys.argv[2] if len(sys.argv) >= 2 else '' + print(f'Found student: {search_students(student_name)}') + +Note that ``from .student import search_students`` is an example of a relative +import. This import style must be used when referencing modules within a +package. For more details, see :ref:`intra-package-references` in the +:ref:`tut-modules` section of the tutorial. + +Idiomatic Usage +^^^^^^^^^^^^^^^ + +The contents of ``__main__.py`` typically isn't fenced with +``if __name__ == '__main__'`` blocks. Instead, those files are kept short, +functions to execute from other modules. Those other modules can then be +easily unit-tested and are properly reusable. + +If used, an ``if __name__ == '__main__'`` block will still work as expected +for a ``__main__.py`` file within a package, because its ``__name__`` +attribute will include the package's path if imported:: + + >>> import asyncio.__main__ + >>> asyncio.__main__.__name__ + 'asyncio.__main__' + +This won't work for ``__main__.py`` files in the root directory of a .zip file +though. Hence, for consistency, minimal ``__main__.py`` like the :mod:`venv` +one mentioned above are preferred. + +.. seealso:: + + See :mod:`venv` for an example of a package with a minimal ``__main__.py`` + in the standard library. It doesn't contain a ``if __name__ == '__main__'`` + block. You can invoke it with ``python3 -m venv [directory]``. + + See :mod:`runpy` for more details on the :option:`-m` flag to the + interpreter executable. + + See :mod:`zipapp` for how to run applications packaged as *.zip* files. In + this case Python looks for a ``__main__.py`` file in the root directory of + the archive. + + + +``import __main__`` +------------------- + +Regardless of which module a Python program was started with, other modules +running within that same program can import the top-level environment's scope +(:term:`namespace`) by importing the ``__main__`` module. This doesn't import +a ``__main__.py`` file but rather whichever module that received the special +name ``'__main__'``. + +Here is an example module that consumes the ``__main__`` namespace:: + + # namely.py + + import __main__ + + def did_user_define_their_name(): + return 'my_name' in dir(__main__) + + def print_user_name(): + if not did_user_define_their_name(): + raise ValueError('Define the variable `my_name`!') + + if '__file__' in dir(__main__): + print(__main__.my_name, "found in file", __main__.__file__) + else: + print(__main__.my_name) + +Example usage of this module could be as follows:: + + # start.py + + import sys + + from namely import print_user_name + + # my_name = "Dinsdale" + + def main(): + try: + print_user_name() + except ValueError as ve: + return str(ve) + + if __name__ == "__main__": + sys.exit(main()) + +Now, if we started our program, the result would look like this: + +.. code-block:: shell-session + + $ python3 start.py + Define the variable `my_name`! + +The exit code of the program would be 1, indicating an error. Uncommenting the +line with ``my_name = "Dinsdale"`` fixes the program and now it exits with +status code 0, indicating success: + +.. code-block:: shell-session + + $ python3 start.py + Dinsdale found in file /path/to/start.py + +Note that importing ``__main__`` doesn't cause any issues with unintentionally +running top-level code meant for script use which is put in the +``if __name__ == "__main__"`` block of the ``start`` module. Why does this work? + +Python inserts an empty ``__main__`` module in :attr:`sys.modules` at +interpreter startup, and populates it by running top-level code. In our example +this is the ``start`` module which runs line by line and imports ``namely``. +In turn, ``namely`` imports ``__main__`` (which is really ``start``). That's an +import cycle! Fortunately, since the partially populated ``__main__`` +module is present in :attr:`sys.modules`, Python passes that to ``namely``. +See :ref:`Special considerations for __main__ ` in the +import system's reference for details on how this works. + +The Python REPL is another example of a "top-level environment", so anything +defined in the REPL becomes part of the ``__main__`` scope:: -A module can discover whether or not it is running in the main scope by -checking its own ``__name__``, which allows a common idiom for conditionally -executing code in a module when it is run as a script or with ``python --m`` but not when it is imported:: + >>> import namely + >>> namely.did_user_define_their_name() + False + >>> namely.print_user_name() + Traceback (most recent call last): + ... + ValueError: Define the variable `my_name`! + >>> my_name = 'Jabberwocky' + >>> namely.did_user_define_their_name() + True + >>> namely.print_user_name() + Jabberwocky - if __name__ == "__main__": - # execute only if run as a script - main() +Note that in this case the ``__main__`` scope doesn't contain a ``__file__`` +attribute as it's interactive. -For a package, the same effect can be achieved by including a -``__main__.py`` module, the contents of which will be executed when the -module is run with ``-m``. +The ``__main__`` scope is used in the implementation of :mod:`pdb` and +:mod:`rlcompleter`. diff --git a/Doc/library/_thread.rst b/Doc/library/_thread.rst index bd653ab3..1e6452b7 100644 --- a/Doc/library/_thread.rst +++ b/Doc/library/_thread.rst @@ -61,15 +61,27 @@ This module defines the following constants and functions: :func:`sys.unraisablehook` is now used to handle unhandled exceptions. -.. function:: interrupt_main() +.. function:: interrupt_main(signum=signal.SIGINT, /) - Simulate the effect of a :data:`signal.SIGINT` signal arriving in the main - thread. A thread can use this function to interrupt the main thread. + Simulate the effect of a signal arriving in the main thread. + A thread can use this function to interrupt the main thread, though + there is no guarantee that the interruption will happen immediately. - If :data:`signal.SIGINT` isn't handled by Python (it was set to + If given, *signum* is the number of the signal to simulate. + If *signum* is not given, :data:`signal.SIGINT` is simulated. + + If the given signal isn't handled by Python (it was set to :data:`signal.SIG_DFL` or :data:`signal.SIG_IGN`), this function does nothing. + .. versionchanged:: 3.10 + The *signum* argument is added to customize the signal number. + + .. note:: + This does not emit the corresponding signal but schedules a call to + the associated handler (if it exists). + If you want to truly emit the signal, use :func:`signal.raise_signal`. + .. function:: exit() diff --git a/Doc/library/abc.rst b/Doc/library/abc.rst index 35be01e8..1a6ed474 100644 --- a/Doc/library/abc.rst +++ b/Doc/library/abc.rst @@ -174,10 +174,11 @@ The :mod:`abc` module also provides the following decorator: to declare abstract methods for properties and descriptors. Dynamically adding abstract methods to a class, or attempting to modify the - abstraction status of a method or class once it is created, are not - supported. The :func:`abstractmethod` only affects subclasses derived using - regular inheritance; "virtual subclasses" registered with the ABC's - :meth:`register` method are not affected. + abstraction status of a method or class once it is created, are only + supported using the :func:`update_abstractmethods` function. The + :func:`abstractmethod` only affects subclasses derived using regular + inheritance; "virtual subclasses" registered with the ABC's :meth:`register` + method are not affected. When :func:`abstractmethod` is applied in combination with other method descriptors, it should be applied as the innermost decorator, as shown in @@ -185,15 +186,15 @@ The :mod:`abc` module also provides the following decorator: class C(ABC): @abstractmethod - def my_abstract_method(self, arg1): + def my_abstract_method(self, ...): ... @classmethod @abstractmethod - def my_abstract_classmethod(cls, arg2): + def my_abstract_classmethod(cls, ...): ... @staticmethod @abstractmethod - def my_abstract_staticmethod(arg3): + def my_abstract_staticmethod(...): ... @property @@ -235,7 +236,6 @@ The :mod:`abc` module also provides the following decorator: super-call in a framework that uses cooperative multiple-inheritance. - The :mod:`abc` module also supports the following legacy decorators: .. decorator:: abstractclassmethod @@ -255,7 +255,7 @@ The :mod:`abc` module also supports the following legacy decorators: class C(ABC): @classmethod @abstractmethod - def my_abstract_classmethod(cls, arg): + def my_abstract_classmethod(cls, ...): ... @@ -276,7 +276,7 @@ The :mod:`abc` module also supports the following legacy decorators: class C(ABC): @staticmethod @abstractmethod - def my_abstract_staticmethod(arg): + def my_abstract_staticmethod(...): ... @@ -335,6 +335,23 @@ The :mod:`abc` module also provides the following functions: .. versionadded:: 3.4 +.. function:: update_abstractmethods(cls) + + A function to recalculate an abstract class's abstraction status. This + function should be called if a class's abstract methods have been + implemented or changed after it was created. Usually, this function should + be called from within a class decorator. + + Returns *cls*, to allow usage as a class decorator. + + If *cls* is not an instance of :class:`ABCMeta`, does nothing. + + .. note:: + + This function assumes that *cls*'s superclasses are already updated. + It does not update any subclasses. + + .. versionadded:: 3.10 .. rubric:: Footnotes diff --git a/Doc/library/aifc.rst b/Doc/library/aifc.rst index fa277857..2e917cf7 100644 --- a/Doc/library/aifc.rst +++ b/Doc/library/aifc.rst @@ -3,7 +3,6 @@ .. module:: aifc :synopsis: Read and write audio files in AIFF or AIFC format. - :deprecated: **Source code:** :source:`Lib/aifc.py` @@ -12,11 +11,6 @@ single: AIFF single: AIFF-C - -.. deprecated:: 3.11 - The :mod:`aifc` module is deprecated - (see :pep:`PEP 594 <594#aifc>` for details). - -------------- This module provides support for reading and writing AIFF and AIFF-C files. diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst index 8989d1ce..a0568267 100644 --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -57,7 +57,7 @@ be run at the command line and provides useful help messages: positional arguments: N an integer for the accumulator - optional arguments: + options: -h, --help show this help message and exit --sum sum the integers (default: find the max) @@ -217,14 +217,14 @@ The help for this program will display ``myprogram.py`` as the program name $ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help $ cd .. $ python subdir/myprogram.py --help usage: myprogram.py [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help @@ -235,7 +235,7 @@ To change this default behavior, another value can be supplied using the >>> parser.print_help() usage: myprogram [-h] - optional arguments: + options: -h, --help show this help message and exit Note that the program name, whether determined from ``sys.argv[0]`` or from the @@ -249,7 +249,7 @@ specifier. >>> parser.print_help() usage: myprogram [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo of the myprogram program @@ -269,7 +269,7 @@ arguments it contains:: positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit --foo [FOO] foo help @@ -284,7 +284,7 @@ The default message can be overridden with the ``usage=`` keyword argument:: positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit --foo [FOO] foo help @@ -307,7 +307,7 @@ various arguments:: A foo that bars - optional arguments: + options: -h, --help show this help message and exit By default, the description will be line-wrapped so that it fits within the @@ -329,7 +329,7 @@ argument to :class:`ArgumentParser`:: A foo that bars - optional arguments: + options: -h, --help show this help message and exit And that's how you'd foo a bar @@ -403,7 +403,7 @@ epilog_ texts in command-line help messages:: this description was indented weird but that is okay - optional arguments: + options: -h, --help show this help message and exit likewise for this epilog whose whitespace will be cleaned up and whose words @@ -432,7 +432,7 @@ should not be line-wrapped:: exactly the way I want it - optional arguments: + options: -h, --help show this help message and exit :class:`RawTextHelpFormatter` maintains whitespace for all sorts of help text, @@ -454,7 +454,7 @@ default values to each of the argument help messages:: positional arguments: bar BAR! (default: [1, 2, 3]) - optional arguments: + options: -h, --help show this help message and exit --foo FOO FOO! (default: 42) @@ -473,7 +473,7 @@ as the regular formatter does):: positional arguments: float - optional arguments: + options: -h, --help show this help message and exit --foo int @@ -501,7 +501,7 @@ disallowed. fromfile_prefix_chars ^^^^^^^^^^^^^^^^^^^^^ -Sometimes, for example when dealing with a particularly long argument list, it +Sometimes, for example when dealing with a particularly long argument lists, it may make sense to keep the list of arguments in a file rather than typing it out at the command line. If the ``fromfile_prefix_chars=`` argument is given to the :class:`ArgumentParser` constructor, then arguments that start with any of the @@ -592,7 +592,7 @@ older arguments with the same option string. To get this behavior, the value >>> parser.print_help() usage: PROG [-h] [-f FOO] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit -f FOO old foo help --foo FOO new foo help @@ -623,7 +623,7 @@ help will be printed: $ python myprogram.py --help usage: myprogram.py [-h] [--foo FOO] - optional arguments: + options: -h, --help show this help message and exit --foo FOO foo help @@ -636,7 +636,7 @@ This can be achieved by passing ``False`` as the ``add_help=`` argument to >>> parser.print_help() usage: PROG [--foo FOO] - optional arguments: + options: --foo FOO foo help The help option is typically ``-h/--help``. The exception to this is @@ -649,7 +649,7 @@ the help options:: >>> parser.print_help() usage: PROG [+h] - optional arguments: + options: +h, ++help show this help message and exit @@ -1205,7 +1205,7 @@ argument:: positional arguments: bar one of the bars to be frobbled - optional arguments: + options: -h, --help show this help message and exit --foo foo the bars before frobbling @@ -1223,7 +1223,7 @@ specifiers include the program name, ``%(prog)s`` and most keyword arguments to positional arguments: bar the bar to frobble (default: 42) - optional arguments: + options: -h, --help show this help message and exit As the help string supports %-formatting, if you want a literal ``%`` to appear @@ -1237,7 +1237,7 @@ setting the ``help`` value to ``argparse.SUPPRESS``:: >>> parser.print_help() usage: frobble [-h] - optional arguments: + options: -h, --help show this help message and exit @@ -1264,7 +1264,7 @@ will be referred to as ``FOO``. An example:: positional arguments: bar - optional arguments: + options: -h, --help show this help message and exit --foo FOO @@ -1281,7 +1281,7 @@ An alternative name can be specified with ``metavar``:: positional arguments: XXX - optional arguments: + options: -h, --help show this help message and exit --foo YYY @@ -1299,7 +1299,7 @@ arguments:: >>> parser.print_help() usage: PROG [-h] [-x X X] [--foo bar baz] - optional arguments: + options: -h, --help show this help message and exit -x X X --foo bar baz @@ -1703,7 +1703,7 @@ Sub-commands a a help b b help - optional arguments: + options: -h, --help show this help message and exit --foo foo help @@ -1713,13 +1713,13 @@ Sub-commands positional arguments: bar bar help - optional arguments: + options: -h, --help show this help message and exit >>> parser.parse_args(['b', '--help']) usage: PROG b [-h] [--baz {X,Y,Z}] - optional arguments: + options: -h, --help show this help message and exit --baz {X,Y,Z} baz help @@ -1736,7 +1736,7 @@ Sub-commands >>> parser.parse_args(['-h']) usage: [-h] {foo,bar} ... - optional arguments: + options: -h, --help show this help message and exit subcommands: diff --git a/Doc/library/array.rst b/Doc/library/array.rst index f892d098..c7f137d1 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -177,11 +177,15 @@ The following data items and methods are also supported: array of some other type. -.. method:: array.index(x) +.. method:: array.index(x[, start[, stop]]) Return the smallest *i* such that *i* is the index of the first occurrence of - *x* in the array. + *x* in the array. The optional arguments *start* and *stop* can be + specified to search for *x* within a subsection of the array. Raise + :exc:`ValueError` if *x* is not found. + .. versionchanged:: 3.10 + Added optional *start* and *stop* parameters. .. method:: array.insert(i, x) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 149179d5..d84c841f 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -81,12 +81,12 @@ Node classes Instances of :class:`ast.expr` and :class:`ast.stmt` subclasses have :attr:`lineno`, :attr:`col_offset`, :attr:`end_lineno`, and - :attr:`end_col_offset` attributes. The :attr:`lineno` and - :attr:`end_lineno` are the first and last line numbers of the source - text span (1-indexed so the first line is line 1), and the - :attr:`col_offset` and :attr:`end_col_offset` are the corresponding - UTF-8 byte offsets of the first and last tokens that generated the node. - The UTF-8 offset is recorded because the parser uses UTF-8 internally. + :attr:`end_col_offset` attributes. The :attr:`lineno` and :attr:`end_lineno` + are the first and last line numbers of source text span (1-indexed so the + first line is line 1) and the :attr:`col_offset` and :attr:`end_col_offset` + are the corresponding UTF-8 byte offsets of the first and last tokens that + generated the node. The UTF-8 offset is recorded because the parser uses + UTF-8 internally. Note that the end positions are not required by the compiler and are therefore optional. The end offset is *after* the last symbol, for example @@ -838,7 +838,7 @@ Statements context), ``op`` is :class:`Add`, and ``value`` is a :class:`Constant` with value for 1. - The ``target`` attribute connot be of class :class:`Tuple` or :class:`List`, + The ``target`` attribute cannot be of class :class:`Tuple` or :class:`List`, unlike the targets of :class:`Assign`. .. doctest:: @@ -1245,6 +1245,374 @@ Control flow type_ignores=[]) +Pattern matching +^^^^^^^^^^^^^^^^ + + +.. class:: Match(subject, cases) + + A ``match`` statement. ``subject`` holds the subject of the match (the object + that is being matched against the cases) and ``cases`` contains an iterable of + :class:`match_case` nodes with the different cases. + +.. class:: match_case(pattern, guard, body) + + A single case pattern in a ``match`` statement. ``pattern`` contains the + match pattern that the subject will be matched against. Note that the + :class:`AST` nodes produced for patterns differ from those produced for + expressions, even when they share the same syntax. + + The ``guard`` attribute contains an expression that will be evaluated if + the pattern matches the subject. + + ``body`` contains a list of nodes to execute if the pattern matches and + the result of evaluating the guard expression is true. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case [x] if x>0: + ... ... + ... case tuple(): + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchSequence( + patterns=[ + MatchAs(name='x')]), + guard=Compare( + left=Name(id='x', ctx=Load()), + ops=[ + Gt()], + comparators=[ + Constant(value=0)]), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + match_case( + pattern=MatchClass( + cls=Name(id='tuple', ctx=Load()), + patterns=[], + kwd_attrs=[], + kwd_patterns=[]), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchValue(value) + + A match literal or value pattern that compares by equality. ``value`` is + an expression node. Permitted value nodes are restricted as described in + the match statement documentation. This pattern succeeds if the match + subject is equal to the evaluated value. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case "Relevant": + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchValue( + value=Constant(value='Relevant')), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchSingleton(value) + + A match literal pattern that compares by identity. ``value`` is the + singleton to be compared against: ``None``, ``True``, or ``False``. This + pattern succeeds if the match subject is the given constant. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case None: + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchSingleton(value=None), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchSequence(patterns) + + A match sequence pattern. ``patterns`` contains the patterns to be matched + against the subject elements if the subject is a sequence. Matches a variable + length sequence if one of the subpatterns is a ``MatchStar`` node, otherwise + matches a fixed length sequence. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case [1, 2]: + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchSequence( + patterns=[ + MatchValue( + value=Constant(value=1)), + MatchValue( + value=Constant(value=2))]), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchStar(name) + + Matches the rest of the sequence in a variable length match sequence pattern. + If ``name`` is not ``None``, a list containing the remaining sequence + elements is bound to that name if the overall sequence pattern is successful. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case [1, 2, *rest]: + ... ... + ... case [*_]: + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchSequence( + patterns=[ + MatchValue( + value=Constant(value=1)), + MatchValue( + value=Constant(value=2)), + MatchStar(name='rest')]), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + match_case( + pattern=MatchSequence( + patterns=[ + MatchStar()]), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchMapping(keys, patterns, rest) + + A match mapping pattern. ``keys`` is a sequence of expression nodes. + ``patterns`` is a corresponding sequence of pattern nodes. ``rest`` is an + optional name that can be specified to capture the remaining mapping elements. + Permitted key expressions are restricted as described in the match statement + documentation. + + This pattern succeeds if the subject is a mapping, all evaluated key + expressions are present in the mapping, and the value corresponding to each + key matches the corresponding subpattern. If ``rest`` is not ``None``, a dict + containing the remaining mapping elements is bound to that name if the overall + mapping pattern is successful. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case {1: _, 2: _}: + ... ... + ... case {**rest}: + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchMapping( + keys=[ + Constant(value=1), + Constant(value=2)], + patterns=[ + MatchAs(), + MatchAs()]), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + match_case( + pattern=MatchMapping(keys=[], patterns=[], rest='rest'), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchClass(cls, patterns, kwd_attrs, kwd_patterns) + + A match class pattern. ``cls`` is an expression giving the nominal class to + be matched. ``patterns`` is a sequence of pattern nodes to be matched against + the class defined sequence of pattern matching attributes. ``kwd_attrs`` is a + sequence of additional attributes to be matched (specified as keyword arguments + in the class pattern), ``kwd_patterns`` are the corresponding patterns + (specified as keyword values in the class pattern). + + This pattern succeeds if the subject is an instance of the nominated class, + all positional patterns match the corresponding class-defined attributes, and + any specified keyword attributes match their corresponding pattern. + + Note: classes may define a property that returns self in order to match a + pattern node against the instance being matched. Several builtin types are + also matched that way, as described in the match statement documentation. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case Point2D(0, 0): + ... ... + ... case Point3D(x=0, y=0, z=0): + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchClass( + cls=Name(id='Point2D', ctx=Load()), + patterns=[ + MatchValue( + value=Constant(value=0)), + MatchValue( + value=Constant(value=0))], + kwd_attrs=[], + kwd_patterns=[]), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + match_case( + pattern=MatchClass( + cls=Name(id='Point3D', ctx=Load()), + patterns=[], + kwd_attrs=[ + 'x', + 'y', + 'z'], + kwd_patterns=[ + MatchValue( + value=Constant(value=0)), + MatchValue( + value=Constant(value=0)), + MatchValue( + value=Constant(value=0))]), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchAs(pattern, name) + + A match "as-pattern", capture pattern or wildcard pattern. ``pattern`` + contains the match pattern that the subject will be matched against. + If the pattern is ``None``, the node represents a capture pattern (i.e a + bare name) and will always succeed. + + The ``name`` attribute contains the name that will be bound if the pattern + is successful. If ``name`` is ``None``, ``pattern`` must also be ``None`` + and the node represents the wildcard pattern. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case [x] as y: + ... ... + ... case _: + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchAs( + pattern=MatchSequence( + patterns=[ + MatchAs(name='x')]), + name='y'), + body=[ + Expr( + value=Constant(value=Ellipsis))]), + match_case( + pattern=MatchAs(), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + +.. class:: MatchOr(patterns) + + A match "or-pattern". An or-pattern matches each of its subpatterns in turn + to the subject, until one succeeds. The or-pattern is then deemed to + succeed. If none of the subpatterns succeed the or-pattern fails. The + ``patterns`` attribute contains a list of match pattern nodes that will be + matched against the subject. + + .. doctest:: + + >>> print(ast.dump(ast.parse(""" + ... match x: + ... case [x] | (y): + ... ... + ... """), indent=4)) + Module( + body=[ + Match( + subject=Name(id='x', ctx=Load()), + cases=[ + match_case( + pattern=MatchOr( + patterns=[ + MatchSequence( + patterns=[ + MatchAs(name='x')]), + MatchAs(name='y')]), + body=[ + Expr( + value=Constant(value=Ellipsis))])])], + type_ignores=[]) + + Function and class definitions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -1552,7 +1920,7 @@ and classes for traversing abstract syntax trees: If source contains a null character ('\0'), :exc:`ValueError` is raised. .. warning:: - Note that successfully parsing source code into an AST object doesn't + Note that succesfully parsing souce code into an AST object doesn't guarantee that the source code provided is valid Python code that can be executed as the compilation step can raise further :exc:`SyntaxError` exceptions. For instance, the source ``return 42`` generates a valid @@ -1594,7 +1962,7 @@ and classes for traversing abstract syntax trees: Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, - dicts, sets, booleans, and ``None``. + dicts, sets, booleans, ``None`` and ``Ellipsis``. This can be used for safely evaluating strings containing Python values from untrusted sources without the need to parse the values oneself. It is not @@ -1606,12 +1974,19 @@ and classes for traversing abstract syntax trees: sufficiently large/complex string due to stack depth limitations in Python's AST compiler. + It can raise :exc:`ValueError`, :exc:`TypeError`, :exc:`SyntaxError`, + :exc:`MemoryError` and :exc:`RecursionError` depending on the malformed + input. + .. versionchanged:: 3.2 Now allows bytes and set literals. .. versionchanged:: 3.9 Now supports creating empty sets with ``'set()'``. + .. versionchanged:: 3.10 + For string inputs, leading spaces and tabs are now stripped. + .. function:: get_docstring(node, clean=True) @@ -1874,4 +2249,4 @@ to stdout. Otherwise, the content is read from stdin. `Parso `_ is a Python parser that supports error recovery and round-trip parsing for different Python versions (in multiple Python versions). Parso is also able to list multiple syntax errors - in your python file. \ No newline at end of file + in your python file. diff --git a/Doc/library/asynchat.rst b/Doc/library/asynchat.rst index 7cc9d997..9e51416b 100644 --- a/Doc/library/asynchat.rst +++ b/Doc/library/asynchat.rst @@ -3,7 +3,6 @@ .. module:: asynchat :synopsis: Support for asynchronous command/response protocols. - :deprecated: .. moduleauthor:: Sam Rushing .. sectionauthor:: Steve Holden @@ -11,8 +10,6 @@ **Source code:** :source:`Lib/asynchat.py` .. deprecated:: 3.6 - :mod:`asynchat` will be removed in Python 3.12 - (see :pep:`PEP 594 <594#asynchat>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/asyncio-api-index.rst b/Doc/library/asyncio-api-index.rst index 047e5bbc..f558724d 100644 --- a/Doc/library/asyncio-api-index.rst +++ b/Doc/library/asyncio-api-index.rst @@ -49,7 +49,7 @@ await on multiple things with timeouts. - Task object. * - :func:`to_thread` - - Asychronously run a function in a separate OS thread. + - Asynchronously run a function in a separate OS thread. * - :func:`run_coroutine_threadsafe` - Schedule a coroutine from another OS thread. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 2a6d82fa..eee8095b 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -53,13 +53,18 @@ an event loop: Consider also using the :func:`asyncio.run` function instead of using lower level functions to manually create and close an event loop. + .. deprecated:: 3.10 + Deprecation warning is emitted if there is no running event loop. + In future Python releases, this function will be an alias of + :func:`get_running_loop`. + .. function:: set_event_loop(loop) Set *loop* as a current event loop for the current OS thread. .. function:: new_event_loop() - Create and return a new event loop object. + Create a new event loop object. Note that the behaviour of :func:`get_event_loop`, :func:`set_event_loop`, and :func:`new_event_loop` functions can be altered by @@ -626,11 +631,6 @@ Creating network servers assumed and a list of multiple sockets will be returned (most likely one for IPv4 and another one for IPv6). - * The *port* parameter can be set to specify which port the server should - listen on. If ``0`` or ``None`` (the default), a random unused port will - be selected (note that if *host* resolves to multiple network interfaces, - a different random port will be selected for each interface). - * *family* can be set to either :data:`socket.AF_INET` or :data:`~socket.AF_INET6` to force the socket to use IPv4 or IPv6. If not set, the *family* will be determined from host name @@ -1242,10 +1242,9 @@ async/await code consider using the high-level .. note:: - On Windows, the default event loop :class:`ProactorEventLoop` supports - subprocesses, whereas :class:`SelectorEventLoop` does not. See - :ref:`Subprocess Support on Windows ` for - details. + The default asyncio event loop on **Windows** does not support + subprocesses. See :ref:`Subprocess Support on Windows + ` for details. .. coroutinemethod:: loop.subprocess_exec(protocol_factory, *args, \ stdin=subprocess.PIPE, stdout=subprocess.PIPE, \ diff --git a/Doc/library/asyncio-future.rst b/Doc/library/asyncio-future.rst index 63c36926..ef496a23 100644 --- a/Doc/library/asyncio-future.rst +++ b/Doc/library/asyncio-future.rst @@ -54,18 +54,23 @@ Future Functions See also the :func:`create_task` function which is the preferred way for creating new Tasks. - Save a reference to the result of this function, to avoid - a task disappearing mid execution. - .. versionchanged:: 3.5.1 The function accepts any :term:`awaitable` object. + .. deprecated:: 3.10 + Deprecation warning is emitted if *obj* is not a Future-like object + and *loop* is not specified and there is no running event loop. + .. function:: wrap_future(future, *, loop=None) Wrap a :class:`concurrent.futures.Future` object in a :class:`asyncio.Future` object. + .. deprecated:: 3.10 + Deprecation warning is emitted if *future* is not a Future-like object + and *loop* is not specified and there is no running event loop. + Future Object ============= @@ -93,6 +98,10 @@ Future Object .. versionchanged:: 3.7 Added support for the :mod:`contextvars` module. + .. deprecated:: 3.10 + Deprecation warning is emitted if *loop* is not specified + and there is no running event loop. + .. method:: result() Return the result of the Future. diff --git a/Doc/library/asyncio-queue.rst b/Doc/library/asyncio-queue.rst index 524560b6..e6f26bb9 100644 --- a/Doc/library/asyncio-queue.rst +++ b/Doc/library/asyncio-queue.rst @@ -23,7 +23,7 @@ See also the `Examples`_ section below. Queue ===== -.. class:: Queue(maxsize=0, \*, loop=None) +.. class:: Queue(maxsize=0) A first in, first out (FIFO) queue. @@ -36,9 +36,6 @@ Queue the queue is always known and can be returned by calling the :meth:`qsize` method. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. - This class is :ref:`not thread safe `. @@ -108,6 +105,13 @@ Queue Raises :exc:`ValueError` if called more times than there were items placed in the queue. + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + Priority Queue ============== diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index a960b26c..b3e229c2 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -49,10 +49,9 @@ and work with streams: .. coroutinefunction:: open_connection(host=None, port=None, *, \ - loop=None, limit=None, ssl=None, family=0, \ - proto=0, flags=0, sock=None, local_addr=None, \ - server_hostname=None, ssl_handshake_timeout=None, \ - happy_eyeballs_delay=None, interleave=None) + limit=None, ssl=None, family=0, proto=0, \ + flags=0, sock=None, local_addr=None, \ + server_hostname=None, ssl_handshake_timeout=None) Establish a network connection and return a pair of ``(reader, writer)`` objects. @@ -60,9 +59,6 @@ and work with streams: The returned *reader* and *writer* objects are instances of :class:`StreamReader` and :class:`StreamWriter` classes. - The *loop* argument is optional and can always be determined - automatically when this function is awaited from a coroutine. - *limit* determines the buffer size limit used by the returned :class:`StreamReader` instance. By default the *limit* is set to 64 KiB. @@ -74,12 +70,16 @@ and work with streams: The *ssl_handshake_timeout* parameter. - .. versionadded:: 3.8 + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. - Added *happy_eyeballs_delay* and *interleave* parameters. .. coroutinefunction:: start_server(client_connected_cb, host=None, \ - port=None, *, loop=None, limit=None, \ + port=None, *, limit=None, \ family=socket.AF_UNSPEC, \ flags=socket.AI_PASSIVE, sock=None, \ backlog=100, ssl=None, reuse_address=None, \ @@ -97,9 +97,6 @@ and work with streams: :ref:`coroutine function `; if it is a coroutine function, it will be automatically scheduled as a :class:`Task`. - The *loop* argument is optional and can always be determined - automatically when this method is awaited from a coroutine. - *limit* determines the buffer size limit used by the returned :class:`StreamReader` instance. By default the *limit* is set to 64 KiB. @@ -111,12 +108,19 @@ and work with streams: The *ssl_handshake_timeout* and *start_serving* parameters. + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + .. rubric:: Unix Sockets -.. coroutinefunction:: open_unix_connection(path=None, *, loop=None, \ - limit=None, ssl=None, sock=None, \ - server_hostname=None, ssl_handshake_timeout=None) +.. coroutinefunction:: open_unix_connection(path=None, *, limit=None, \ + ssl=None, sock=None, server_hostname=None, \ + ssl_handshake_timeout=None) Establish a Unix socket connection and return a pair of ``(reader, writer)``. @@ -135,11 +139,17 @@ and work with streams: The *path* parameter can now be a :term:`path-like object` + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + .. coroutinefunction:: start_unix_server(client_connected_cb, path=None, \ - *, loop=None, limit=None, sock=None, \ - backlog=100, ssl=None, ssl_handshake_timeout=None, \ - start_serving=True) + *, limit=None, sock=None, backlog=100, ssl=None, \ + ssl_handshake_timeout=None, start_serving=True) Start a Unix socket server. @@ -157,6 +167,13 @@ and work with streams: The *path* parameter can now be a :term:`path-like object`. + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + StreamReader ============ @@ -378,8 +395,8 @@ TCP echo server using the :func:`asyncio.start_server` function:: server = await asyncio.start_server( handle_echo, '127.0.0.1', 8888) - addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets) - print(f'Serving on {addrs}') + addr = server.sockets[0].getsockname() + print(f'Serving on {addr}') async with server: await server.serve_forever() diff --git a/Doc/library/asyncio-subprocess.rst b/Doc/library/asyncio-subprocess.rst index 4f8b0b3e..fd1f9c99 100644 --- a/Doc/library/asyncio-subprocess.rst +++ b/Doc/library/asyncio-subprocess.rst @@ -62,8 +62,7 @@ Creating Subprocesses ===================== .. coroutinefunction:: create_subprocess_exec(program, *args, stdin=None, \ - stdout=None, stderr=None, loop=None, \ - limit=None, **kwds) + stdout=None, stderr=None, limit=None, **kwds) Create a subprocess. @@ -78,11 +77,14 @@ Creating Subprocesses .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + .. coroutinefunction:: create_subprocess_shell(cmd, stdin=None, \ - stdout=None, stderr=None, loop=None, \ - limit=None, **kwds) + stdout=None, stderr=None, limit=None, **kwds) Run the *cmd* shell command. @@ -106,7 +108,10 @@ Creating Subprocesses .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. note:: @@ -127,7 +132,6 @@ Constants ========= .. data:: asyncio.subprocess.PIPE - :module: Can be passed to the *stdin*, *stdout* or *stderr* parameters. @@ -141,13 +145,11 @@ Constants attributes will point to :class:`StreamReader` instances. .. data:: asyncio.subprocess.STDOUT - :module: Special value that can be used as the *stderr* argument and indicates that standard error should be redirected into standard output. .. data:: asyncio.subprocess.DEVNULL - :module: Special value that can be used as the *stdin*, *stdout* or *stderr* argument to process creation functions. It indicates that the special file @@ -163,7 +165,6 @@ wrapper that allows communicating with subprocesses and watching for their completion. .. class:: asyncio.subprocess.Process - :module: An object that wraps OS processes created by the :func:`create_subprocess_exec` and :func:`create_subprocess_shell` @@ -282,7 +283,7 @@ their completion. Use the :meth:`communicate` method rather than :attr:`process.stdin.write() `, :attr:`await process.stdout.read() ` or - :attr:`await process.stderr.read() `. + :attr:`await process.stderr.read `. This avoids deadlocks due to streams pausing reading or writing and blocking the child process. diff --git a/Doc/library/asyncio-sync.rst b/Doc/library/asyncio-sync.rst index f62ce670..88e523af 100644 --- a/Doc/library/asyncio-sync.rst +++ b/Doc/library/asyncio-sync.rst @@ -36,7 +36,7 @@ asyncio has the following basic synchronization primitives: Lock ==== -.. class:: Lock(\*, loop=None) +.. class:: Lock() Implements a mutex lock for asyncio tasks. Not thread-safe. @@ -64,7 +64,10 @@ Lock lock.release() .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This class has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. coroutinemethod:: acquire() @@ -96,7 +99,7 @@ Lock Event ===== -.. class:: Event(\*, loop=None) +.. class:: Event() An event object. Not thread-safe. @@ -108,9 +111,11 @@ Event :meth:`clear` method. The :meth:`~Event.wait` method blocks until the flag is set to *true*. The flag is set to *false* initially. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This class has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. _asyncio_example_sync_event: @@ -166,7 +171,7 @@ Event Condition ========= -.. class:: Condition(lock=None, \*, loop=None) +.. class:: Condition(lock=None) A Condition object. Not thread-safe. @@ -184,9 +189,11 @@ Condition ``None``. In the latter case a new Lock object is created automatically. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This class has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. The preferred way to use a Condition is an :keyword:`async with` statement:: @@ -270,7 +277,7 @@ Condition Semaphore ========= -.. class:: Semaphore(value=1, \*, loop=None) +.. class:: Semaphore(value=1) A Semaphore object. Not thread-safe. @@ -284,9 +291,11 @@ Semaphore internal counter (``1`` by default). If the given value is less than ``0`` a :exc:`ValueError` is raised. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This class has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. The preferred way to use a Semaphore is an :keyword:`async with` statement:: @@ -332,7 +341,7 @@ Semaphore BoundedSemaphore ================ -.. class:: BoundedSemaphore(value=1, \*, loop=None) +.. class:: BoundedSemaphore(value=1) A bounded semaphore object. Not thread-safe. @@ -340,9 +349,12 @@ BoundedSemaphore a :exc:`ValueError` in :meth:`~Semaphore.release` if it increases the internal counter above the initial *value*. - .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + + The ``loop`` parameter. This class has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. --------- diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 7c12e2ed..fb868925 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -20,7 +20,7 @@ Coroutines :term:`Coroutines ` declared with the async/await syntax is the preferred way of writing asyncio applications. For example, the following -snippet of code prints "hello", waits 1 second, +snippet of code (requires Python 3.7+) prints "hello", waits 1 second, and then prints "world":: >>> import asyncio @@ -259,10 +259,20 @@ Creating Tasks :exc:`RuntimeError` is raised if there is no running loop in current thread. - .. important:: + This function has been **added in Python 3.7**. Prior to + Python 3.7, the low-level :func:`asyncio.ensure_future` function + can be used instead:: - Save a reference to the result of this function, to avoid - a task disappearing mid execution. + async def coro(): + ... + + # In Python 3.7+ + task = asyncio.create_task(coro()) + ... + + # This works in all Python versions but is less readable + task = asyncio.ensure_future(coro()) + ... .. versionadded:: 3.7 @@ -273,7 +283,7 @@ Creating Tasks Sleeping ======== -.. coroutinefunction:: sleep(delay, result=None, *, loop=None) +.. coroutinefunction:: sleep(delay, result=None) Block for *delay* seconds. @@ -288,7 +298,10 @@ Sleeping blocking the event loop for the full duration of the function call. .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. _asyncio_example_sleep: @@ -310,10 +323,18 @@ Sleeping asyncio.run(display_date()) + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + + Running Tasks Concurrently ========================== -.. awaitablefunction:: gather(*aws, loop=None, return_exceptions=False) +.. awaitablefunction:: gather(*aws, return_exceptions=False) Run :ref:`awaitable objects ` in the *aws* sequence *concurrently*. @@ -343,7 +364,10 @@ Running Tasks Concurrently Tasks/Futures to be cancelled. .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. _asyncio_example_gather: @@ -396,11 +420,22 @@ Running Tasks Concurrently If the *gather* itself is cancelled, the cancellation is propagated regardless of *return_exceptions*. + .. deprecated-removed:: 3.8 3.10 + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + + .. deprecated:: 3.10 + Deprecation warning is emitted if no positional arguments are provided + or not all positional arguments are Future-like objects + and there is no running event loop. + Shielding From Cancellation =========================== -.. awaitablefunction:: shield(aw, *, loop=None) +.. awaitablefunction:: shield(aw) Protect an :ref:`awaitable object ` from being :meth:`cancelled `. @@ -434,13 +469,20 @@ Shielding From Cancellation res = None .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + + .. deprecated:: 3.10 + Deprecation warning is emitted if *aw* is not Future-like object + and there is no running event loop. Timeouts ======== -.. coroutinefunction:: wait_for(aw, timeout, *, loop=None) +.. coroutinefunction:: wait_for(aw, timeout) Wait for the *aw* :ref:`awaitable ` to complete with a timeout. @@ -464,7 +506,10 @@ Timeouts If the wait is cancelled, the future *aw* is also cancelled. .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. _asyncio_example_waitfor: @@ -493,12 +538,17 @@ Timeouts for *aw* to be cancelled. Previously, it raised :exc:`asyncio.TimeoutError` immediately. + .. deprecated-removed:: 3.8 3.10 + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + Waiting Primitives ================== -.. coroutinefunction:: wait(aws, *, loop=None, timeout=None,\ - return_when=ALL_COMPLETED) +.. coroutinefunction:: wait(aws, *, timeout=None, return_when=ALL_COMPLETED) Run :ref:`awaitable objects ` in the *aws* iterable concurrently and block until the condition specified @@ -551,8 +601,10 @@ Waiting Primitives :ref:`confusing behavior `. .. deprecated-removed:: 3.8 3.10 - - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. .. _asyncio_example_wait_coroutine: .. note:: @@ -581,13 +633,20 @@ Waiting Primitives if task in done: # Everything will work as expected now. + .. deprecated-removed:: 3.8 3.10 + + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + .. deprecated-removed:: 3.8 3.11 Passing coroutine objects to ``wait()`` directly is deprecated. -.. function:: as_completed(aws, *, loop=None, timeout=None) +.. function:: as_completed(aws, *, timeout=None) Run :ref:`awaitable objects ` in the *aws* iterable concurrently. Return an iterator of coroutines. @@ -598,7 +657,10 @@ Waiting Primitives all Futures are done. .. deprecated-removed:: 3.8 3.10 - The *loop* parameter. + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. Example:: @@ -606,6 +668,16 @@ Waiting Primitives earliest_result = await coro # ... + .. deprecated-removed:: 3.8 3.10 + The ``loop`` parameter. This function has been implicitly getting the + current running loop since 3.7. See + :ref:`What's New in 3.10's Removed section ` + for more information. + + .. deprecated:: 3.10 + Deprecation warning is emitted if not all awaitable objects in the *aws* + iterable are Future-like objects and there is no running event loop. + Running in Threads ================== @@ -694,7 +766,7 @@ Scheduling From Other Threads try: result = future.result(timeout) - except asyncio.TimeoutError: + except concurrent.futures.TimeoutError: print('The coroutine took too long, cancelling the task...') future.cancel() except Exception as exc: @@ -788,6 +860,10 @@ Task Object .. deprecated-removed:: 3.8 3.10 The *loop* parameter. + .. deprecated:: 3.10 + Deprecation warning is emitted if *loop* is not specified + and there is no running event loop. + .. method:: cancel(msg=None) Request the Task to be cancelled. @@ -976,7 +1052,7 @@ Generator-based Coroutines .. note:: Support for generator-based coroutines is **deprecated** and - is removed in Python 3.11. + is scheduled for removal in Python 3.10. Generator-based coroutines predate async/await syntax. They are Python generators that use ``yield from`` expressions to await @@ -1004,7 +1080,7 @@ enforced. This decorator should not be used for :keyword:`async def` coroutines. - .. deprecated-removed:: 3.8 3.11 + .. deprecated-removed:: 3.8 3.10 Use :keyword:`async def` instead. diff --git a/Doc/library/asyncio.rst b/Doc/library/asyncio.rst index a6429394..94a85325 100644 --- a/Doc/library/asyncio.rst +++ b/Doc/library/asyncio.rst @@ -17,6 +17,7 @@ await asyncio.sleep(1) print('... World!') + # Python 3.7+ asyncio.run(main()) asyncio is a library to write **concurrent** code using diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst index a732fd7b..a86518eb 100644 --- a/Doc/library/asyncore.rst +++ b/Doc/library/asyncore.rst @@ -4,7 +4,6 @@ .. module:: asyncore :synopsis: A base class for developing asynchronous socket handling services. - :deprecated: .. moduleauthor:: Sam Rushing .. sectionauthor:: Christopher Petrilli @@ -14,8 +13,6 @@ **Source code:** :source:`Lib/asyncore.py` .. deprecated:: 3.6 - :mod:`asyncore` will be removed in Python 3.12 - (see :pep:`PEP 594 <594#asyncore>` for details). Please use :mod:`asyncio` instead. -------------- diff --git a/Doc/library/audioop.rst b/Doc/library/audioop.rst index 649c99e7..bad9da2e 100644 --- a/Doc/library/audioop.rst +++ b/Doc/library/audioop.rst @@ -3,11 +3,6 @@ .. module:: audioop :synopsis: Manipulate raw audio data. - :deprecated: - -.. deprecated:: 3.11 - The :mod:`audioop` module is deprecated - (see :pep:`PEP 594 <594#audioop>` for details). -------------- diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst index 1ff22a00..f91547bd 100644 --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -2,7 +2,7 @@ =============================================================== .. module:: base64 - :synopsis: RFC 3548: Base16, Base32, Base64 Data Encodings; + :synopsis: RFC 4648: Base16, Base32, Base64 Data Encodings; Base85 and Ascii85 **Source code:** :source:`Lib/base64.py` @@ -16,10 +16,10 @@ This module provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data. It provides encoding and decoding functions for the encodings specified in -:rfc:`3548`, which defines the Base16, Base32, and Base64 algorithms, +:rfc:`4648`, which defines the Base16, Base32, and Base64 algorithms, and for the de-facto standard Ascii85 and Base85 encodings. -The :rfc:`3548` encodings are suitable for encoding binary data so that it can +The :rfc:`4648` encodings are suitable for encoding binary data so that it can be safely sent by email, used as parts of URLs, or included as part of an HTTP POST request. The encoding algorithm is not the same as the :program:`uuencode` program. @@ -28,7 +28,7 @@ There are two interfaces provided by this module. The modern interface supports encoding :term:`bytes-like objects ` to ASCII :class:`bytes`, and decoding :term:`bytes-like objects ` or strings containing ASCII to :class:`bytes`. Both base-64 alphabets -defined in :rfc:`3548` (normal, and URL- and filesystem-safe) are supported. +defined in :rfc:`4648` (normal, and URL- and filesystem-safe) are supported. The legacy interface does not support decoding from strings, but it does provide functions for encoding and decoding to and from :term:`file objects @@ -124,7 +124,7 @@ The modern interface provides: whether a lowercase alphabet is acceptable as input. For security purposes, the default is ``False``. - :rfc:`3548` allows for optional mapping of the digit 0 (zero) to the letter O + :rfc:`4648` allows for optional mapping of the digit 0 (zero) to the letter O (oh), and for optional mapping of the digit 1 (one) to either the letter I (eye) or letter L (el). The optional argument *map01* when not ``None``, specifies which letter the digit 1 should be mapped to (when *map01* is not ``None``, the @@ -136,6 +136,27 @@ The modern interface provides: input. +.. function:: b32hexencode(s) + + Similar to :func:`b32encode` but uses the Extended Hex Alphabet, as defined in + :rfc:`4648`. + + .. versionadded:: 3.10 + + +.. function:: b32hexdecode(s, casefold=False) + + Similar to :func:`b32decode` but uses the Extended Hex Alphabet, as defined in + :rfc:`4648`. + + This version does not allow the digit 0 (zero) to the letter O (oh) and digit + 1 (one) to either the letter I (eye) or letter L (el) mappings, all these + characters are included in the Extended Hex Alphabet and are not + interchangable. + + .. versionadded:: 3.10 + + .. function:: b16encode(s) Encode the :term:`bytes-like object` *s* using Base16 and return the @@ -266,6 +287,13 @@ An example usage of the module: >>> data b'data to be encoded' +.. _base64-security: + +Security Considerations +----------------------- + +A new security considerations section was added to :rfc:`4648` (section 12); it's +recommended to review the security section for any code deployed to production. .. seealso:: diff --git a/Doc/library/binascii.rst b/Doc/library/binascii.rst index 5cd058c0..2c0c1bce 100644 --- a/Doc/library/binascii.rst +++ b/Doc/library/binascii.rst @@ -135,7 +135,7 @@ The :mod:`binascii` module defines the following functions: .. function:: crc32(data[, value]) - Compute CRC-32, the unsigned 32-bit checksum of *data*, starting with an + Compute CRC-32, the 32-bit checksum of *data*, starting with an initial CRC of *value*. The default initial CRC is zero. The algorithm is consistent with the ZIP file checksum. Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash @@ -149,8 +149,9 @@ The :mod:`binascii` module defines the following functions: .. versionchanged:: 3.0 The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``crc32(data) & 0xffffffff``. + To generate the same numeric value across all Python versions and + platforms, use ``crc32(data) & 0xffffffff``. + .. function:: b2a_hex(data[, sep[, bytes_per_sep=1]]) hexlify(data[, sep[, bytes_per_sep=1]]) diff --git a/Doc/library/bisect.rst b/Doc/library/bisect.rst index 6bf7814b..f34ee175 100644 --- a/Doc/library/bisect.rst +++ b/Doc/library/bisect.rst @@ -21,7 +21,7 @@ example of the algorithm (the boundary conditions are already right!). The following functions are provided: -.. function:: bisect_left(a, x, lo=0, hi=len(a)) +.. function:: bisect_left(a, x, lo=0, hi=len(a), *, key=None) Locate the insertion point for *x* in *a* to maintain sorted order. The parameters *lo* and *hi* may be used to specify a subset of the list @@ -31,39 +31,106 @@ The following functions are provided: parameter to ``list.insert()`` assuming that *a* is already sorted. The returned insertion point *i* partitions the array *a* into two halves so - that ``all(val < x for val in a[lo:i])`` for the left side and - ``all(val >= x for val in a[i:hi])`` for the right side. + that ``all(val < x for val in a[lo : i])`` for the left side and + ``all(val >= x for val in a[i : hi])`` for the right side. -.. function:: bisect_right(a, x, lo=0, hi=len(a)) + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + .. versionchanged:: 3.10 + Added the *key* parameter. + + +.. function:: bisect_right(a, x, lo=0, hi=len(a), *, key=None) bisect(a, x, lo=0, hi=len(a)) Similar to :func:`bisect_left`, but returns an insertion point which comes after (to the right of) any existing entries of *x* in *a*. The returned insertion point *i* partitions the array *a* into two halves so - that ``all(val <= x for val in a[lo:i])`` for the left side and - ``all(val > x for val in a[i:hi])`` for the right side. + that ``all(val <= x for val in a[lo : i])`` for the left side and + ``all(val > x for val in a[i : hi])`` for the right side. + + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + .. versionchanged:: 3.10 + Added the *key* parameter. + -.. function:: insort_left(a, x, lo=0, hi=len(a)) +.. function:: insort_left(a, x, lo=0, hi=len(a), *, key=None) - Insert *x* in *a* in sorted order. This is equivalent to - ``a.insert(bisect.bisect_left(a, x, lo, hi), x)`` assuming that *a* is - already sorted. Keep in mind that the O(log n) search is dominated by - the slow O(n) insertion step. + Insert *x* in *a* in sorted order. -.. function:: insort_right(a, x, lo=0, hi=len(a)) + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + This function first runs :func:`bisect_left` to locate an insertion point. + Next, it runs the :meth:`insert` method on *a* to insert *x* at the + appropriate position to maintain sort order. + + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) + insertion step. + + .. versionchanged:: 3.10 + Added the *key* parameter. + + +.. function:: insort_right(a, x, lo=0, hi=len(a), *, key=None) insort(a, x, lo=0, hi=len(a)) Similar to :func:`insort_left`, but inserting *x* in *a* after any existing entries of *x*. + *key* specifies a :term:`key function` of one argument that is used to + extract a comparison key from each input element. The default value is + ``None`` (compare the elements directly). + + This function first runs :func:`bisect_right` to locate an insertion point. + Next, it runs the :meth:`insert` method on *a* to insert *x* at the + appropriate position to maintain sort order. + + Keep in mind that the ``O(log n)`` search is dominated by the slow O(n) + insertion step. + + .. versionchanged:: 3.10 + Added the *key* parameter. + + +Performance Notes +----------------- + +When writing time sensitive code using *bisect()* and *insort()*, keep these +thoughts in mind: + +* Bisection is effective for searching ranges of values. + For locating specific values, dictionaries are more performant. + +* The *insort()* functions are ``O(n)`` because the logarithmic search step + is dominated by the linear time insertion step. + +* The search functions are stateless and discard key function results after + they are used. Consequently, if the search functions are used in a loop, + the key function may be called again and again on the same array elements. + If the key function isn't fast, consider wrapping it with + :func:`functools.cache` to avoid duplicate computations. Alternatively, + consider searching an array of precomputed keys to locate the insertion + point (as shown in the examples section below). + .. seealso:: - `SortedCollection recipe - `_ that uses - bisect to build a full-featured collection class with straight-forward search - methods and support for a key-function. The keys are precomputed to save - unnecessary calls to the key function during searches. + * `Sorted Collections + `_ is a high performance + module that uses *bisect* to managed sorted collections of data. + + * The `SortedCollection recipe + `_ uses + bisect to build a full-featured collection class with straight-forward search + methods and support for a key-function. The keys are precomputed to save + unnecessary calls to the key function during searches. Searching Sorted Lists @@ -110,8 +177,8 @@ lists:: raise ValueError -Other Examples --------------- +Examples +-------- .. _bisect-example: @@ -127,17 +194,12 @@ a 'B', and so on:: >>> [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]] ['F', 'A', 'C', 'C', 'B', 'A', 'A'] -Unlike the :func:`sorted` function, it does not make sense for the :func:`bisect` -functions to have *key* or *reversed* arguments because that would lead to an -inefficient design (successive calls to bisect functions would not "remember" -all of the previous key lookups). - -Instead, it is better to search a list of precomputed keys to find the index -of the record in question:: +One technique to avoid repeated calls to a key function is to search a list of +precomputed keys to find the index of a record:: >>> data = [('red', 5), ('blue', 1), ('yellow', 8), ('black', 0)] - >>> data.sort(key=lambda r: r[1]) - >>> keys = [r[1] for r in data] # precomputed list of keys + >>> data.sort(key=lambda r: r[1]) # Or use operator.itemgetter(1). + >>> keys = [r[1] for r in data] # Precompute a list of keys. >>> data[bisect_left(keys, 0)] ('black', 0) >>> data[bisect_left(keys, 1)] diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst index b5c3277f..999892e9 100644 --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -25,8 +25,6 @@ The :mod:`bz2` module contains: * The :func:`compress` and :func:`decompress` functions for one-shot (de)compression. -All of the classes in this module may safely be accessed from multiple threads. - (De)compression of files ------------------------ @@ -140,6 +138,11 @@ All of the classes in this module may safely be accessed from multiple threads. The *compresslevel* parameter became keyword-only. + .. versionchanged:: 3.10 + This class is thread unsafe in the face of multiple simultaneous + readers or writers, just like its equivalent classes in :mod:`gzip` and + :mod:`lzma` have always been. + Incremental (de)compression --------------------------- diff --git a/Doc/library/cgi.rst b/Doc/library/cgi.rst index 5744ee54..c151f04d 100644 --- a/Doc/library/cgi.rst +++ b/Doc/library/cgi.rst @@ -3,7 +3,6 @@ .. module:: cgi :synopsis: Helpers for running Python scripts via the Common Gateway Interface. - :deprecated: **Source code:** :source:`Lib/cgi.py` @@ -15,10 +14,6 @@ single: URL single: Common Gateway Interface -.. deprecated:: 3.11 - The :mod:`cgi` module is deprecated - (see :pep:`PEP 594 <594#cgi>` for details and alternatives). - -------------- Support module for Common Gateway Interface (CGI) scripts. @@ -78,7 +73,7 @@ When you write a new script, consider adding these lines:: cgitb.enable() This activates a special exception handler that will display detailed reports in -the Web browser if any errors occur. If you'd rather not show the guts of your +the web browser if any errors occur. If you'd rather not show the guts of your program to users of your script, you can have the reports saved to files instead, with code like this:: @@ -308,7 +303,7 @@ algorithms implemented in this module in other circumstances. Added the *encoding* and *errors* parameters. For non-file fields, the value is now a list of strings, not bytes. - .. versionchanged:: 3.9.2 + .. versionchanged:: 3.10 Added the *separator* parameter. @@ -355,7 +350,7 @@ There's one important rule: if you invoke an external program (via :func:`os.system`, :func:`os.popen` or other functions with similar functionality), make very sure you don't pass arbitrary strings received from the client to the shell. This is a well-known security hole whereby clever -hackers anywhere on the Web can exploit a gullible CGI script to invoke +hackers anywhere on the web can exploit a gullible CGI script to invoke arbitrary shell commands. Even parts of the URL or field names cannot be trusted, since the request doesn't have to come from your form! @@ -462,7 +457,7 @@ likely the traceback will end up in one of the HTTP server's log files, or be discarded altogether. Fortunately, once you have managed to get your script to execute *some* code, -you can easily send tracebacks to the Web browser using the :mod:`cgitb` module. +you can easily send tracebacks to the web browser using the :mod:`cgitb` module. If you haven't done so already, just add the lines:: import cgitb diff --git a/Doc/library/cgitb.rst b/Doc/library/cgitb.rst index 3b0b106a..5f3a6476 100644 --- a/Doc/library/cgitb.rst +++ b/Doc/library/cgitb.rst @@ -3,7 +3,6 @@ .. module:: cgitb :synopsis: Configurable traceback handler for CGI scripts. - :deprecated: .. moduleauthor:: Ka-Ping Yee .. sectionauthor:: Fred L. Drake, Jr. @@ -16,10 +15,6 @@ single: exceptions; in CGI scripts single: tracebacks; in CGI scripts -.. deprecated:: 3.11 - The :mod:`cgitb` module is deprecated - (see :pep:`PEP 594 <594#cgitb>` for details). - -------------- The :mod:`cgitb` module provides a special exception handler for Python scripts. diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst index 5a84c890..5e24df92 100644 --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -3,7 +3,6 @@ .. module:: chunk :synopsis: Module to read IFF chunks. - :deprecated: .. moduleauthor:: Sjoerd Mullender .. sectionauthor:: Sjoerd Mullender @@ -17,10 +16,6 @@ single: Real Media File Format single: RMFF -.. deprecated:: 3.11 - The :mod:`chunk` module is deprecated - (see :pep:`PEP 594 <594#chunk>` for details). - -------------- This module provides an interface for reading files that use EA IFF 85 chunks. diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst index d4ea2b34..ef71832b 100644 --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -23,11 +23,11 @@ This module defines base classes for standard Python codecs (encoders and decoders) and provides access to the internal Python codec registry, which manages the codec and error handling lookup process. Most standard codecs -are :term:`text encodings `, which encode text to bytes (and -decode bytes to text), but there are also codecs provided that encode text to -text, and bytes to bytes. Custom codecs may encode and decode between arbitrary -types, but some module features are restricted to be used specifically with -:term:`text encodings ` or with codecs that encode to +are :term:`text encodings `, which encode text to bytes, +but there are also codecs provided that encode text to text, and bytes to +bytes. Custom codecs may encode and decode between arbitrary types, but some +module features are restricted to use specifically with +:term:`text encodings `, or with codecs that encode to :class:`bytes`. The module defines the following functions for encoding and decoding with @@ -167,11 +167,14 @@ function: .. versionchanged:: 3.9 Hyphens and spaces are converted to underscore. - .. note:: - Search function registration is not currently reversible, - which may cause problems in some cases, such as unit testing or - module reloading. +.. function:: unregister(search_function) + + Unregister a codec search function and clear the registry's cache. + If the search function is not registered, do nothing. + + .. versionadded:: 3.10 + While the builtin :func:`open` and the associated :mod:`io` module are the recommended approach for working with encoded text files, this module @@ -294,56 +297,58 @@ codec will handle encoding and decoding errors. Error Handlers ^^^^^^^^^^^^^^ -To simplify and standardize error handling, codecs may implement different -error handling schemes by accepting the *errors* string argument: +To simplify and standardize error handling, +codecs may implement different error handling schemes by +accepting the *errors* string argument. The following string values are +defined and implemented by all standard Python codecs: - >>> 'German ß, ♬'.encode(encoding='ascii', errors='backslashreplace') - b'German \\xdf, \\u266c' - >>> 'German ß, ♬'.encode(encoding='ascii', errors='xmlcharrefreplace') - b'German ß, ♬' +.. tabularcolumns:: |l|L| + ++-------------------------+-----------------------------------------------+ +| Value | Meaning | ++=========================+===============================================+ +| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass); | +| | this is the default. Implemented in | +| | :func:`strict_errors`. | ++-------------------------+-----------------------------------------------+ +| ``'ignore'`` | Ignore the malformed data and continue | +| | without further notice. Implemented in | +| | :func:`ignore_errors`. | ++-------------------------+-----------------------------------------------+ + +The following error handlers are only applicable to +:term:`text encodings `: .. index:: - pair: strict; error handler's name - pair: ignore; error handler's name - pair: replace; error handler's name - pair: backslashreplace; error handler's name - pair: surrogateescape; error handler's name single: ? (question mark); replacement character single: \ (backslash); escape sequence single: \x; escape sequence single: \u; escape sequence single: \U; escape sequence - -The following error handlers can be used with all Python -:ref:`standard-encodings` codecs: - -.. tabularcolumns:: |l|L| + single: \N; escape sequence +-------------------------+-----------------------------------------------+ | Value | Meaning | +=========================+===============================================+ -| ``'strict'`` | Raise :exc:`UnicodeError` (or a subclass), | -| | this is the default. Implemented in | -| | :func:`strict_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'ignore'`` | Ignore the malformed data and continue without| -| | further notice. Implemented in | -| | :func:`ignore_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'replace'`` | Replace with a replacement marker. On | -| | encoding, use ``?`` (ASCII character). On | -| | decoding, use ``�`` (U+FFFD, the official | -| | REPLACEMENT CHARACTER). Implemented in | +| ``'replace'`` | Replace with a suitable replacement | +| | marker; Python will use the official | +| | ``U+FFFD`` REPLACEMENT CHARACTER for the | +| | built-in codecs on decoding, and '?' on | +| | encoding. Implemented in | | | :func:`replace_errors`. | +-------------------------+-----------------------------------------------+ +| ``'xmlcharrefreplace'`` | Replace with the appropriate XML character | +| | reference (only for encoding). Implemented | +| | in :func:`xmlcharrefreplace_errors`. | ++-------------------------+-----------------------------------------------+ | ``'backslashreplace'`` | Replace with backslashed escape sequences. | -| | On encoding, use hexadecimal form of Unicode | -| | code point with formats ``\xhh`` ``\uxxxx`` | -| | ``\Uxxxxxxxx``. On decoding, use hexadecimal | -| | form of byte value with format ``\xhh``. | | | Implemented in | | | :func:`backslashreplace_errors`. | +-------------------------+-----------------------------------------------+ +| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences | +| | (only for encoding). Implemented in | +| | :func:`namereplace_errors`. | ++-------------------------+-----------------------------------------------+ | ``'surrogateescape'`` | On decoding, replace byte with individual | | | surrogate code ranging from ``U+DC80`` to | | | ``U+DCFF``. This code will then be turned | @@ -353,55 +358,27 @@ The following error handlers can be used with all Python | | more.) | +-------------------------+-----------------------------------------------+ -.. index:: - pair: xmlcharrefreplace; error handler's name - pair: namereplace; error handler's name - single: \N; escape sequence - -The following error handlers are only applicable to encoding (within -:term:`text encodings `): - -+-------------------------+-----------------------------------------------+ -| Value | Meaning | -+=========================+===============================================+ -| ``'xmlcharrefreplace'`` | Replace with XML/HTML numeric character | -| | reference, which is a decimal form of Unicode | -| | code point with format ``&#num;`` Implemented | -| | in :func:`xmlcharrefreplace_errors`. | -+-------------------------+-----------------------------------------------+ -| ``'namereplace'`` | Replace with ``\N{...}`` escape sequences, | -| | what appears in the braces is the Name | -| | property from Unicode Character Database. | -| | Implemented in :func:`namereplace_errors`. | -+-------------------------+-----------------------------------------------+ - -.. index:: - pair: surrogatepass; error handler's name - In addition, the following error handler is specific to the given codecs: +-------------------+------------------------+-------------------------------------------+ | Value | Codecs | Meaning | +===================+========================+===========================================+ -|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding surrogate code| -| | utf-16-be, utf-16-le, | point (``U+D800`` - ``U+DFFF``) as normal | -| | utf-32-be, utf-32-le | code point. Otherwise these codecs treat | -| | | the presence of surrogate code point in | -| | | :class:`str` as an error. | +|``'surrogatepass'``| utf-8, utf-16, utf-32, | Allow encoding and decoding of surrogate | +| | utf-16-be, utf-16-le, | codes. These codecs normally treat the | +| | utf-32-be, utf-32-le | presence of surrogates as an error. | +-------------------+------------------------+-------------------------------------------+ .. versionadded:: 3.1 The ``'surrogateescape'`` and ``'surrogatepass'`` error handlers. .. versionchanged:: 3.4 - The ``'surrogatepass'`` error handler now works with utf-16\* and utf-32\* - codecs. + The ``'surrogatepass'`` error handlers now works with utf-16\* and utf-32\* codecs. .. versionadded:: 3.5 The ``'namereplace'`` error handler. .. versionchanged:: 3.5 - The ``'backslashreplace'`` error handler now works with decoding and + The ``'backslashreplace'`` error handlers now works with decoding and translating. The set of allowed values can be extended by registering a new named error @@ -444,59 +421,42 @@ functions: .. function:: strict_errors(exception) - Implements the ``'strict'`` error handling. - - Each encoding or decoding error raises a :exc:`UnicodeError`. - - -.. function:: ignore_errors(exception) - - Implements the ``'ignore'`` error handling. - - Malformed data is ignored; encoding or decoding is continued without - further notice. + Implements the ``'strict'`` error handling: each encoding or + decoding error raises a :exc:`UnicodeError`. .. function:: replace_errors(exception) - Implements the ``'replace'`` error handling. - - Substitutes ``?`` (ASCII character) for encoding errors or ``�`` (U+FFFD, - the official REPLACEMENT CHARACTER) for decoding errors. + Implements the ``'replace'`` error handling (for :term:`text encodings + ` only): substitutes ``'?'`` for encoding errors + (to be encoded by the codec), and ``'\ufffd'`` (the Unicode replacement + character) for decoding errors. -.. function:: backslashreplace_errors(exception) - - Implements the ``'backslashreplace'`` error handling. - - Malformed data is replaced by a backslashed escape sequence. - On encoding, use the hexadecimal form of Unicode code point with formats - ``\xhh`` ``\uxxxx`` ``\Uxxxxxxxx``. On decoding, use the hexadecimal form of - byte value with format ``\xhh``. +.. function:: ignore_errors(exception) - .. versionchanged:: 3.5 - Works with decoding and translating. + Implements the ``'ignore'`` error handling: malformed data is ignored and + encoding or decoding is continued without further notice. .. function:: xmlcharrefreplace_errors(exception) - Implements the ``'xmlcharrefreplace'`` error handling (for encoding within - :term:`text encoding` only). + Implements the ``'xmlcharrefreplace'`` error handling (for encoding with + :term:`text encodings ` only): the + unencodable character is replaced by an appropriate XML character reference. - The unencodable character is replaced by an appropriate XML/HTML numeric - character reference, which is a decimal form of Unicode code point with - format ``&#num;`` . +.. function:: backslashreplace_errors(exception) -.. function:: namereplace_errors(exception) + Implements the ``'backslashreplace'`` error handling (for + :term:`text encodings ` only): malformed data is + replaced by a backslashed escape sequence. - Implements the ``'namereplace'`` error handling (for encoding within - :term:`text encoding` only). +.. function:: namereplace_errors(exception) - The unencodable character is replaced by a ``\N{...}`` escape sequence. The - set of characters that appear in the braces is the Name property from - Unicode Character Database. For example, the German lowercase letter ``'ß'`` - will be converted to byte sequence ``\N{LATIN SMALL LETTER SHARP S}`` . + Implements the ``'namereplace'`` error handling (for encoding with + :term:`text encodings ` only): the + unencodable character is replaced by a ``\N{...}`` escape sequence. .. versionadded:: 3.5 @@ -510,7 +470,7 @@ The base :class:`Codec` class defines these methods which also define the function interfaces of the stateless encoder and decoder: -.. method:: Codec.encode(input, errors='strict') +.. method:: Codec.encode(input[, errors]) Encodes the object *input* and returns a tuple (output object, length consumed). For instance, :term:`text encoding` converts @@ -528,7 +488,7 @@ function interfaces of the stateless encoder and decoder: of the output object type in this situation. -.. method:: Codec.decode(input, errors='strict') +.. method:: Codec.decode(input[, errors]) Decodes the object *input* and returns a tuple (output object, length consumed). For instance, for a :term:`text encoding`, decoding converts @@ -595,7 +555,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: encode(object, final=False) + .. method:: encode(object[, final]) Encodes *object* (taking the current state of the encoder into account) and returns the resulting encoded object. If this is the last call to @@ -652,7 +612,7 @@ define in order to be compatible with the Python codec registry. object. - .. method:: decode(object, final=False) + .. method:: decode(object[, final]) Decodes *object* (taking the current state of the decoder into account) and returns the resulting decoded object. If this is the last call to @@ -734,9 +694,8 @@ compatible with the Python codec registry. .. method:: writelines(list) - Writes the concatenated iterable of strings to the stream (possibly by reusing - the :meth:`write` method). Infinite or - very large iterables are not supported. The standard bytes-to-bytes codecs + Writes the concatenated list of strings to the stream (possibly by reusing + the :meth:`write` method). The standard bytes-to-bytes codecs do not support this method. @@ -786,7 +745,7 @@ compatible with the Python codec registry. :func:`register_error`. - .. method:: read(size=-1, chars=-1, firstline=False) + .. method:: read([size[, chars, [firstline]]]) Decodes data from the stream and returns the resulting object. @@ -812,7 +771,7 @@ compatible with the Python codec registry. available on the stream, these should be read too. - .. method:: readline(size=None, keepends=True) + .. method:: readline([size[, keepends]]) Read one line from the input stream and return the decoded data. @@ -823,7 +782,7 @@ compatible with the Python codec registry. returned. - .. method:: readlines(sizehint=None, keepends=True) + .. method:: readlines([sizehint[, keepends]]) Read all lines available on the input stream and return them as a list of lines. @@ -914,7 +873,7 @@ Encodings and Unicode --------------------- Strings are stored internally as sequences of code points in -range ``U+0000``--``U+10FFFF``. (See :pep:`393` for +range ``0x0``--``0x10FFFF``. (See :pep:`393` for more details about the implementation.) Once a string object is used outside of CPU and memory, endianness and how these arrays are stored as bytes become an issue. As with other @@ -952,7 +911,7 @@ there's the so called BOM ("Byte Order Mark"). This is the Unicode character ``U+FEFF``. This character can be prepended to every ``UTF-16`` or ``UTF-32`` byte sequence. The byte swapped version of this character (``0xFFFE``) is an illegal character that may not appear in a Unicode text. So when the -first character in a ``UTF-16`` or ``UTF-32`` byte sequence +first character in an ``UTF-16`` or ``UTF-32`` byte sequence appears to be a ``U+FFFE`` the bytes have to be swapped on decoding. Unfortunately the character ``U+FEFF`` had a second purpose as a ``ZERO WIDTH NO-BREAK SPACE``: a character that has no width and doesn't allow @@ -995,7 +954,7 @@ encoding was used for encoding a string. Each charmap encoding can decode any random byte sequence. However that's not possible with UTF-8, as UTF-8 byte sequences have a structure that doesn't allow arbitrary byte sequences. To increase the reliability with which a UTF-8 encoding can be -detected, Microsoft invented a variant of UTF-8 (that Python calls +detected, Microsoft invented a variant of UTF-8 (that Python 2.5 calls ``"utf-8-sig"``) for its Notepad program: Before any of the Unicode characters is written to the file, a UTF-8 encoded BOM (which looks like this as a byte sequence: ``0xef``, ``0xbb``, ``0xbf``) is written. As it's rather improbable @@ -1463,7 +1422,7 @@ Internationalized Domain Names (IDN)). It builds upon the ``punycode`` encoding and :mod:`stringprep`. If you need the IDNA 2008 standard from :rfc:`5891` and :rfc:`5895`, use the -third-party `idna module `_. +third-party `idna module _`. These RFCs together define a protocol to support non-ASCII characters in domain names. A domain name containing non-ASCII characters (such as diff --git a/Doc/library/collections.abc.rst b/Doc/library/collections.abc.rst index cb4f7670..0abc87f9 100644 --- a/Doc/library/collections.abc.rst +++ b/Doc/library/collections.abc.rst @@ -14,7 +14,7 @@ .. testsetup:: * - from collections import * + from collections.abc import * import itertools __name__ = '' @@ -24,9 +24,86 @@ This module provides :term:`abstract base classes ` that can be used to test whether a class provides a particular interface; for example, whether it is hashable or whether it is a mapping. -.. versionadded:: 3.9 - These abstract classes now support ``[]``. See :ref:`types-genericalias` - and :pep:`585`. +An :func:`issubclass` or :func:`isinstance` test for an interface works in one +of three ways. + +1) A newly written class can inherit directly from one of the +abstract base classes. The class must supply the required abstract +methods. The remaining mixin methods come from inheritance and can be +overridden if desired. Other methods may be added as needed: + +.. testcode:: + + class C(Sequence): # Direct inheritance + def __init__(self): ... # Extra method not required by the ABC + def __getitem__(self, index): ... # Required abstract method + def __len__(self): ... # Required abstract method + def count(self, value): ... # Optionally override a mixin method + +.. doctest:: + + >>> issubclass(C, Sequence) + True + >>> isinstance(C(), Sequence) + True + +2) Existing classes and built-in classes can be registered as "virtual +subclasses" of the ABCs. Those classes should define the full API +including all of the abstract methods and all of the mixin methods. +This lets users rely on :func:`issubclass` or :func:`isinstance` tests +to determine whether the full interface is supported. The exception to +this rule is for methods that are automatically inferred from the rest +of the API: + +.. testcode:: + + class D: # No inheritance + def __init__(self): ... # Extra method not required by the ABC + def __getitem__(self, index): ... # Abstract method + def __len__(self): ... # Abstract method + def count(self, value): ... # Mixin method + def index(self, value): ... # Mixin method + + Sequence.register(D) # Register instead of inherit + +.. doctest:: + + >>> issubclass(D, Sequence) + True + >>> isinstance(D(), Sequence) + True + +In this example, class :class:`D` does not need to define +``__contains__``, ``__iter__``, and ``__reversed__`` because the +:ref:`in-operator `, the :term:`iteration ` +logic, and the :func:`reversed` function automatically fall back to +using ``__getitem__`` and ``__len__``. + +3) Some simple interfaces are directly recognizable by the presence of +the required methods (unless those methods have been set to +:const:`None`): + +.. testcode:: + + class E: + def __iter__(self): ... + def __next__(next): ... + +.. doctest:: + + >>> issubclass(E, Iterable) + True + >>> isinstance(E(), Iterable) + True + +Complex interfaces do not support this last technique because an +interface is more than just the presence of method names. Interfaces +specify semantics and relationships between methods that cannot be +inferred solely from the presence of specific method names. For +example, knowing that a class supplies ``__getitem__``, ``__len__``, and +``__iter__`` is insufficient for distinguishing a :class:`Sequence` from +a :class:`Mapping`. + .. _collections-abstract-base-classes: @@ -37,67 +114,86 @@ The collections module offers the following :term:`ABCs `: .. tabularcolumns:: |l|L|L|L| -========================== ====================== ======================= ==================================================== -ABC Inherits from Abstract Methods Mixin Methods -========================== ====================== ======================= ==================================================== -:class:`Container` ``__contains__`` -:class:`Hashable` ``__hash__`` -:class:`Iterable` ``__iter__`` -:class:`Iterator` :class:`Iterable` ``__next__`` ``__iter__`` -:class:`Reversible` :class:`Iterable` ``__reversed__`` -:class:`Generator` :class:`Iterator` ``send``, ``throw`` ``close``, ``__iter__``, ``__next__`` -:class:`Sized` ``__len__`` -:class:`Callable` ``__call__`` -:class:`Collection` :class:`Sized`, ``__contains__``, - :class:`Iterable`, ``__iter__``, - :class:`Container` ``__len__`` - -:class:`Sequence` :class:`Reversible`, ``__getitem__``, ``__contains__``, ``__iter__``, ``__reversed__``, - :class:`Collection` ``__len__`` ``index``, and ``count`` - -:class:`MutableSequence` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods and - ``__setitem__``, ``append``, ``reverse``, ``extend``, ``pop``, - ``__delitem__``, ``remove``, and ``__iadd__`` - ``__len__``, - ``insert`` - -:class:`ByteString` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods - ``__len__`` - -:class:`Set` :class:`Collection` ``__contains__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, - ``__iter__``, ``__gt__``, ``__ge__``, ``__and__``, ``__or__``, - ``__len__`` ``__sub__``, ``__xor__``, and ``isdisjoint`` - -:class:`MutableSet` :class:`Set` ``__contains__``, Inherited :class:`Set` methods and - ``__iter__``, ``clear``, ``pop``, ``remove``, ``__ior__``, - ``__len__``, ``__iand__``, ``__ixor__``, and ``__isub__`` - ``add``, - ``discard`` - -:class:`Mapping` :class:`Collection` ``__getitem__``, ``__contains__``, ``keys``, ``items``, ``values``, - ``__iter__``, ``get``, ``__eq__``, and ``__ne__`` - ``__len__`` - -:class:`MutableMapping` :class:`Mapping` ``__getitem__``, Inherited :class:`Mapping` methods and - ``__setitem__``, ``pop``, ``popitem``, ``clear``, ``update``, - ``__delitem__``, and ``setdefault`` - ``__iter__``, - ``__len__`` - - -:class:`MappingView` :class:`Sized` ``__len__`` -:class:`ItemsView` :class:`MappingView`, ``__contains__``, - :class:`Set` ``__iter__`` -:class:`KeysView` :class:`MappingView`, ``__contains__``, - :class:`Set` ``__iter__`` -:class:`ValuesView` :class:`MappingView`, ``__contains__``, ``__iter__`` - :class:`Collection` -:class:`Awaitable` ``__await__`` -:class:`Coroutine` :class:`Awaitable` ``send``, ``throw`` ``close`` -:class:`AsyncIterable` ``__aiter__`` -:class:`AsyncIterator` :class:`AsyncIterable` ``__anext__`` ``__aiter__`` -:class:`AsyncGenerator` :class:`AsyncIterator` ``asend``, ``athrow`` ``aclose``, ``__aiter__``, ``__anext__`` -========================== ====================== ======================= ==================================================== +============================== ====================== ======================= ==================================================== +ABC Inherits from Abstract Methods Mixin Methods +============================== ====================== ======================= ==================================================== +:class:`Container` [1]_ ``__contains__`` +:class:`Hashable` [1]_ ``__hash__`` +:class:`Iterable` [1]_ [2]_ ``__iter__`` +:class:`Iterator` [1]_ :class:`Iterable` ``__next__`` ``__iter__`` +:class:`Reversible` [1]_ :class:`Iterable` ``__reversed__`` +:class:`Generator` [1]_ :class:`Iterator` ``send``, ``throw`` ``close``, ``__iter__``, ``__next__`` +:class:`Sized` [1]_ ``__len__`` +:class:`Callable` [1]_ ``__call__`` +:class:`Collection` [1]_ :class:`Sized`, ``__contains__``, + :class:`Iterable`, ``__iter__``, + :class:`Container` ``__len__`` + +:class:`Sequence` :class:`Reversible`, ``__getitem__``, ``__contains__``, ``__iter__``, ``__reversed__``, + :class:`Collection` ``__len__`` ``index``, and ``count`` + +:class:`MutableSequence` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods and + ``__setitem__``, ``append``, ``reverse``, ``extend``, ``pop``, + ``__delitem__``, ``remove``, and ``__iadd__`` + ``__len__``, + ``insert`` + +:class:`ByteString` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods + ``__len__`` + +:class:`Set` :class:`Collection` ``__contains__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``, + ``__iter__``, ``__gt__``, ``__ge__``, ``__and__``, ``__or__``, + ``__len__`` ``__sub__``, ``__xor__``, and ``isdisjoint`` + +:class:`MutableSet` :class:`Set` ``__contains__``, Inherited :class:`Set` methods and + ``__iter__``, ``clear``, ``pop``, ``remove``, ``__ior__``, + ``__len__``, ``__iand__``, ``__ixor__``, and ``__isub__`` + ``add``, + ``discard`` + +:class:`Mapping` :class:`Collection` ``__getitem__``, ``__contains__``, ``keys``, ``items``, ``values``, + ``__iter__``, ``get``, ``__eq__``, and ``__ne__`` + ``__len__`` + +:class:`MutableMapping` :class:`Mapping` ``__getitem__``, Inherited :class:`Mapping` methods and + ``__setitem__``, ``pop``, ``popitem``, ``clear``, ``update``, + ``__delitem__``, and ``setdefault`` + ``__iter__``, + ``__len__`` + + +:class:`MappingView` :class:`Sized` ``__len__`` +:class:`ItemsView` :class:`MappingView`, ``__contains__``, + :class:`Set` ``__iter__`` +:class:`KeysView` :class:`MappingView`, ``__contains__``, + :class:`Set` ``__iter__`` +:class:`ValuesView` :class:`MappingView`, ``__contains__``, ``__iter__`` + :class:`Collection` +:class:`Awaitable` [1]_ ``__await__`` +:class:`Coroutine` [1]_ :class:`Awaitable` ``send``, ``throw`` ``close`` +:class:`AsyncIterable` [1]_ ``__aiter__`` +:class:`AsyncIterator` [1]_ :class:`AsyncIterable` ``__anext__`` ``__aiter__`` +:class:`AsyncGenerator` [1]_ :class:`AsyncIterator` ``asend``, ``athrow`` ``aclose``, ``__aiter__``, ``__anext__`` +============================== ====================== ======================= ==================================================== + + +.. rubric:: Footnotes + +.. [1] These ABCs override :meth:`object.__subclasshook__` to support + testing an interface by verifying the required methods are present + and have not been set to :const:`None`. This only works for simple + interfaces. More complex interfaces require registration or direct + subclassing. + +.. [2] Checking ``isinstance(obj, Iterable)`` detects classes that are + registered as :class:`Iterable` or that have an :meth:`__iter__` + method, but it does not detect classes that iterate with the + :meth:`__getitem__` method. The only reliable way to determine + whether an object is :term:`iterable` is to call ``iter(obj)``. + + +Collections Abstract Base Classes -- Detailed Descriptions +---------------------------------------------------------- .. class:: Container @@ -247,8 +343,10 @@ ABC Inherits from Abstract Methods Mixin .. versionadded:: 3.6 +Examples and Recipes +-------------------- -These ABCs allow us to ask classes or instances if they provide +ABCs allow us to ask classes or instances if they provide particular functionality, for example:: size = None diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst index f3b8e2ab..4ba197e1 100644 --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -33,11 +33,6 @@ Python's general purpose built-in containers, :class:`dict`, :class:`list`, :class:`UserString` wrapper around string objects for easier string subclassing ===================== ==================================================================== -.. deprecated-removed:: 3.3 3.10 - Moved :ref:`collections-abstract-base-classes` to the :mod:`collections.abc` module. - For backwards compatibility, they continue to be visible in this module through - Python 3.9. - :class:`ChainMap` objects ------------------------- @@ -77,19 +72,23 @@ The class can be used to simulate nested scopes and is useful in templating. be modified to change which mappings are searched. The list should always contain at least one mapping. - .. method:: new_child(m=None) + .. method:: new_child(m=None, **kwargs) Returns a new :class:`ChainMap` containing a new map followed by all of the maps in the current instance. If ``m`` is specified, it becomes the new map at the front of the list of mappings; if not specified, an empty dict is used, so that a call to ``d.new_child()`` - is equivalent to: ``ChainMap({}, *d.maps)``. This method is used for - creating subcontexts that can be updated without altering values in any - of the parent mappings. + is equivalent to: ``ChainMap({}, *d.maps)``. If any keyword arguments + are specified, they update passed map or new empty dict. This method + is used for creating subcontexts that can be updated without altering + values in any of the parent mappings. .. versionchanged:: 3.4 The optional ``m`` parameter was added. + .. versionchanged:: 3.10 + Keyword arguments support was added. + .. attribute:: parents Property returning a new :class:`ChainMap` containing all of the maps in @@ -277,7 +276,7 @@ For example:: according to when an element is first encountered in the left operand and then by the order encountered in the right operand. - Counter objects support additional methods beyond those available for all + Counter objects support three methods beyond those available for all dictionaries: .. method:: elements() @@ -314,6 +313,16 @@ For example:: .. versionadded:: 3.2 + .. method:: total() + + Compute the sum of the counts. + + >>> c = Counter(a=10, b=5, c=0) + >>> c.total() + 15 + + .. versionadded:: 3.10 + The usual dictionary methods are available for :class:`Counter` objects except for two which work differently for counters. @@ -328,9 +337,22 @@ For example:: instead of replacing them. Also, the *iterable* is expected to be a sequence of elements, not a sequence of ``(key, value)`` pairs. +Counters support rich comparison operators for equality, subset, and +superset relationships: ``==``, ``!=``, ``<``, ``<=``, ``>``, ``>=``. +All of those tests treat missing elements as having zero counts so that +``Counter(a=1) == Counter(a=1, b=0)`` returns true. + +.. versionadded:: 3.10 + Rich comparison operations we were added + +.. versionchanged:: 3.10 + In equality tests, missing elements are treated as having zero counts. + Formerly, ``Counter(a=3)`` and ``Counter(a=3, b=0)`` were considered + distinct. + Common patterns for working with :class:`Counter` objects:: - sum(c.values()) # total of all counts + c.total() # total of all counts c.clear() # reset all counts list(c) # list unique elements set(c) # convert to a set @@ -1153,41 +1175,98 @@ variants of :func:`functools.lru_cache`: .. testcode:: - class LRU: + from time import time - def __init__(self, func, maxsize=128): + class TimeBoundedLRU: + "LRU Cache that invalidates and refreshes old entries." + + def __init__(self, func, maxsize=128, maxage=30): + self.cache = OrderedDict() # { args : (timestamp, result)} self.func = func self.maxsize = maxsize - self.cache = OrderedDict() + self.maxage = maxage def __call__(self, *args): if args in self.cache: - value = self.cache[args] self.cache.move_to_end(args) - return value - value = self.func(*args) - if len(self.cache) >= self.maxsize: - self.cache.popitem(False) - self.cache[args] = value - return value + timestamp, result = self.cache[args] + if time() - timestamp <= self.maxage: + return result + result = self.func(*args) + self.cache[args] = time(), result + if len(self.cache) > self.maxsize: + self.cache.popitem(0) + return result + + +.. testcode:: + + class MultiHitLRUCache: + """ LRU cache that defers caching a result until + it has been requested multiple times. + + To avoid flushing the LRU cache with one-time requests, + we don't cache until a request has been made more than once. + + """ + + def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1): + self.requests = OrderedDict() # { uncached_key : request_count } + self.cache = OrderedDict() # { cached_key : function_result } + self.func = func + self.maxrequests = maxrequests # max number of uncached requests + self.maxsize = maxsize # max number of stored return values + self.cache_after = cache_after + + def __call__(self, *args): + if args in self.cache: + self.cache.move_to_end(args) + return self.cache[args] + result = self.func(*args) + self.requests[args] = self.requests.get(args, 0) + 1 + if self.requests[args] <= self.cache_after: + self.requests.move_to_end(args) + if len(self.requests) > self.maxrequests: + self.requests.popitem(0) + else: + self.requests.pop(args, None) + self.cache[args] = result + if len(self.cache) > self.maxsize: + self.cache.popitem(0) + return result .. doctest:: :hide: >>> def square(x): - ... return x ** 2 + ... return x * x ... - >>> s = LRU(square, maxsize=5) - >>> actual = [(s(x), s(x)) for x in range(20)] - >>> expected = [(x**2, x**2) for x in range(20)] - >>> actual == expected + >>> f = MultiHitLRUCache(square, maxsize=4, maxrequests=6) + >>> list(map(f, range(10))) # First requests, don't cache + [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] + >>> f(4) # Cache the second request + 16 + >>> f(6) # Cache the second request + 36 + >>> f(2) # The first request aged out, so don't cache + 4 + >>> f(6) # Cache hit + 36 + >>> f(4) # Cache hit and move to front + 16 + >>> list(f.cache.values()) + [36, 16] + >>> set(f.requests).isdisjoint(f.cache) True - >>> actual = list(s.cache.items()) - >>> expected = [((x,), x**2) for x in range(15, 20)] - >>> actual == expected + >>> list(map(f, [9, 8, 7])) # Cache these second requests + [81, 64, 49] + >>> list(map(f, [7, 9])) # Cache hits + [49, 81] + >>> list(f.cache.values()) + [16, 64, 49, 81] + >>> set(f.requests).isdisjoint(f.cache) True - :class:`UserDict` objects ------------------------- diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst index 70a17a23..897efc2f 100644 --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -30,7 +30,7 @@ Executor Objects .. method:: submit(fn, /, *args, **kwargs) - Schedules the callable, *fn*, to be executed as ``fn(*args, **kwargs)`` + Schedules the callable, *fn*, to be executed as ``fn(*args **kwargs)`` and returns a :class:`Future` object representing the execution of the callable. :: @@ -435,8 +435,7 @@ Module Functions .. function:: wait(fs, timeout=None, return_when=ALL_COMPLETED) Wait for the :class:`Future` instances (possibly created by different - :class:`Executor` instances) given by *fs* to complete. Duplicate futures - given to *fs* are removed and will be returned only once. Returns a named + :class:`Executor` instances) given by *fs* to complete. Returns a named 2-tuple of sets. The first set, named ``done``, contains the futures that completed (finished or cancelled futures) before the wait completed. The second set, named ``not_done``, contains the futures that did not complete diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst index c98ffe71..1ebda53e 100644 --- a/Doc/library/configparser.rst +++ b/Doc/library/configparser.rst @@ -140,6 +140,30 @@ involves the ``DEFAULT`` section which provides default values for all other sections [1]_. Note also that keys in sections are case-insensitive and stored in lowercase [1]_. +It is possible to read several configurations into a single +:class:`ConfigParser`, where the most recently added configuration has the +highest priority. Any conflicting keys are taken from the more recent +configuration while the previously existing keys are retained. + +.. doctest:: + + >>> another_config = configparser.ConfigParser() + >>> another_config.read('example.ini') + ['example.ini'] + >>> another_config['topsecret.server.com']['Port'] + '50022' + >>> another_config.read_string("[topsecret.server.com]\nPort=48484") + >>> another_config['topsecret.server.com']['Port'] + '48484' + >>> another_config.read_dict({"topsecret.server.com": {"Port": 21212}}) + >>> another_config['topsecret.server.com']['Port'] + '21212' + >>> another_config['topsecret.server.com']['ForwardX11'] + 'no' + +This behaviour is equivalent to a :meth:`ConfigParser.read` call with several +files passed to the *filenames* parameter. + Supported Datatypes ------------------- @@ -243,9 +267,6 @@ out. Values can also span multiple lines, as long as they are indented deeper than the first line of the value. Depending on the parser's mode, blank lines may be treated as parts of multiline values or ignored. -By default, a valid section name can be any string that does not contain '\\n' or ']'. -To change this, see :attr:`ConfigParser.SECTCRE`. - Configuration files may include comments, prefixed by specific characters (``#`` and ``;`` by default [1]_). Comments may appear on their own on an otherwise empty line, possibly indented. [1]_ @@ -323,8 +344,7 @@ from ``get()`` calls. my_pictures: %(my_dir)s/Pictures [Escape] - # use a %% to escape the % sign (% is the only character that needs to be escaped): - gain: 80%% + gain: 80%% # use a %% to escape the % sign (% is the only character that needs to be escaped) In the example above, :class:`ConfigParser` with *interpolation* set to ``BasicInterpolation()`` would resolve ``%(home_dir)s`` to the value of @@ -359,8 +379,7 @@ from ``get()`` calls. my_pictures: ${my_dir}/Pictures [Escape] - # use a $$ to escape the $ sign ($ is the only character that needs to be escaped): - cost: $$80 + cost: $$80 # use a $$ to escape the $ sign ($ is the only character that needs to be escaped) Values from other sections can be fetched as well: diff --git a/Doc/library/constants.rst b/Doc/library/constants.rst index f17e1a37..38dd552a 100644 --- a/Doc/library/constants.rst +++ b/Doc/library/constants.rst @@ -19,19 +19,21 @@ A small number of constants live in the built-in namespace. They are: .. data:: None - The sole value of the type ``NoneType``. ``None`` is frequently used to - represent the absence of a value, as when default arguments are not passed to a - function. Assignments to ``None`` are illegal and raise a :exc:`SyntaxError`. + An object frequently used to represent the absence of a value, as when + default arguments are not passed to a function. Assignments to ``None`` + are illegal and raise a :exc:`SyntaxError`. + ``None`` is the sole instance of the :data:`NoneType` type. .. data:: NotImplemented - Special value which should be returned by the binary special methods + A special value which should be returned by the binary special methods (e.g. :meth:`__eq__`, :meth:`__lt__`, :meth:`__add__`, :meth:`__rsub__`, etc.) to indicate that the operation is not implemented with respect to the other type; may be returned by the in-place binary special methods (e.g. :meth:`__imul__`, :meth:`__iand__`, etc.) for the same purpose. It should not be evaluated in a boolean context. + ``NotImplemented`` is the sole instance of the :data:`types.NotImplementedType` type. .. note:: @@ -59,8 +61,9 @@ A small number of constants live in the built-in namespace. They are: .. index:: single: ...; ellipsis literal .. data:: Ellipsis - The same as the ellipsis literal "``...``". Special value used mostly in conjunction + The same as the ellipsis literal "``...``". Special value used mostly in conjunction with extended slicing syntax for user-defined container data types. + ``Ellipsis`` is the sole instance of the :data:`types.EllipsisType` type. .. data:: __debug__ diff --git a/Doc/library/contextlib.rst b/Doc/library/contextlib.rst index d471c8ce..3dbf3a8f 100644 --- a/Doc/library/contextlib.rst +++ b/Doc/library/contextlib.rst @@ -126,6 +126,31 @@ Functions and classes provided: .. versionadded:: 3.7 + Context managers defined with :func:`asynccontextmanager` can be used + either as decorators or with :keyword:`async with` statements:: + + import time + + async def timeit(): + now = time.monotonic() + try: + yield + finally: + print(f'it took {time.monotonic() - now}s to run') + + @timeit() + async def main(): + # ... async code ... + + When used as a decorator, a new generator instance is implicitly created on + each function call. This allows the otherwise "one-shot" context managers + created by :func:`asynccontextmanager` to meet the requirement that context + managers support multiple invocations in order to be used as decorators. + + .. versionchanged:: 3.10 + Async context managers created with :func:`asynccontextmanager` can + be used as decorators. + .. function:: closing(thing) @@ -154,6 +179,39 @@ Functions and classes provided: ``page.close()`` will be called when the :keyword:`with` block is exited. +.. class:: aclosing(thing) + + Return an async context manager that calls the ``aclose()`` method of *thing* + upon completion of the block. This is basically equivalent to:: + + from contextlib import asynccontextmanager + + @asynccontextmanager + async def aclosing(thing): + try: + yield thing + finally: + await thing.aclose() + + Significantly, ``aclosing()`` supports deterministic cleanup of async + generators when they happen to exit early by :keyword:`break` or an + exception. For example:: + + from contextlib import aclosing + + async with aclosing(my_generator()) as values: + async for value in values: + if value == 42: + break + + This pattern ensures that the generator's async exit code is executed in + the same context as its iterations (so that exceptions and context + variables work as expected, and the exit code isn't run after the + lifetime of some task it depends on). + + .. versionadded:: 3.10 + + .. _simplifying-support-for-single-optional-context-managers: .. function:: nullcontext(enter_result=None) @@ -185,8 +243,26 @@ Functions and classes provided: with cm as file: # Perform processing on the file + It can also be used as a stand-in for + :ref:`asynchronous context managers `:: + + async def send_http(session=None): + if not session: + # If no http session, create it with aiohttp + cm = aiohttp.ClientSession() + else: + # Caller is responsible for closing the session + cm = nullcontext(session) + + async with cm as session: + # Send http requests with session + .. versionadded:: 3.7 + .. versionchanged:: 3.10 + :term:`asynchronous context manager` support was added. + + .. function:: suppress(*exceptions) @@ -353,6 +429,45 @@ Functions and classes provided: .. versionadded:: 3.2 +.. class:: AsyncContextDecorator + + Similar to :class:`ContextDecorator` but only for asynchronous functions. + + Example of ``AsyncContextDecorator``:: + + from asyncio import run + from contextlib import AsyncContextDecorator + + class mycontext(AsyncContextDecorator): + async def __aenter__(self): + print('Starting') + return self + + async def __aexit__(self, *exc): + print('Finishing') + return False + + >>> @mycontext() + ... async def function(): + ... print('The bit in the middle') + ... + >>> run(function()) + Starting + The bit in the middle + Finishing + + >>> async def function(): + ... async with mycontext(): + ... print('The bit in the middle') + ... + >>> run(function()) + Starting + The bit in the middle + Finishing + + .. versionadded:: 3.10 + + .. class:: ExitStack() A context manager that is designed to make it easy to programmatically @@ -368,9 +483,6 @@ Functions and classes provided: # the with statement, even if attempts to open files later # in the list raise an exception - The :meth:`__enter__` method returns the :class:`ExitStack` instance, and - performs no additional operations. - Each instance maintains a stack of registered callbacks that are called in reverse order when the instance is closed (either explicitly or implicitly at the end of a :keyword:`with` statement). Note that callbacks are *not* diff --git a/Doc/library/contextvars.rst b/Doc/library/contextvars.rst index be1dd0c9..14ac47f4 100644 --- a/Doc/library/contextvars.rst +++ b/Doc/library/contextvars.rst @@ -94,7 +94,7 @@ Context Variables # var.get() would raise a LookupError. -.. class:: Token +.. class:: contextvars.Token *Token* objects are returned by the :meth:`ContextVar.set` method. They can be passed to the :meth:`ContextVar.reset` method to revert diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst index ce50c331..01ebf198 100644 --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -60,7 +60,7 @@ The :func:`deepcopy` function avoids these problems by: components copied. This module does not copy types like module, method, stack trace, stack frame, -file, socket, window, or any similar types. It does "copy" functions and +file, socket, window, array, or any similar types. It does "copy" functions and classes (shallow and deeply), by returning the original object unchanged; this is compatible with the way these are treated by the :mod:`pickle` module. @@ -86,6 +86,7 @@ The latter is called to implement the deep copy operation; it is passed one argument, the ``memo`` dictionary. If the :meth:`__deepcopy__` implementation needs to make a deep copy of a component, it should call the :func:`deepcopy` function with the component as first argument and the memo dictionary as second argument. +The memo dictionary should be treated as an opaque object. .. seealso:: diff --git a/Doc/library/copyreg.rst b/Doc/library/copyreg.rst index dc35965b..43920210 100644 --- a/Doc/library/copyreg.rst +++ b/Doc/library/copyreg.rst @@ -33,8 +33,8 @@ Such constructors may be factory functions or class instances. The optional *constructor* parameter, if provided, is a callable object which can be used to reconstruct the object when called with the tuple of arguments - returned by *function* at pickling time. A :exc:`TypeError` is raised if the - *constructor* is not callable. + returned by *function* at pickling time. :exc:`TypeError` will be raised if + *object* is a class or *constructor* is not callable. See the :mod:`pickle` module for more details on the interface expected of *function* and *constructor*. Note that the diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst index e795f10f..d25c626a 100644 --- a/Doc/library/crypt.rst +++ b/Doc/library/crypt.rst @@ -4,7 +4,6 @@ .. module:: crypt :platform: Unix :synopsis: The crypt() function used to check Unix passwords. - :deprecated: .. moduleauthor:: Steven D. Majewski .. sectionauthor:: Steven D. Majewski @@ -16,11 +15,6 @@ single: crypt(3) pair: cipher; DES -.. deprecated:: 3.11 - The :mod:`crypt` module is deprecated - (see :pep:`PEP 594 <594#crypt>` for details and alternatives). - The :mod:`hashlib` module is a potential replacement for certain use cases. - -------------- This module implements an interface to the :manpage:`crypt(3)` routine, which is @@ -98,7 +92,8 @@ The :mod:`crypt` module defines the following functions: :func:`mksalt`, one of the ``crypt.METHOD_*`` values (though not all may be available on all platforms), or a full encrypted password including salt, as returned by this function. If *salt* is not - provided, the strongest method available in :attr:`methods` will be used. + provided, the strongest method will be used (as returned by + :func:`methods`). Checking a password is usually done by passing the plain-text password as *word* and the full results of a previous :func:`crypt` call, @@ -126,8 +121,8 @@ The :mod:`crypt` module defines the following functions: .. function:: mksalt(method=None, *, rounds=None) Return a randomly generated salt of the specified method. If no - *method* is given, the strongest method available in :attr:`methods` is - used. + *method* is given, the strongest method available as returned by + :func:`methods` is used. The return value is a string suitable for passing as the *salt* argument to :func:`crypt`. diff --git a/Doc/library/csv.rst b/Doc/library/csv.rst index 275ee10e..899ce022 100644 --- a/Doc/library/csv.rst +++ b/Doc/library/csv.rst @@ -281,6 +281,20 @@ The :mod:`csv` module defines the following classes: Analyze the sample text (presumed to be in CSV format) and return :const:`True` if the first row appears to be a series of column headers. + Inspecting each column, one of two key criteria will be considered to + estimate if the sample contains a header: + + - the second through n-th rows contain numeric values + - the second through n-th rows contain strings where at least one value's + length differs from that of the putative header of that column. + + Twenty rows after the first row are sampled; if more than half of columns + + rows meet the criteria, :const:`True` is returned. + + .. note:: + + This method is a rough heuristic and may produce both false positives and + negatives. An example for :class:`Sniffer` use:: diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index 19ce19b1..b186f1d5 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1320,7 +1320,7 @@ There are several ways to load shared libraries into the Python process. One way is to instantiate one of the following classes: -.. class:: CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) +.. class:: CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) Instances of this class represent loaded shared libraries. Functions in these libraries use the standard C calling convention, and are assumed to return @@ -1342,7 +1342,7 @@ way is to instantiate one of the following classes: -- A tool to find DLL dependents. -.. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) +.. class:: OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) Windows only: Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are @@ -1355,12 +1355,16 @@ way is to instantiate one of the following classes: :exc:`WindowsError` used to be raised. -.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=None) +.. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0) Windows only: Instances of this class represent loaded shared libraries, functions in these libraries use the ``stdcall`` calling convention, and are assumed to return :c:type:`int` by default. + On Windows CE only the standard calling convention is used, for convenience the + :class:`WinDLL` and :class:`OleDLL` use the standard calling convention on this + platform. + The Python :term:`global interpreter lock` is released before calling any function exported by these libraries, and reacquired afterwards. @@ -1661,7 +1665,8 @@ See :ref:`ctypes-callback-functions` for examples. .. function:: WINFUNCTYPE(restype, *argtypes, use_errno=False, use_last_error=False) Windows only: The returned function prototype creates functions that use the - ``stdcall`` calling convention. The function will + ``stdcall`` calling convention, except on Windows CE where + :func:`WINFUNCTYPE` is the same as :func:`CFUNCTYPE`. The function will release the GIL during the call. *use_errno* and *use_last_error* have the same meaning as above. @@ -2508,7 +2513,7 @@ Arrays and pointers Abstract base class for arrays. The recommended way to create concrete array types is by multiplying any - :mod:`ctypes` data type with a non-negative integer. Alternatively, you can subclass + :mod:`ctypes` data type with a positive integer. Alternatively, you can subclass this type and define :attr:`_length_` and :attr:`_type_` class variables. Array elements can be read and written using standard subscript and slice accesses; for slice reads, the resulting object is diff --git a/Doc/library/curses.rst b/Doc/library/curses.rst index c72840a0..efbece43 100644 --- a/Doc/library/curses.rst +++ b/Doc/library/curses.rst @@ -220,11 +220,15 @@ The module :mod:`curses` defines the following functions: multiple devices, and *x*, *y*, *z* are the event's coordinates. (*z* is currently unused.) *bstate* is an integer value whose bits will be set to indicate the type of event, and will be the bitwise OR of one or more of the - following constants, where *n* is the button number from 1 to 4: + following constants, where *n* is the button number from 1 to 5: :const:`BUTTONn_PRESSED`, :const:`BUTTONn_RELEASED`, :const:`BUTTONn_CLICKED`, :const:`BUTTONn_DOUBLE_CLICKED`, :const:`BUTTONn_TRIPLE_CLICKED`, :const:`BUTTON_SHIFT`, :const:`BUTTON_CTRL`, :const:`BUTTON_ALT`. + .. versionchanged:: 3.10 + The ``BUTTON5_*`` constants are now exposed if they are provided by the + underlying curses library. + .. function:: getsyx() @@ -243,6 +247,15 @@ The module :mod:`curses` defines the following functions: Return ``True`` if the terminal can display colors; otherwise, return ``False``. +.. function:: has_extended_color_support() + + Return ``True`` if the module supports extended colors; otherwise, return + ``False``. Extended color support allows more than 256 color pairs for + terminals that support more than 16 colors (e.g. xterm-256color). + + Extended color support requires ncurses version 6.1 or later. + + .. versionadded:: 3.10 .. function:: has_ic() @@ -902,6 +915,9 @@ the following methods and attributes: determining what subset of the screen windows enclose the location of a mouse event. + .. versionchanged:: 3.10 + Previously it returned ``1`` or ``0`` instead of ``True`` or ``False``. + .. attribute:: window.encoding diff --git a/Doc/library/dataclasses.rst b/Doc/library/dataclasses.rst index 808e67b1..5915bacb 100644 --- a/Doc/library/dataclasses.rst +++ b/Doc/library/dataclasses.rst @@ -43,10 +43,10 @@ directly specified in the ``InventoryItem`` definition shown above. .. versionadded:: 3.7 -Module-level decorators, classes, and functions ------------------------------------------------ +Module contents +--------------- -.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False) +.. decorator:: dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False) This function is a :term:`decorator` that is used to add generated :term:`special method`\s to classes, as described below. @@ -79,7 +79,7 @@ Module-level decorators, classes, and functions class C: ... - @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False) + @dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False) class C: ... @@ -161,6 +161,33 @@ Module-level decorators, classes, and functions :meth:`__setattr__` or :meth:`__delattr__` is defined in the class, then :exc:`TypeError` is raised. See the discussion below. + - ``match_args``: If true (the default is ``True``), the + ``__match_args__`` tuple will be created from the list of + parameters to the generated :meth:`__init__` method (even if + :meth:`__init__` is not generated, see above). If false, or if + ``__match_args__`` is already defined in the class, then + ``__match_args__`` will not be generated. + + .. versionadded:: 3.10 + + - ``kw_only``: If true (the default value is ``False``), then all + fields will be marked as keyword-only. If a field is marked as + keyword-only, then the only affect is that the :meth:`__init__` + parameter generated from a keyword-only field must be specified + with a keyword when :meth:`__init__` is called. There is no + effect on any other aspect of dataclasses. See the + :term:`parameter` glossary entry for details. Also see the + :const:`KW_ONLY` section. + + .. versionadded:: 3.10 + + - ``slots``: If true (the default is ``False``), :attr:`__slots__` attribute + will be generated and new class will be returned instead of the original one. + If :attr:`__slots__` is already defined in the class, then :exc:`TypeError` + is raised. + + .. versionadded:: 3.10 + ``field``\s may optionally specify a default value, using normal Python syntax:: @@ -178,7 +205,7 @@ Module-level decorators, classes, and functions follows a field with a default value. This is true whether this occurs in a single class, or as a result of class inheritance. -.. function:: field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None) +.. function:: field(*, default=MISSING, default_factory=MISSING, init=True, repr=True, hash=None, compare=True, metadata=None, kw_only=MISSING) For common and simple use cases, no other functionality is required. There are, however, some dataclass features that @@ -193,11 +220,10 @@ Module-level decorators, classes, and functions c = C() c.mylist += [1, 2, 3] - As shown above, the ``MISSING`` value is a sentinel object used to - detect if the ``default`` and ``default_factory`` parameters are - provided. This sentinel is used because ``None`` is a valid value - for ``default``. No code should directly use the ``MISSING`` - value. + As shown above, the :const:`MISSING` value is a sentinel object used to + detect if some parameters are provided by the user. This sentinel is + used because ``None`` is a valid value for some parameters with + a distinct meaning. No code should directly use the :const:`MISSING` value. The parameters to :func:`field` are: @@ -217,10 +243,6 @@ Module-level decorators, classes, and functions - ``repr``: If true (the default), this field is included in the string returned by the generated :meth:`__repr__` method. - - ``compare``: If true (the default), this field is included in the - generated equality and comparison methods (:meth:`__eq__`, - :meth:`__gt__`, et al.). - - ``hash``: This can be a bool or ``None``. If true, this field is included in the generated :meth:`__hash__` method. If ``None`` (the default), use the value of ``compare``: this would normally be @@ -234,6 +256,10 @@ Module-level decorators, classes, and functions fields that contribute to the type's hash value. Even if a field is excluded from the hash, it will still be used for comparisons. + - ``compare``: If true (the default), this field is included in the + generated equality and comparison methods (:meth:`__eq__`, + :meth:`__gt__`, et al.). + - ``metadata``: This can be a mapping or None. None is treated as an empty dict. This value is wrapped in :func:`~types.MappingProxyType` to make it read-only, and exposed @@ -242,6 +268,12 @@ Module-level decorators, classes, and functions Multiple third-parties can each have their own key, to use as a namespace in the metadata. + - ``kw_only``: If true, this field will be marked as keyword-only. + This is used when the generated :meth:`__init__` method's + parameters are computed. + + .. versionadded:: 3.10 + If the default value of a field is specified by a call to :func:`field()`, then the class attribute for this field will be replaced by the specified ``default`` value. If no ``default`` is @@ -274,8 +306,8 @@ Module-level decorators, classes, and functions - ``type``: The type of the field. - ``default``, ``default_factory``, ``init``, ``repr``, ``hash``, - ``compare``, and ``metadata`` have the identical meaning and - values as they do in the :func:`field` declaration. + ``compare``, ``metadata``, and ``kw_only`` have the identical + meaning and values as they do in the :func:`field` function. Other attributes may exist, but they are private and must not be inspected or relied on. @@ -287,15 +319,12 @@ Module-level decorators, classes, and functions Raises :exc:`TypeError` if not passed a dataclass or instance of one. Does not return pseudo-fields which are ``ClassVar`` or ``InitVar``. -.. function:: asdict(obj, *, dict_factory=dict) +.. function:: asdict(instance, *, dict_factory=dict) - Converts the dataclass ``obj`` to a dict (by using the + Converts the dataclass ``instance`` to a dict (by using the factory function ``dict_factory``). Each dataclass is converted to a dict of its fields, as ``name: value`` pairs. dataclasses, dicts, - lists, and tuples are recursed into. Other objects are copied with - :func:`copy.deepcopy`. - - Example of using :func:`asdict` on nested dataclasses:: + lists, and tuples are recursed into. For example:: @dataclass class Point: @@ -312,34 +341,23 @@ Module-level decorators, classes, and functions c = C([Point(0, 0), Point(10, 4)]) assert asdict(c) == {'mylist': [{'x': 0, 'y': 0}, {'x': 10, 'y': 4}]} - To create a shallow copy, the following workaround may be used:: - - dict((field.name, getattr(obj, field.name)) for field in fields(obj)) + Raises :exc:`TypeError` if ``instance`` is not a dataclass instance. - :func:`asdict` raises :exc:`TypeError` if ``obj`` is not a dataclass - instance. +.. function:: astuple(instance, *, tuple_factory=tuple) -.. function:: astuple(obj, *, tuple_factory=tuple) - - Converts the dataclass ``obj`` to a tuple (by using the + Converts the dataclass ``instance`` to a tuple (by using the factory function ``tuple_factory``). Each dataclass is converted to a tuple of its field values. dataclasses, dicts, lists, and - tuples are recursed into. Other objects are copied with - :func:`copy.deepcopy`. + tuples are recursed into. Continuing from the previous example:: assert astuple(p) == (10, 20) assert astuple(c) == ([(0, 0), (10, 4)],) - To create a shallow copy, the following workaround may be used:: - - tuple(getattr(obj, field.name) for field in dataclasses.fields(obj)) + Raises :exc:`TypeError` if ``instance`` is not a dataclass instance. - :func:`astuple` raises :exc:`TypeError` if ``obj`` is not a dataclass - instance. - -.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False) +.. function:: make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False, match_args=True, kw_only=False, slots=False) Creates a new dataclass with name ``cls_name``, fields as defined in ``fields``, base classes as given in ``bases``, and initialized @@ -347,8 +365,9 @@ Module-level decorators, classes, and functions iterable whose elements are each either ``name``, ``(name, type)``, or ``(name, type, Field)``. If just ``name`` is supplied, ``typing.Any`` is used for ``type``. The values of ``init``, - ``repr``, ``eq``, ``order``, ``unsafe_hash``, and ``frozen`` have - the same meaning as they do in :func:`dataclass`. + ``repr``, ``eq``, ``order``, ``unsafe_hash``, ``frozen``, + ``match_args``, ``kw_only``, and ``slots`` have the same meaning as + they do in :func:`dataclass`. This function is not strictly required, because any Python mechanism for creating a new class with ``__annotations__`` can @@ -373,10 +392,10 @@ Module-level decorators, classes, and functions def add_one(self): return self.x + 1 -.. function:: replace(obj, /, **changes) +.. function:: replace(instance, /, **changes) - Creates a new object of the same type as ``obj``, replacing - fields with values from ``changes``. If ``obj`` is not a Data + Creates a new object of the same type as ``instance``, replacing + fields with values from ``changes``. If ``instance`` is not a Data Class, raises :exc:`TypeError`. If values in ``changes`` do not specify fields, raises :exc:`TypeError`. @@ -401,7 +420,7 @@ Module-level decorators, classes, and functions ``replace()`` (or similarly named) method which handles instance copying. -.. function:: is_dataclass(obj) +.. function:: is_dataclass(class_or_instance) Return ``True`` if its parameter is a dataclass or an instance of one, otherwise return ``False``. @@ -413,6 +432,41 @@ Module-level decorators, classes, and functions def is_dataclass_instance(obj): return is_dataclass(obj) and not isinstance(obj, type) +.. data:: MISSING + + A sentinel value signifying a missing default or default_factory. + +.. data:: KW_ONLY + + A sentinel value used as a type annotation. Any fields after a + pseudo-field with the type of :const:`KW_ONLY` are marked as + keyword-only fields. Note that a pseudo-field of type + :const:`KW_ONLY` is otherwise completely ignored. This includes the + name of such a field. By convention, a name of ``_`` is used for a + :const:`KW_ONLY` field. Keyword-only fields signify + :meth:`__init__` parameters that must be specified as keywords when + the class is instantiated. + + In this example, the fields ``y`` and ``z`` will be marked as keyword-only fields:: + + @dataclass + class Point: + x: float + _: KW_ONLY + y: float + z: float + + p = Point(0, y=1.5, z=2.0) + + In a single dataclass, it is an error to specify more than one + field whose type is :const:`KW_ONLY`. + +.. exception:: FrozenInstanceError + + Raised when an implicitly defined :meth:`__setattr__` or + :meth:`__delattr__` is called on a dataclass which was defined with + ``frozen=True``. It is a subclass of :exc:`AttributeError`. + Post-init processing -------------------- @@ -546,6 +600,42 @@ The generated :meth:`__init__` method for ``C`` will look like:: def __init__(self, x: int = 15, y: int = 0, z: int = 10): +Re-ordering of keyword-only parameters in :meth:`__init__` +---------------------------------------------------------- + +After the parameters needed for :meth:`__init__` are computed, any +keyword-only parameters are moved to come after all regular +(non-keyword-only) parameters. This is a requirement of how +keyword-only parameters are implemented in Python: they must come +after non-keyword-only parameters. + +In this example, ``Base.y``, ``Base.w``, and ``D.t`` are keyword-only +fields, and ``Base.x`` and ``D.z`` are regular fields:: + + @dataclass + class Base: + x: Any = 15.0 + _: KW_ONLY + y: int = 0 + w: int = 1 + + @dataclass + class D(Base): + z: int = 10 + t: int = field(kw_only=True, default=0) + +The generated :meth:`__init__` method for ``D`` will look like:: + + def __init__(self, x: Any = 15.0, z: int = 10, *, y: int = 0, w: int = 1, t: int = 0): + +Note that the parameters have been re-ordered from how they appear in +the list of fields: parameters derived from regular fields are +followed by parameters derived from keyword-only fields. + +The relative ordering of keyword-only parameters is maintained in the +re-ordered :meth:`__init__` parameter list. + + Default factory functions ------------------------- @@ -602,14 +692,15 @@ Mutable default values assert D().x is D().x This has the same issue as the original example using class ``C``. - That is, two instances of class ``D`` that do not specify a value for - ``x`` when creating a class instance will share the same copy of - ``x``. Because dataclasses just use normal Python class creation - they also share this behavior. There is no general way for Data - Classes to detect this condition. Instead, dataclasses will raise a - :exc:`TypeError` if it detects a default parameter of type ``list``, - ``dict``, or ``set``. This is a partial solution, but it does protect - against many common errors. + That is, two instances of class ``D`` that do not specify a value + for ``x`` when creating a class instance will share the same copy + of ``x``. Because dataclasses just use normal Python class + creation they also share this behavior. There is no general way + for Data Classes to detect this condition. Instead, the + :func:`dataclass` decorator will raise a :exc:`TypeError` if it + detects a default parameter of type ``list``, ``dict``, or ``set``. + This is a partial solution, but it does protect against many common + errors. Using default factory functions is a way to create new instances of mutable types as default values for fields:: @@ -619,12 +710,3 @@ Mutable default values x: list = field(default_factory=list) assert D().x is not D().x - -Exceptions ----------- - -.. exception:: FrozenInstanceError - - Raised when an implicitly defined :meth:`__setattr__` or - :meth:`__delattr__` is called on a dataclass which was defined with - ``frozen=True``. It is a subclass of :exc:`AttributeError`. diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index f447b7bc..196aa844 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -27,9 +27,6 @@ on efficient attribute extraction for output formatting and manipulation. Module :mod:`time` Time access and conversions. - Module :mod:`zoneinfo` - Concrete time zones representing the IANA time zone database. - Package `dateutil `_ Third-party library with expanded time zone and parsing support. @@ -2177,13 +2174,14 @@ only EST (fixed offset -5 hours), or only EDT (fixed offset -4 hours)). .. seealso:: - :mod:`zoneinfo` + `dateutil.tz `_ The :mod:`datetime` module has a basic :class:`timezone` class (for handling arbitrary fixed offsets from UTC) and its :attr:`timezone.utc` attribute (a UTC timezone instance). - ``zoneinfo`` brings the *IANA timezone database* (also known as the Olson - database) to Python, and its usage is recommended. + *dateutil.tz* library brings the *IANA timezone database* + (also known as the Olson database) to Python, and its usage is + recommended. `IANA timezone database `_ The Time Zone Database (often called tz, tzdata or zoneinfo) contains code @@ -2359,8 +2357,8 @@ requires, and these work on all platforms with a standard C implementation. | | decimal number. | | \(9) | +-----------+--------------------------------+------------------------+-------+ | ``%f`` | Microsecond as a decimal | 000000, 000001, ..., | \(5) | -| | number, zero-padded to 6 | 999999 | | -| | digits. | | | +| | number, zero-padded on the | 999999 | | +| | left. | | | +-----------+--------------------------------+------------------------+-------+ | ``%z`` | UTC offset in the form | (empty), +0000, | \(6) | | | ``±HHMM[SS[.ffffff]]`` (empty | -0400, +1030, | | @@ -2375,7 +2373,7 @@ requires, and these work on all platforms with a standard C implementation. +-----------+--------------------------------+------------------------+-------+ | ``%U`` | Week number of the year | 00, 01, ..., 53 | \(7), | | | (Sunday as the first day of | | \(9) | -| | the week) as a zero-padded | | | +| | the week) as a zero padded | | | | | decimal number. All days in a | | | | | new year preceding the first | | | | | Sunday are considered to be in | | | @@ -2383,10 +2381,10 @@ requires, and these work on all platforms with a standard C implementation. +-----------+--------------------------------+------------------------+-------+ | ``%W`` | Week number of the year | 00, 01, ..., 53 | \(7), | | | (Monday as the first day of | | \(9) | -| | the week) as a zero-padded | | | -| | decimal number. All days in a | | | -| | new year preceding the first | | | -| | Monday are considered to be in | | | +| | the week) as a decimal number. | | | +| | All days in a new year | | | +| | preceding the first Monday | | | +| | are considered to be in | | | | | week 0. | | | +-----------+--------------------------------+------------------------+-------+ | ``%c`` | Locale's appropriate date and || Tue Aug 16 21:30:00 | \(1) | diff --git a/Doc/library/decimal.rst b/Doc/library/decimal.rst index e194649e..e759c5cf 100644 --- a/Doc/library/decimal.rst +++ b/Doc/library/decimal.rst @@ -1484,7 +1484,8 @@ are also included in the pure Python version for compatibility. .. data:: HAVE_CONTEXTVAR - The default value is ``True``. If Python is compiled ``--without-decimal-contextvar``, + The default value is ``True``. If Python is :option:`configured using + the --without-decimal-contextvar option <--without-decimal-contextvar>`, the C version uses a thread-local rather than a coroutine-local context and the value is ``False``. This is slightly faster in some nested context scenarios. diff --git a/Doc/library/devmode.rst b/Doc/library/devmode.rst index d5a40cde..44e7d4f5 100644 --- a/Doc/library/devmode.rst +++ b/Doc/library/devmode.rst @@ -13,6 +13,8 @@ detected. It can be enabled using the :option:`-X dev <-X>` command line option or by setting the :envvar:`PYTHONDEVMODE` environment variable to ``1``. +See also :ref:`Python debug build `. + Effects of the Python Development Mode ====================================== @@ -93,6 +95,9 @@ The Python Development Mode does not prevent the :option:`-O` command line option from removing :keyword:`assert` statements nor from setting :const:`__debug__` to ``False``. +The Python Development Mode can only be enabled at the Python startup. Its +value can be read from :data:`sys.flags.dev_mode `. + .. versionchanged:: 3.8 The :class:`io.IOBase` destructor now logs ``close()`` exceptions. diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 6d71398f..e7e67daa 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -708,7 +708,8 @@ iterations of the loop. .. opcode:: RERAISE - Re-raises the exception currently on top of the stack. + Re-raises the exception currently on top of the stack. If oparg is non-zero, + restores ``f_lasti`` of the current frame to its value when the exception was raised. .. versionadded:: 3.9 @@ -751,6 +752,52 @@ iterations of the loop. .. versionadded:: 3.2 +.. opcode:: COPY_DICT_WITHOUT_KEYS + + TOS is a tuple of mapping keys, and TOS1 is the match subject. Replace TOS + with a :class:`dict` formed from the items of TOS1, but without any of the + keys in TOS. + + .. versionadded:: 3.10 + + +.. opcode:: GET_LEN + + Push ``len(TOS)`` onto the stack. + + .. versionadded:: 3.10 + + +.. opcode:: MATCH_MAPPING + + If TOS is an instance of :class:`collections.abc.Mapping` (or, more technically: if + it has the :const:`Py_TPFLAGS_MAPPING` flag set in its + :c:member:`~PyTypeObject.tp_flags`), push ``True`` onto the stack. Otherwise, push + ``False``. + + .. versionadded:: 3.10 + + +.. opcode:: MATCH_SEQUENCE + + If TOS is an instance of :class:`collections.abc.Sequence` and is *not* an instance + of :class:`str`/:class:`bytes`/:class:`bytearray` (or, more technically: if it has + the :const:`Py_TPFLAGS_SEQUENCE` flag set in its :c:member:`~PyTypeObject.tp_flags`), + push ``True`` onto the stack. Otherwise, push ``False``. + + .. versionadded:: 3.10 + + +.. opcode:: MATCH_KEYS + + TOS is a tuple of mapping keys, and TOS1 is the match subject. If TOS1 + contains all of the keys in TOS, push a :class:`tuple` containing the + corresponding values, followed by ``True``. Otherwise, push ``None``, + followed by ``False``. + + .. versionadded:: 3.10 + + All of the following opcodes use their arguments. .. opcode:: STORE_NAME (namei) @@ -1144,11 +1191,13 @@ All of the following opcodes use their arguments. * ``0x01`` a tuple of default values for positional-only and positional-or-keyword parameters in positional order * ``0x02`` a dictionary of keyword-only parameters' default values - * ``0x04`` an annotation dictionary + * ``0x04`` a tuple of strings containing parameters' annotations * ``0x08`` a tuple containing cells for free variables, making a closure * the code associated with the function (at TOS1) * the :term:`qualified name` of the function (at TOS) + .. versionchanged:: 3.10 + Flag value ``0x04`` is a tuple of strings instead of dictionary .. opcode:: BUILD_SLICE (argc) @@ -1189,6 +1238,36 @@ All of the following opcodes use their arguments. .. versionadded:: 3.6 +.. opcode:: MATCH_CLASS (count) + + TOS is a tuple of keyword attribute names, TOS1 is the class being matched + against, and TOS2 is the match subject. *count* is the number of positional + sub-patterns. + + Pop TOS. If TOS2 is an instance of TOS1 and has the positional and keyword + attributes required by *count* and TOS, set TOS to ``True`` and TOS1 to a + tuple of extracted attributes. Otherwise, set TOS to ``False``. + + .. versionadded:: 3.10 + +.. opcode:: GEN_START (kind) + + Pops TOS. If TOS was not ``None``, raises an exception. The ``kind`` + operand corresponds to the type of generator or coroutine and determines + the error message. The legal kinds are 0 for generator, 1 for coroutine, + and 2 for async generator. + + .. versionadded:: 3.10 + + +.. opcode:: ROT_N (count) + + Lift the top *count* stack items one position up, and move TOS down to + position *count*. + + .. versionadded:: 3.10 + + .. opcode:: HAVE_ARGUMENT This is not really an opcode. It identifies the dividing line between diff --git a/Doc/library/distutils.rst b/Doc/library/distutils.rst index 62abc85a..31c4ae5b 100644 --- a/Doc/library/distutils.rst +++ b/Doc/library/distutils.rst @@ -9,6 +9,11 @@ -------------- +:mod:`distutils` is deprecated with removal planned for Python 3.12. +See the :ref:`What's New ` entry for more information. + +-------------- + The :mod:`distutils` package provides support for building and installing additional modules into a Python installation. The new modules may be either 100%-pure Python, or may be extension modules written in C, or may be diff --git a/Doc/library/doctest.rst b/Doc/library/doctest.rst index 3d2bb27e..a77322f8 100644 --- a/Doc/library/doctest.rst +++ b/Doc/library/doctest.rst @@ -568,35 +568,41 @@ doctest decides whether actual output matches an example's expected output: .. data:: IGNORE_EXCEPTION_DETAIL - When specified, doctests expecting exceptions pass so long as an exception - of the expected type is raised, even if the details - (message and fully-qualified exception name) don't match. + When specified, an example that expects an exception passes if an exception of + the expected type is raised, even if the exception detail does not match. For + example, an example expecting ``ValueError: 42`` will pass if the actual + exception raised is ``ValueError: 3*14``, but will fail, e.g., if + :exc:`TypeError` is raised. - For example, an example expecting ``ValueError: 42`` will pass if the actual - exception raised is ``ValueError: 3*14``, but will fail if, say, a - :exc:`TypeError` is raised instead. - It will also ignore any fully-qualified name included before the - exception class, which can vary between implementations and versions - of Python and the code/libraries in use. - Hence, all three of these variations will work with the flag specified: + It will also ignore the module name used in Python 3 doctest reports. Hence + both of these variations will work with the flag specified, regardless of + whether the test is run under Python 2.7 or Python 3.2 (or later versions):: - .. code-block:: pycon - - >>> raise Exception('message') - Traceback (most recent call last): - Exception: message - - >>> raise Exception('message') + >>> raise CustomError('message') Traceback (most recent call last): - builtins.Exception: message + CustomError: message - >>> raise Exception('message') + >>> raise CustomError('message') Traceback (most recent call last): - __main__.Exception: message + my_module.CustomError: message Note that :const:`ELLIPSIS` can also be used to ignore the details of the exception message, but such a test may still fail based - on whether the module name is present or matches exactly. + on whether or not the module details are printed as part of the + exception name. Using :const:`IGNORE_EXCEPTION_DETAIL` and the details + from Python 2.3 is also the only clear way to write a doctest that doesn't + care about the exception detail yet continues to pass under Python 2.3 or + earlier (those releases do not support :ref:`doctest directives + ` and ignore them as irrelevant comments). For example:: + + >>> (1, 2)[3] = 'moo' + Traceback (most recent call last): + File "", line 1, in + TypeError: object doesn't support item assignment + + passes under Python 2.3 and later Python versions with the flag specified, + even though the detail + changed in Python 2.4 to say "does not" instead of "doesn't". .. versionchanged:: 3.2 :const:`IGNORE_EXCEPTION_DETAIL` now also ignores any information relating diff --git a/Doc/library/email.charset.rst b/Doc/library/email.charset.rst index adbe6c1c..38fda23b 100644 --- a/Doc/library/email.charset.rst +++ b/Doc/library/email.charset.rst @@ -58,9 +58,9 @@ Import this class from the :mod:`email.charset` module. .. attribute:: header_encoding If the character set must be encoded before it can be used in an email - header, this attribute will be set to ``charset.QP`` (for - quoted-printable), ``charset.BASE64`` (for base64 encoding), or - ``charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, + header, this attribute will be set to ``Charset.QP`` (for + quoted-printable), ``Charset.BASE64`` (for base64 encoding), or + ``Charset.SHORTEST`` for the shortest of QP or BASE64 encoding. Otherwise, it will be ``None``. @@ -68,7 +68,7 @@ Import this class from the :mod:`email.charset` module. Same as *header_encoding*, but describes the encoding for the mail message's body, which indeed may be different than the header encoding. - ``charset.SHORTEST`` is not allowed for *body_encoding*. + ``Charset.SHORTEST`` is not allowed for *body_encoding*. .. attribute:: output_charset @@ -175,9 +175,9 @@ new entries to the global character set, alias, and codec registries: *charset* is the input character set, and must be the canonical name of a character set. - Optional *header_enc* and *body_enc* is either ``charset.QP`` for - quoted-printable, ``charset.BASE64`` for base64 encoding, - ``charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, + Optional *header_enc* and *body_enc* is either ``Charset.QP`` for + quoted-printable, ``Charset.BASE64`` for base64 encoding, + ``Charset.SHORTEST`` for the shortest of quoted-printable or base64 encoding, or ``None`` for no encoding. ``SHORTEST`` is only valid for *header_enc*. The default is ``None`` for no encoding. diff --git a/Doc/library/email.errors.rst b/Doc/library/email.errors.rst index f4b9f525..7a776405 100644 --- a/Doc/library/email.errors.rst +++ b/Doc/library/email.errors.rst @@ -112,3 +112,6 @@ All defect classes are subclassed from :class:`email.errors.MessageDefect`. * :class:`InvalidBase64LengthDefect` -- When decoding a block of base64 encoded bytes, the number of non-padding base64 characters was invalid (1 more than a multiple of 4). The encoded block was kept as-is. + +* :class:`InvalidDateDefect` -- When decoding an invalid or unparsable date field. + The original value is kept as-is. \ No newline at end of file diff --git a/Doc/library/email.utils.rst b/Doc/library/email.utils.rst index 4d0e920e..0e266b6a 100644 --- a/Doc/library/email.utils.rst +++ b/Doc/library/email.utils.rst @@ -124,8 +124,10 @@ of the new API. .. function:: parsedate_to_datetime(date) The inverse of :func:`format_datetime`. Performs the same function as - :func:`parsedate`, but on success returns a :mod:`~datetime.datetime`. If - the input date has a timezone of ``-0000``, the ``datetime`` will be a naive + :func:`parsedate`, but on success returns a :mod:`~datetime.datetime`; + otherwise ``ValueError`` is raised if *date* contains an invalid value such + as an hour greater than 23 or a timezone offset not between -24 and 24 hours. + If the input date has a timezone of ``-0000``, the ``datetime`` will be a naive ``datetime``, and if the date is conforming to the RFCs it will represent a time in UTC but with no indication of the actual source timezone of the message the date comes from. If the input date has any other valid timezone diff --git a/Doc/library/ensurepip.rst b/Doc/library/ensurepip.rst index a5221250..fa1b42cf 100644 --- a/Doc/library/ensurepip.rst +++ b/Doc/library/ensurepip.rst @@ -48,7 +48,7 @@ The simplest possible invocation is:: This invocation will install ``pip`` if it is not already installed, but otherwise does nothing. To ensure the installed version of ``pip`` -is at least as recent as the one bundled with ``ensurepip``, pass the +is at least as recent as the one available in ``ensurepip``, pass the ``--upgrade`` option:: python -m ensurepip --upgrade @@ -86,7 +86,7 @@ Module API .. function:: version() - Returns a string specifying the bundled version of pip that will be + Returns a string specifying the available version of pip that will be installed when bootstrapping an environment. .. function:: bootstrap(root=None, upgrade=False, user=False, \ @@ -100,7 +100,7 @@ Module API for the current environment. *upgrade* indicates whether or not to upgrade an existing installation - of an earlier version of ``pip`` to the bundled version. + of an earlier version of ``pip`` to the available version. *user* indicates whether to use the user scheme rather than installing globally. diff --git a/Doc/library/enum.rst b/Doc/library/enum.rst index 056b9f7b..e8e49425 100644 --- a/Doc/library/enum.rst +++ b/Doc/library/enum.rst @@ -416,7 +416,7 @@ any members. So this is forbidden:: ... Traceback (most recent call last): ... - TypeError: Cannot extend enumerations + TypeError: MoreColor: cannot extend enumeration 'Color' But this is allowed:: @@ -908,7 +908,7 @@ to handle any extra arguments:: ... BLEACHED_CORAL = () # New color, no Pantone code yet! ... >>> Swatch.SEA_GREEN - + >>> Swatch.SEA_GREEN.pantone '1246' >>> Swatch.BLEACHED_CORAL.pantone @@ -1125,9 +1125,9 @@ and raise an error if the two do not match:: _Private__names """"""""""""""" -:ref:`Private names ` will be normal attributes in Python 3.11 instead of either an error +Private names will be normal attributes in Python 3.10 instead of either an error or a member (depending on if the name ends with an underscore). Using these names -in 3.9 and 3.10 will issue a :exc:`DeprecationWarning`. +in 3.9 will issue a :exc:`DeprecationWarning`. ``Enum`` member type @@ -1150,10 +1150,6 @@ all-uppercase names for members):: >>> FieldTypes.size.value 2 -.. note:: - - This behavior is deprecated and will be removed in 3.11. - .. versionchanged:: 3.5 @@ -1182,7 +1178,7 @@ but not of the class:: >>> dir(Planet) ['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__'] >>> dir(Planet.EARTH) - ['__class__', '__doc__', '__module__', 'name', 'surface_gravity', 'value'] + ['__class__', '__doc__', '__module__', 'mass', 'name', 'radius', 'surface_gravity', 'value'] Combining members of ``Flag`` @@ -1204,8 +1200,3 @@ all named flags and all named combinations of flags that are in the value:: >>> Color(7) # not named combination -.. note:: - - In 3.11 unnamed combinations of flags will only produce the canonical flag - members (aka single-value flags). So ``Color(7)`` would produce something - like ````. diff --git a/Doc/library/errno.rst b/Doc/library/errno.rst index c87da091..1cbd51c5 100644 --- a/Doc/library/errno.rst +++ b/Doc/library/errno.rst @@ -8,7 +8,7 @@ This module makes available standard ``errno`` system symbols. The value of each symbol is the corresponding integer value. The names and descriptions are -borrowed from :file:`linux/include/errno.h`, which should be +borrowed from :file:`linux/include/errno.h`, which should be pretty all-inclusive. @@ -27,26 +27,25 @@ defined by the module. The specific list of defined symbols is available as .. data:: EPERM - Operation not permitted. This error is mapped to the exception - :exc:`PermissionError`. + Operation not permitted .. data:: ENOENT - No such file or directory. This error is mapped to the exception - :exc:`FileNotFoundError`. + No such file or directory .. data:: ESRCH - No such process. This error is mapped to the exception - :exc:`ProcessLookupError`. + No such process .. data:: EINTR - Interrupted system call. This error is mapped to the exception - :exc:`InterruptedError`. + Interrupted system call. + + .. seealso:: + This error is mapped to the exception :exc:`InterruptedError`. .. data:: EIO @@ -76,13 +75,12 @@ defined by the module. The specific list of defined symbols is available as .. data:: ECHILD - No child processes. This error is mapped to the exception - :exc:`ChildProcessError`. + No child processes .. data:: EAGAIN - Try again. This error is mapped to the exception :exc:`BlockingIOError`. + Try again .. data:: ENOMEM @@ -92,8 +90,7 @@ defined by the module. The specific list of defined symbols is available as .. data:: EACCES - Permission denied. This error is mapped to the exception - :exc:`PermissionError`. + Permission denied .. data:: EFAULT @@ -113,8 +110,7 @@ defined by the module. The specific list of defined symbols is available as .. data:: EEXIST - File exists. This error is mapped to the exception - :exc:`FileExistsError`. + File exists .. data:: EXDEV @@ -129,14 +125,12 @@ defined by the module. The specific list of defined symbols is available as .. data:: ENOTDIR - Not a directory. This error is mapped to the exception - :exc:`NotADirectoryError`. + Not a directory .. data:: EISDIR - Is a directory. This error is mapped to the exception - :exc:`IsADirectoryError`. + Is a directory .. data:: EINVAL @@ -191,8 +185,7 @@ defined by the module. The specific list of defined symbols is available as .. data:: EPIPE - Broken pipe. This error is mapped to the exception - :exc:`BrokenPipeError`. + Broken pipe .. data:: EDOM @@ -237,8 +230,7 @@ defined by the module. The specific list of defined symbols is available as .. data:: EWOULDBLOCK - Operation would block. This error is mapped to the exception - :exc:`BlockingIOError`. + Operation would block .. data:: ENOMSG @@ -548,14 +540,12 @@ defined by the module. The specific list of defined symbols is available as .. data:: ECONNABORTED - Software caused connection abort. This error is mapped to the - exception :exc:`ConnectionAbortedError`. + Software caused connection abort .. data:: ECONNRESET - Connection reset by peer. This error is mapped to the exception - :exc:`ConnectionResetError`. + Connection reset by peer .. data:: ENOBUFS @@ -575,8 +565,7 @@ defined by the module. The specific list of defined symbols is available as .. data:: ESHUTDOWN - Cannot send after transport endpoint shutdown. This error is mapped - to the exception :exc:`BrokenPipeError`. + Cannot send after transport endpoint shutdown .. data:: ETOOMANYREFS @@ -586,14 +575,12 @@ defined by the module. The specific list of defined symbols is available as .. data:: ETIMEDOUT - Connection timed out. This error is mapped to the exception - :exc:`TimeoutError`. + Connection timed out .. data:: ECONNREFUSED - Connection refused. This error is mapped to the exception - :exc:`ConnectionRefusedError`. + Connection refused .. data:: EHOSTDOWN @@ -608,14 +595,12 @@ defined by the module. The specific list of defined symbols is available as .. data:: EALREADY - Operation already in progress. This error is mapped to the - exception :exc:`BlockingIOError`. + Operation already in progress .. data:: EINPROGRESS - Operation now in progress. This error is mapped to the exception - :exc:`BlockingIOError`. + Operation now in progress .. data:: ESTALE diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst index b6a5df87..1a883ba1 100644 --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -34,18 +34,15 @@ class or one of its subclasses, and not from :exc:`BaseException`. More information on defining exceptions is available in the Python Tutorial under :ref:`tut-userexceptions`. - -Exception context ------------------ - -When raising a new exception while another exception -is already being handled, the new exception's -:attr:`__context__` attribute is automatically set to the handled -exception. An exception may be handled when an :keyword:`except` or -:keyword:`finally` clause, or a :keyword:`with` statement, is used. - -This implicit exception context can be -supplemented with an explicit cause by using :keyword:`!from` with +When raising (or re-raising) an exception in an :keyword:`except` or +:keyword:`finally` clause +:attr:`__context__` is automatically set to the last exception caught; if the +new exception is not handled the traceback that is eventually displayed will +include the originating exception(s) and the final exception. + +When raising a new exception (rather than using a bare ``raise`` to re-raise +the exception currently being handled), the implicit exception context can be +supplemented with an explicit cause by using :keyword:`from` with :keyword:`raise`:: raise new_exc from original_exc @@ -70,25 +67,6 @@ exceptions so that the final line of the traceback always shows the last exception that was raised. -Inheriting from built-in exceptions ------------------------------------ - -User code can create subclasses that inherit from an exception type. -It's recommended to only subclass one exception type at a time to avoid -any possible conflicts between how the bases handle the ``args`` -attribute, as well as due to possible memory layout incompatibilities. - -.. impl-detail:: - - Most built-in exceptions are implemented in C for efficiency, see: - :source:`Objects/exceptions.c`. Some have custom memory layouts - which makes it impossible to create a subclass that inherits from - multiple exception types. The memory layout of a type is an implementation - detail and might change between Python versions, leading to new - conflicts in the future. Therefore, it's recommended to avoid - subclassing multiple exception types altogether. - - Base classes ------------ @@ -112,8 +90,13 @@ The following exceptions are used mostly as base classes for other exceptions. .. method:: with_traceback(tb) This method sets *tb* as the new traceback for the exception and returns - the exception object. It is usually used in exception handling code like - this:: + the exception object. It was more commonly used before the exception + chaining features of :pep:`3134` became available. The following example + shows how we can convert an instance of ``SomeException`` into an + instance of ``OtherException`` while preserving the traceback. Once + raised, the current frame is pushed onto the traceback of the + ``OtherException``, as would have happened to the traceback of the + original ``SomeException`` had we allowed it to propagate to the caller. :: try: ... @@ -166,6 +149,13 @@ The following exceptions are the exceptions that are usually raised. assignment fails. (When an object does not support attribute references or attribute assignments at all, :exc:`TypeError` is raised.) + The :attr:`name` and :attr:`obj` attributes can be set using keyword-only + arguments to the constructor. When set they represent the name of the attribute + that was attempted to be accessed and the object that was accessed for said + attribute, respectively. + + .. versionchanged:: 3.10 + Added the :attr:`name` and :attr:`obj` attributes. .. exception:: EOFError @@ -234,15 +224,6 @@ The following exceptions are the exceptions that are usually raised. accidentally caught by code that catches :exc:`Exception` and thus prevent the interpreter from exiting. - .. note:: - - Catching a :exc:`KeyboardInterrupt` requires special consideration. - Because it can be raised at unpredictable points, it may, in some - circumstances, leave the running program in an inconsistent state. It is - generally best to allow :exc:`KeyboardInterrupt` to end the program as - quickly as possible or avoid raising it entirely. (See - :ref:`handlers-and-exceptions`.) - .. exception:: MemoryError @@ -261,6 +242,13 @@ The following exceptions are the exceptions that are usually raised. unqualified names. The associated value is an error message that includes the name that could not be found. + The :attr:`name` attribute can be set using a keyword-only argument to the + constructor. When set it represent the name of the variable that was attempted + to be accessed. + + .. versionchanged:: 3.10 + Added the :attr:`name` attribute. + .. exception:: NotImplementedError @@ -344,8 +332,8 @@ The following exceptions are the exceptions that are usually raised. .. versionchanged:: 3.4 The :attr:`filename` attribute is now the original file name passed to the function, instead of the name encoded to or decoded from the - filesystem encoding. Also, the *filename2* constructor argument and - attribute was added. + :term:`filesystem encoding and error handler`. Also, the *filename2* + constructor argument and attribute was added. .. exception:: OverflowError @@ -450,11 +438,23 @@ The following exceptions are the exceptions that are usually raised. The source code text involved in the error. + .. attribute:: end_lineno + + Which line number in the file the error occurred ends in. This is + 1-indexed: the first line in the file has a ``lineno`` of 1. + + .. attribute:: end_offset + + The column in the end line where the error occurred finishes. This is + 1-indexed: the first character in the line has an ``offset`` of 1. + For errors in f-string fields, the message is prefixed by "f-string: " and the offsets are offsets in a text constructed from the replacement expression. For example, compiling f'Bad {a b} field' results in this - args attribute: ('f-string: ...', ('', 1, 4, '(a b)\n')). + args attribute: ('f-string: ...', ('', 1, 2, '(a b)\n', 1, 5)). + .. versionchanged:: 3.10 + Added the :attr:`end_lineno` and :attr:`end_offset` attributes. .. exception:: IndentationError @@ -613,8 +613,8 @@ depending on the system error code. Raised when an operation would block on an object (e.g. socket) set for non-blocking operation. - Corresponds to :c:data:`errno` :py:data:`~errno.EAGAIN`, :py:data:`~errno.EALREADY`, - :py:data:`~errno.EWOULDBLOCK` and :py:data:`~errno.EINPROGRESS`. + Corresponds to :c:data:`errno` ``EAGAIN``, ``EALREADY``, + ``EWOULDBLOCK`` and ``EINPROGRESS``. In addition to those of :exc:`OSError`, :exc:`BlockingIOError` can have one more attribute: @@ -628,7 +628,7 @@ depending on the system error code. .. exception:: ChildProcessError Raised when an operation on a child process failed. - Corresponds to :c:data:`errno` :py:data:`~errno.ECHILD`. + Corresponds to :c:data:`errno` ``ECHILD``. .. exception:: ConnectionError @@ -642,35 +642,35 @@ depending on the system error code. A subclass of :exc:`ConnectionError`, raised when trying to write on a pipe while the other end has been closed, or trying to write on a socket which has been shutdown for writing. - Corresponds to :c:data:`errno` :py:data:`~errno.EPIPE` and :py:data:`~errno.ESHUTDOWN`. + Corresponds to :c:data:`errno` ``EPIPE`` and ``ESHUTDOWN``. .. exception:: ConnectionAbortedError A subclass of :exc:`ConnectionError`, raised when a connection attempt is aborted by the peer. - Corresponds to :c:data:`errno` :py:data:`~errno.ECONNABORTED`. + Corresponds to :c:data:`errno` ``ECONNABORTED``. .. exception:: ConnectionRefusedError A subclass of :exc:`ConnectionError`, raised when a connection attempt is refused by the peer. - Corresponds to :c:data:`errno` :py:data:`~errno.ECONNREFUSED`. + Corresponds to :c:data:`errno` ``ECONNREFUSED``. .. exception:: ConnectionResetError A subclass of :exc:`ConnectionError`, raised when a connection is reset by the peer. - Corresponds to :c:data:`errno` :py:data:`~errno.ECONNRESET`. + Corresponds to :c:data:`errno` ``ECONNRESET``. .. exception:: FileExistsError Raised when trying to create a file or directory which already exists. - Corresponds to :c:data:`errno` :py:data:`~errno.EEXIST`. + Corresponds to :c:data:`errno` ``EEXIST``. .. exception:: FileNotFoundError Raised when a file or directory is requested but doesn't exist. - Corresponds to :c:data:`errno` :py:data:`~errno.ENOENT`. + Corresponds to :c:data:`errno` ``ENOENT``. .. exception:: InterruptedError @@ -686,7 +686,7 @@ depending on the system error code. Raised when a file operation (such as :func:`os.remove`) is requested on a directory. - Corresponds to :c:data:`errno` :py:data:`~errno.EISDIR`. + Corresponds to :c:data:`errno` ``EISDIR``. .. exception:: NotADirectoryError @@ -694,23 +694,23 @@ depending on the system error code. something which is not a directory. On most POSIX platforms, it may also be raised if an operation attempts to open or traverse a non-directory file as if it were a directory. - Corresponds to :c:data:`errno` :py:data:`~errno.ENOTDIR`. + Corresponds to :c:data:`errno` ``ENOTDIR``. .. exception:: PermissionError Raised when trying to run an operation without the adequate access rights - for example filesystem permissions. - Corresponds to :c:data:`errno` :py:data:`~errno.EACCES` and :py:data:`~errno.EPERM`. + Corresponds to :c:data:`errno` ``EACCES`` and ``EPERM``. .. exception:: ProcessLookupError Raised when a given process doesn't exist. - Corresponds to :c:data:`errno` :py:data:`~errno.ESRCH`. + Corresponds to :c:data:`errno` ``ESRCH``. .. exception:: TimeoutError Raised when a system function timed out at the system level. - Corresponds to :c:data:`errno` :py:data:`~errno.ETIMEDOUT`. + Corresponds to :c:data:`errno` ``ETIMEDOUT``. .. versionadded:: 3.3 All the above :exc:`OSError` subclasses were added. @@ -796,6 +796,15 @@ The following exceptions are used as warning categories; see the Base class for warnings related to Unicode. +.. exception:: EncodingWarning + + Base class for warnings related to encodings. + + See :ref:`io-encoding-warning` for details. + + .. versionadded:: 3.10 + + .. exception:: BytesWarning Base class for warnings related to :class:`bytes` and :class:`bytearray`. diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst index 59274c1d..be091237 100644 --- a/Doc/library/faulthandler.rst +++ b/Doc/library/faulthandler.rst @@ -76,6 +76,10 @@ Fault handler state .. versionchanged:: 3.6 On Windows, a handler for Windows exception is also installed. + .. versionchanged:: 3.10 + The dump now mentions if a garbage collector collection is running + if *all_threads* is true. + .. function:: disable() Disable the fault handler: uninstall the signal handlers installed by diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst index f1c071ab..9d802115 100644 --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -37,8 +37,12 @@ descriptor. On macOS, the fcntl module exposes the ``F_GETPATH`` constant, which obtains the path of a file from a file descriptor. On Linux(>=3.15), the fcntl module exposes the ``F_OFD_GETLK``, ``F_OFD_SETLK`` - and ``F_OFD_SETLKW`` constants, which are used when working with open file - description locks. + and ``F_OFD_SETLKW`` constants, which working with open file description locks. + +.. versionchanged:: 3.10 + On Linux >= 2.6.11, the fcntl module exposes the ``F_GETPIPE_SZ`` and + ``F_SETPIPE_SZ`` constants, which allow to check and modify a pipe's size + respectively. The module defines the following functions: diff --git a/Doc/library/filecmp.rst b/Doc/library/filecmp.rst index 1d04c3ef..83e9e14d 100644 --- a/Doc/library/filecmp.rst +++ b/Doc/library/filecmp.rst @@ -176,7 +176,13 @@ The :class:`dircmp` class .. attribute:: subdirs A dictionary mapping names in :attr:`common_dirs` to :class:`dircmp` - objects. + instances (or MyDirCmp instances if this instance is of type MyDirCmp, a + subclass of :class:`dircmp`). + + .. versionchanged:: 3.10 + Previously entries were always :class:`dircmp` instances. Now entries + are the same type as *self*, if *self* is a subclass of + :class:`dircmp`. .. attribute:: DEFAULT_IGNORES diff --git a/Doc/library/fileformats.rst b/Doc/library/fileformats.rst index 7b33b336..e9c2e1fb 100644 --- a/Doc/library/fileformats.rst +++ b/Doc/library/fileformats.rst @@ -13,4 +13,5 @@ that aren't markup languages and are not related to e-mail. csv.rst configparser.rst netrc.rst + xdrlib.rst plistlib.rst diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst index cc4039a3..b8403932 100644 --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -18,7 +18,7 @@ write one file see :func:`open`. The typical use is:: import fileinput - for line in fileinput.input(): + for line in fileinput.input(encoding="utf-8"): process(line) This iterates over the lines of all files listed in ``sys.argv[1:]``, defaulting @@ -49,13 +49,14 @@ a file may not have one. You can control how files are opened by providing an opening hook via the *openhook* parameter to :func:`fileinput.input` or :class:`FileInput()`. The hook must be a function that takes two arguments, *filename* and *mode*, and -returns an accordingly opened file-like object. Two useful hooks are already -provided by this module. +returns an accordingly opened file-like object. If *encoding* and/or *errors* +are specified, they will be passed to the hook as aditional keyword arguments. +This module provides a :func:`hook_compressed` to support compressed files. The following function is the primary interface of this module: -.. function:: input(files=None, inplace=False, backup='', *, mode='r', openhook=None) +.. function:: input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None) Create an instance of the :class:`FileInput` class. The instance will be used as global state for the functions of this module, and is also returned to use @@ -66,7 +67,7 @@ The following function is the primary interface of this module: :keyword:`with` statement. In this example, *input* is closed after the :keyword:`!with` statement is exited, even if an exception occurs:: - with fileinput.input(files=('spam.txt', 'eggs.txt')) as f: + with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f: for line in f: process(line) @@ -76,6 +77,9 @@ The following function is the primary interface of this module: .. versionchanged:: 3.8 The keyword parameters *mode* and *openhook* are now keyword-only. + .. versionchanged:: 3.10 + The keyword-only parameter *encoding* and *errors* are added. + The following functions use the global state created by :func:`fileinput.input`; if there is no active state, :exc:`RuntimeError` is raised. @@ -137,7 +141,7 @@ The class which implements the sequence behavior provided by the module is available for subclassing as well: -.. class:: FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None) +.. class:: FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None) Class :class:`FileInput` is the implementation; its methods :meth:`filename`, :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`, @@ -155,6 +159,8 @@ available for subclassing as well: *filename* and *mode*, and returns an accordingly opened file-like object. You cannot use *inplace* and *openhook* together. + You can specify *encoding* and *errors* that is passed to :func:`open` or *openhook*. + A :class:`FileInput` instance can be used as a context manager in the :keyword:`with` statement. In this example, *input* is closed after the :keyword:`!with` statement is exited, even if an exception occurs:: @@ -162,7 +168,6 @@ available for subclassing as well: with FileInput(files=('spam.txt', 'eggs.txt')) as input: process(input) - .. versionchanged:: 3.2 Can be used as a context manager. @@ -175,6 +180,8 @@ available for subclassing as well: .. versionchanged:: 3.8 The keyword parameter *mode* and *openhook* are now keyword-only. + .. versionchanged:: 3.10 + The keyword-only parameter *encoding* and *errors* are added. **Optional in-place filtering:** if the keyword argument ``inplace=True`` is @@ -191,14 +198,20 @@ when standard input is read. The two following opening hooks are provided by this module: -.. function:: hook_compressed(filename, mode) +.. function:: hook_compressed(filename, mode, *, encoding=None, errors=None) Transparently opens files compressed with gzip and bzip2 (recognized by the extensions ``'.gz'`` and ``'.bz2'``) using the :mod:`gzip` and :mod:`bz2` modules. If the filename extension is not ``'.gz'`` or ``'.bz2'``, the file is opened normally (ie, using :func:`open` without any decompression). - Usage example: ``fi = fileinput.FileInput(openhook=fileinput.hook_compressed)`` + The *encoding* and *errors* values are passed to :class:`io.TextIOWrapper` + for compressed files and open for normal files. + + Usage example: ``fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")`` + + .. versionchanged:: 3.10 + The keyword-only parameter *encoding* and *errors* are added. .. function:: hook_encoded(encoding, errors=None) @@ -212,3 +225,7 @@ The two following opening hooks are provided by this module: .. versionchanged:: 3.6 Added the optional *errors* parameter. + + .. deprecated:: 3.10 + This function is deprecated since :func:`input` and :class:`FileInput` + now have *encoding* and *errors* parameters. diff --git a/Doc/library/formatter.rst b/Doc/library/formatter.rst deleted file mode 100644 index 6c10ac6f..00000000 --- a/Doc/library/formatter.rst +++ /dev/null @@ -1,351 +0,0 @@ -:mod:`formatter` --- Generic output formatting -============================================== - -.. module:: formatter - :synopsis: Generic output formatter and device interface. - :deprecated: - -.. deprecated:: 3.4 - Due to lack of usage, the formatter module has been deprecated. - --------------- - -This module supports two interface definitions, each with multiple -implementations: The *formatter* interface, and the *writer* interface which is -required by the formatter interface. - -Formatter objects transform an abstract flow of formatting events into specific -output events on writer objects. Formatters manage several stack structures to -allow various properties of a writer object to be changed and restored; writers -need not be able to handle relative changes nor any sort of "change back" -operation. Specific writer properties which may be controlled via formatter -objects are horizontal alignment, font, and left margin indentations. A -mechanism is provided which supports providing arbitrary, non-exclusive style -settings to a writer as well. Additional interfaces facilitate formatting -events which are not reversible, such as paragraph separation. - -Writer objects encapsulate device interfaces. Abstract devices, such as file -formats, are supported as well as physical devices. The provided -implementations all work with abstract devices. The interface makes available -mechanisms for setting the properties which formatter objects manage and -inserting data into the output. - - -.. _formatter-interface: - -The Formatter Interface ------------------------ - -Interfaces to create formatters are dependent on the specific formatter class -being instantiated. The interfaces described below are the required interfaces -which all formatters must support once initialized. - -One data element is defined at the module level: - - -.. data:: AS_IS - - Value which can be used in the font specification passed to the ``push_font()`` - method described below, or as the new value to any other ``push_property()`` - method. Pushing the ``AS_IS`` value allows the corresponding ``pop_property()`` - method to be called without having to track whether the property was changed. - -The following attributes are defined for formatter instance objects: - - -.. attribute:: formatter.writer - - The writer instance with which the formatter interacts. - - -.. method:: formatter.end_paragraph(blanklines) - - Close any open paragraphs and insert at least *blanklines* before the next - paragraph. - - -.. method:: formatter.add_line_break() - - Add a hard line break if one does not already exist. This does not break the - logical paragraph. - - -.. method:: formatter.add_hor_rule(*args, **kw) - - Insert a horizontal rule in the output. A hard break is inserted if there is - data in the current paragraph, but the logical paragraph is not broken. The - arguments and keywords are passed on to the writer's :meth:`send_line_break` - method. - - -.. method:: formatter.add_flowing_data(data) - - Provide data which should be formatted with collapsed whitespace. Whitespace - from preceding and successive calls to :meth:`add_flowing_data` is considered as - well when the whitespace collapse is performed. The data which is passed to - this method is expected to be word-wrapped by the output device. Note that any - word-wrapping still must be performed by the writer object due to the need to - rely on device and font information. - - -.. method:: formatter.add_literal_data(data) - - Provide data which should be passed to the writer unchanged. Whitespace, - including newline and tab characters, are considered legal in the value of - *data*. - - -.. method:: formatter.add_label_data(format, counter) - - Insert a label which should be placed to the left of the current left margin. - This should be used for constructing bulleted or numbered lists. If the - *format* value is a string, it is interpreted as a format specification for - *counter*, which should be an integer. The result of this formatting becomes the - value of the label; if *format* is not a string it is used as the label value - directly. The label value is passed as the only argument to the writer's - :meth:`send_label_data` method. Interpretation of non-string label values is - dependent on the associated writer. - - Format specifications are strings which, in combination with a counter value, - are used to compute label values. Each character in the format string is copied - to the label value, with some characters recognized to indicate a transform on - the counter value. Specifically, the character ``'1'`` represents the counter - value formatter as an Arabic number, the characters ``'A'`` and ``'a'`` - represent alphabetic representations of the counter value in upper and lower - case, respectively, and ``'I'`` and ``'i'`` represent the counter value in Roman - numerals, in upper and lower case. Note that the alphabetic and roman - transforms require that the counter value be greater than zero. - - -.. method:: formatter.flush_softspace() - - Send any pending whitespace buffered from a previous call to - :meth:`add_flowing_data` to the associated writer object. This should be called - before any direct manipulation of the writer object. - - -.. method:: formatter.push_alignment(align) - - Push a new alignment setting onto the alignment stack. This may be - :const:`AS_IS` if no change is desired. If the alignment value is changed from - the previous setting, the writer's :meth:`new_alignment` method is called with - the *align* value. - - -.. method:: formatter.pop_alignment() - - Restore the previous alignment. - - -.. method:: formatter.push_font((size, italic, bold, teletype)) - - Change some or all font properties of the writer object. Properties which are - not set to :const:`AS_IS` are set to the values passed in while others are - maintained at their current settings. The writer's :meth:`new_font` method is - called with the fully resolved font specification. - - -.. method:: formatter.pop_font() - - Restore the previous font. - - -.. method:: formatter.push_margin(margin) - - Increase the number of left margin indentations by one, associating the logical - tag *margin* with the new indentation. The initial margin level is ``0``. - Changed values of the logical tag must be true values; false values other than - :const:`AS_IS` are not sufficient to change the margin. - - -.. method:: formatter.pop_margin() - - Restore the previous margin. - - -.. method:: formatter.push_style(*styles) - - Push any number of arbitrary style specifications. All styles are pushed onto - the styles stack in order. A tuple representing the entire stack, including - :const:`AS_IS` values, is passed to the writer's :meth:`new_styles` method. - - -.. method:: formatter.pop_style(n=1) - - Pop the last *n* style specifications passed to :meth:`push_style`. A tuple - representing the revised stack, including :const:`AS_IS` values, is passed to - the writer's :meth:`new_styles` method. - - -.. method:: formatter.set_spacing(spacing) - - Set the spacing style for the writer. - - -.. method:: formatter.assert_line_data(flag=1) - - Inform the formatter that data has been added to the current paragraph - out-of-band. This should be used when the writer has been manipulated - directly. The optional *flag* argument can be set to false if the writer - manipulations produced a hard line break at the end of the output. - - -.. _formatter-impls: - -Formatter Implementations -------------------------- - -Two implementations of formatter objects are provided by this module. Most -applications may use one of these classes without modification or subclassing. - - -.. class:: NullFormatter(writer=None) - - A formatter which does nothing. If *writer* is omitted, a :class:`NullWriter` - instance is created. No methods of the writer are called by - :class:`NullFormatter` instances. Implementations should inherit from this - class if implementing a writer interface but don't need to inherit any - implementation. - - -.. class:: AbstractFormatter(writer) - - The standard formatter. This implementation has demonstrated wide applicability - to many writers, and may be used directly in most circumstances. It has been - used to implement a full-featured World Wide Web browser. - - -.. _writer-interface: - -The Writer Interface --------------------- - -Interfaces to create writers are dependent on the specific writer class being -instantiated. The interfaces described below are the required interfaces which -all writers must support once initialized. Note that while most applications can -use the :class:`AbstractFormatter` class as a formatter, the writer must -typically be provided by the application. - - -.. method:: writer.flush() - - Flush any buffered output or device control events. - - -.. method:: writer.new_alignment(align) - - Set the alignment style. The *align* value can be any object, but by convention - is a string or ``None``, where ``None`` indicates that the writer's "preferred" - alignment should be used. Conventional *align* values are ``'left'``, - ``'center'``, ``'right'``, and ``'justify'``. - - -.. method:: writer.new_font(font) - - Set the font style. The value of *font* will be ``None``, indicating that the - device's default font should be used, or a tuple of the form ``(size, - italic, bold, teletype)``. Size will be a string indicating the size of - font that should be used; specific strings and their interpretation must be - defined by the application. The *italic*, *bold*, and *teletype* values are - Boolean values specifying which of those font attributes should be used. - - -.. method:: writer.new_margin(margin, level) - - Set the margin level to the integer *level* and the logical tag to *margin*. - Interpretation of the logical tag is at the writer's discretion; the only - restriction on the value of the logical tag is that it not be a false value for - non-zero values of *level*. - - -.. method:: writer.new_spacing(spacing) - - Set the spacing style to *spacing*. - - -.. method:: writer.new_styles(styles) - - Set additional styles. The *styles* value is a tuple of arbitrary values; the - value :const:`AS_IS` should be ignored. The *styles* tuple may be interpreted - either as a set or as a stack depending on the requirements of the application - and writer implementation. - - -.. method:: writer.send_line_break() - - Break the current line. - - -.. method:: writer.send_paragraph(blankline) - - Produce a paragraph separation of at least *blankline* blank lines, or the - equivalent. The *blankline* value will be an integer. Note that the - implementation will receive a call to :meth:`send_line_break` before this call - if a line break is needed; this method should not include ending the last line - of the paragraph. It is only responsible for vertical spacing between - paragraphs. - - -.. method:: writer.send_hor_rule(*args, **kw) - - Display a horizontal rule on the output device. The arguments to this method - are entirely application- and writer-specific, and should be interpreted with - care. The method implementation may assume that a line break has already been - issued via :meth:`send_line_break`. - - -.. method:: writer.send_flowing_data(data) - - Output character data which may be word-wrapped and re-flowed as needed. Within - any sequence of calls to this method, the writer may assume that spans of - multiple whitespace characters have been collapsed to single space characters. - - -.. method:: writer.send_literal_data(data) - - Output character data which has already been formatted for display. Generally, - this should be interpreted to mean that line breaks indicated by newline - characters should be preserved and no new line breaks should be introduced. The - data may contain embedded newline and tab characters, unlike data provided to - the :meth:`send_formatted_data` interface. - - -.. method:: writer.send_label_data(data) - - Set *data* to the left of the current left margin, if possible. The value of - *data* is not restricted; treatment of non-string values is entirely - application- and writer-dependent. This method will only be called at the - beginning of a line. - - -.. _writer-impls: - -Writer Implementations ----------------------- - -Three implementations of the writer object interface are provided as examples by -this module. Most applications will need to derive new writer classes from the -:class:`NullWriter` class. - - -.. class:: NullWriter() - - A writer which only provides the interface definition; no actions are taken on - any methods. This should be the base class for all writers which do not need to - inherit any implementation methods. - - -.. class:: AbstractWriter() - - A writer which can be used in debugging formatters, but not much else. Each - method simply announces itself by printing its name and arguments on standard - output. - - -.. class:: DumbWriter(file=None, maxcol=72) - - Simple writer class which writes output on the :term:`file object` passed - in as *file* or, if *file* is omitted, on standard output. The output is - simply word-wrapped to the number of columns specified by *maxcol*. This - class is suitable for reflowing a sequence of paragraphs. - diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 3a9165ac..2f94ac49 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -17,7 +17,7 @@ This module defines the class :class:`FTP` and a few related items. The this to write Python programs that perform a variety of automated FTP jobs, such as mirroring other FTP servers. It is also used by the module :mod:`urllib.request` to handle URLs that use FTP. For more information on FTP -(File Transfer Protocol), see Internet :rfc:`959`. +(File Transfer Protocol), see internet :rfc:`959`. The default encoding is UTF-8, following :rfc:`2640`. diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index 80b56fd7..f4c3ef46 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -7,24 +7,38 @@ Built-in Functions The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order. -=================== ================= ================== ================== ==================== -.. .. Built-in Functions .. .. -=================== ================= ================== ================== ==================== -:func:`abs` :func:`delattr` :func:`hash` |func-memoryview|_ |func-set|_ -:func:`all` |func-dict|_ :func:`help` :func:`min` :func:`setattr` -:func:`any` :func:`dir` :func:`hex` :func:`next` :func:`slice` -:func:`ascii` :func:`divmod` :func:`id` :func:`object` :func:`sorted` -:func:`bin` :func:`enumerate` :func:`input` :func:`oct` :func:`staticmethod` -:func:`bool` :func:`eval` :func:`int` :func:`open` |func-str|_ -:func:`breakpoint` :func:`exec` :func:`isinstance` :func:`ord` :func:`sum` -|func-bytearray|_ :func:`filter` :func:`issubclass` :func:`pow` :func:`super` -|func-bytes|_ :func:`float` :func:`iter` :func:`print` |func-tuple|_ -:func:`callable` :func:`format` :func:`len` :func:`property` :func:`type` -:func:`chr` |func-frozenset|_ |func-list|_ |func-range|_ :func:`vars` -:func:`classmethod` :func:`getattr` :func:`locals` :func:`repr` :func:`zip` -:func:`compile` :func:`globals` :func:`map` :func:`reversed` :func:`__import__` -:func:`complex` :func:`hasattr` :func:`max` :func:`round` -=================== ================= ================== ================== ==================== ++---------------------------------------------------------------------------------------------------+ +| Built-in Functions | ++=========================+=======================+=======================+=========================+ +| | **A** | | **E** | | **L** | | **R** | +| | :func:`abs` | | :func:`enumerate` | | :func:`len` | | |func-range|_ | +| | :func:`aiter` | | :func:`eval` | | |func-list|_ | | :func:`repr` | +| | :func:`all` | | :func:`exec` | | :func:`locals` | | :func:`reversed` | +| | :func:`any` | | | | | | :func:`round` | +| | :func:`anext` | | **F** | | **M** | | | +| | :func:`ascii` | | :func:`filter` | | :func:`map` | | **S** | +| | | | :func:`float` | | :func:`max` | | |func-set|_ | +| | **B** | | :func:`format` | | |func-memoryview|_ | | :func:`setattr` | +| | :func:`bin` | | |func-frozenset|_ | | :func:`min` | | :func:`slice` | +| | :func:`bool` | | | | | | :func:`sorted` | +| | :func:`breakpoint` | | **G** | | **N** | | :func:`staticmethod` | +| | |func-bytearray|_ | | :func:`getattr` | | :func:`next` | | |func-str|_ | +| | |func-bytes|_ | | :func:`globals` | | | | :func:`sum` | +| | | | | | **O** | | :func:`super` | +| | **C** | | **H** | | :func:`object` | | | +| | :func:`callable` | | :func:`hasattr` | | :func:`oct` | | **T** | +| | :func:`chr` | | :func:`hash` | | :func:`open` | | |func-tuple|_ | +| | :func:`classmethod` | | :func:`help` | | :func:`ord` | | :func:`type` | +| | :func:`compile` | | :func:`hex` | | | | | +| | :func:`complex` | | | | **P** | | **V** | +| | | | **I** | | :func:`pow` | | :func:`vars` | +| | **D** | | :func:`id` | | :func:`print` | | | +| | :func:`delattr` | | :func:`input` | | :func:`property` | | **Z** | +| | |func-dict|_ | | :func:`int` | | | | :func:`zip` | +| | :func:`dir` | | :func:`isinstance` | | | | | +| | :func:`divmod` | | :func:`issubclass` | | | | **_** | +| | | | :func:`iter` | | | | :func:`__import__` | ++-------------------------+-----------------------+-----------------------+-------------------------+ .. using :func:`dict` would create a link to another page, so local targets are used, with replacement texts to make the output in the table consistent @@ -47,6 +61,18 @@ are always available. They are listed here in alphabetical order. If the argument is a complex number, its magnitude is returned. +.. function:: aiter(async_iterable) + + Return an :term:`asynchronous iterator` for an :term:`asynchronous iterable`. + Equivalent to calling ``x.__aiter__()``. + + ``aiter(x)`` itself has an ``__aiter__()`` method that returns ``x``, + so ``aiter(aiter(x))`` is the same as ``aiter(x)``. + + Note: Unlike :func:`iter`, :func:`aiter` has no 2-argument variant. + + .. versionadded:: 3.10 + .. function:: all(iterable) Return ``True`` if all elements of the *iterable* are true (or if the iterable @@ -59,6 +85,21 @@ are always available. They are listed here in alphabetical order. return True +.. awaitablefunction:: anext(async_iterator[, default]) + + When awaited, return the next item from the given :term:`asynchronous + iterator`, or *default* if given and the iterator is exhausted. + + This is the async variant of the :func:`next` builtin, and behaves + similarly. + + This calls the :meth:`~object.__anext__` method of *async_iterator*, + returning an :term:`awaitable`. Awaiting this returns the next value of the + iterator. If *default* is given, it is returned if the iterator is exhausted, + otherwise :exc:`StopAsyncIteration` is raised. + + .. versionadded:: 3.10 + .. function:: any(iterable) Return ``True`` if any element of the *iterable* is true. If the iterable @@ -75,7 +116,7 @@ are always available. They are listed here in alphabetical order. As :func:`repr`, return a string containing a printable representation of an object, but escape the non-ASCII characters in the string returned by - :func:`repr` using ``\x``, ``\u`` or ``\U`` escapes. This generates a string + :func:`repr` using ``\x``, ``\u``, or ``\U`` escapes. This generates a string similar to that returned by :func:`repr` in Python 2. @@ -91,7 +132,7 @@ are always available. They are listed here in alphabetical order. >>> bin(-10) '-0b1010' - If prefix "0b" is desired or not, you can use either of the following ways. + If the prefix "0b" is desired or not, you can use either of the following ways. >>> format(14, '#b'), format(14, 'b') ('0b1110', '1110') @@ -105,7 +146,7 @@ are always available. They are listed here in alphabetical order. Return a Boolean value, i.e. one of ``True`` or ``False``. *x* is converted using the standard :ref:`truth testing procedure `. If *x* is false - or omitted, this returns ``False``; otherwise it returns ``True``. The + or omitted, this returns ``False``; otherwise, it returns ``True``. The :class:`bool` class is a subclass of :class:`int` (see :ref:`typesnumeric`). It cannot be subclassed further. Its only instances are ``False`` and ``True`` (see :ref:`bltin-boolean-values`). @@ -165,7 +206,7 @@ are always available. They are listed here in alphabetical order. .. class:: bytes([source[, encoding[, errors]]]) :noindex: - Return a new "bytes" object, which is an immutable sequence of integers in + Return a new "bytes" object which is an immutable sequence of integers in the range ``0 <= x < 256``. :class:`bytes` is an immutable version of :class:`bytearray` -- it has the same non-mutating methods and the same indexing and slicing behavior. @@ -204,13 +245,13 @@ are always available. They are listed here in alphabetical order. Transform a method into a class method. - A class method receives the class as implicit first argument, just like an + A class method receives the class as an implicit first argument, just like an instance method receives the instance. To declare a class method, use this idiom:: class C: @classmethod - def f(cls, arg1, arg2): ... + def f(cls, arg1, arg2, ...): ... The ``@classmethod`` form is a function :term:`decorator` -- see :ref:`function` for details. @@ -228,6 +269,11 @@ are always available. They are listed here in alphabetical order. Class methods can now wrap other :term:`descriptors ` such as :func:`property`. + .. versionchanged:: 3.10 + Class methods now inherit the method attributes (``__module__``, + ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``) and + have a new ``__wrapped__`` attribute. + .. function:: compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) Compile the *source* into a code or AST object. Code objects can be executed @@ -296,7 +342,7 @@ are always available. They are listed here in alphabetical order. object due to stack depth limitations in Python's AST compiler. .. versionchanged:: 3.2 - Allowed use of Windows and Mac newlines. Also input in ``'exec'`` mode + Allowed use of Windows and Mac newlines. Also, input in ``'exec'`` mode does not have to end in a newline anymore. Added the *optimize* parameter. .. versionchanged:: 3.5 @@ -374,7 +420,7 @@ are always available. They are listed here in alphabetical order. If the object does not provide :meth:`__dir__`, the function tries its best to gather information from the object's :attr:`~object.__dict__` attribute, if defined, and - from its type object. The resulting list is not necessarily complete, and may + from its type object. The resulting list is not necessarily complete and may be inaccurate when the object has a custom :func:`__getattr__`. The default :func:`dir` mechanism behaves differently with different types of @@ -420,7 +466,7 @@ are always available. They are listed here in alphabetical order. .. function:: divmod(a, b) - Take two (non complex) numbers as arguments and return a pair of numbers + Take two (non-complex) numbers as arguments and return a pair of numbers consisting of their quotient and remainder when using integer division. With mixed operand types, the rules for binary arithmetic operators apply. For integers, the result is the same as ``(a // b, a % b)``. For floating point @@ -464,14 +510,15 @@ are always available. They are listed here in alphabetical order. dictionaries as global and local namespace. If the *globals* dictionary is present and does not contain a value for the key ``__builtins__``, a reference to the dictionary of the built-in module :mod:`builtins` is - inserted under that key before *expression* is parsed. This means that - *expression* normally has full access to the standard :mod:`builtins` - module and restricted environments are propagated. If the *locals* - dictionary is omitted it defaults to the *globals* dictionary. If both - dictionaries are omitted, the expression is executed with the *globals* and - *locals* in the environment where :func:`eval` is called. Note, *eval()* - does not have access to the :term:`nested scopes ` (non-locals) in the - enclosing environment. + inserted under that key before *expression* is parsed. That way you can + control what builtins are available to the executed code by inserting your + own ``__builtins__`` dictionary into *globals* before passing it to + :func:`eval`. If the *locals* dictionary is omitted it defaults to the + *globals* dictionary. If both dictionaries are omitted, the expression is + executed with the *globals* and *locals* in the environment where + :func:`eval` is called. Note, *eval()* does not have access to the + :term:`nested scopes ` (non-locals) in the enclosing + environment. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example: @@ -481,15 +528,18 @@ are always available. They are listed here in alphabetical order. 2 This function can also be used to execute arbitrary code objects (such as - those created by :func:`compile`). In this case pass a code object instead + those created by :func:`compile`). In this case, pass a code object instead of a string. If the code object has been compiled with ``'exec'`` as the *mode* argument, :func:`eval`\'s return value will be ``None``. Hints: dynamic execution of statements is supported by the :func:`exec` function. The :func:`globals` and :func:`locals` functions - returns the current global and local dictionary, respectively, which may be + return the current global and local dictionary, respectively, which may be useful to pass around for use by :func:`eval` or :func:`exec`. + If the given source is a string, then leading and trailing spaces and tabs + are stripped. + See :func:`ast.literal_eval` for a function that can safely evaluate strings with expressions containing only literals. @@ -507,7 +557,7 @@ are always available. They are listed here in alphabetical order. a suite of Python statements which is then executed (unless a syntax error occurs). [#]_ If it is a code object, it is simply executed. In all cases, the code that's executed is expected to be valid as file input (see the - section :ref:`file-input` in the Reference Manual). Be aware that the + section "File input" in the Reference Manual). Be aware that the :keyword:`nonlocal`, :keyword:`yield`, and :keyword:`return` statements may not be used outside of function definitions even within the context of code passed to the @@ -519,7 +569,7 @@ are always available. They are listed here in alphabetical order. will be used for both the global and the local variables. If *globals* and *locals* are given, they are used for the global and local variables, respectively. If provided, *locals* can be any mapping object. Remember - that at module level, globals and locals are the same dictionary. If exec + that at the module level, globals and locals are the same dictionary. If exec gets two separate objects as *globals* and *locals*, the code will be executed as if it were embedded in a class definition. @@ -577,7 +627,7 @@ are always available. They are listed here in alphabetical order. preceded by a sign, and optionally embedded in whitespace. The optional sign may be ``'+'`` or ``'-'``; a ``'+'`` sign has no effect on the value produced. The argument may also be a string representing a NaN - (not-a-number), or a positive or negative infinity. More precisely, the + (not-a-number), or positive or negative infinity. More precisely, the input must conform to the following grammar after leading and trailing whitespace characters are removed: @@ -590,7 +640,7 @@ are always available. They are listed here in alphabetical order. Here ``floatnumber`` is the form of a Python floating-point literal, described in :ref:`floating`. Case is not significant, so, for example, - "inf", "Inf", "INFINITY" and "iNfINity" are all acceptable spellings for + "inf", "Inf", "INFINITY", and "iNfINity" are all acceptable spellings for positive infinity. Otherwise, if the argument is an integer or a floating point number, a @@ -637,7 +687,7 @@ are always available. They are listed here in alphabetical order. Convert a *value* to a "formatted" representation, as controlled by *format_spec*. The interpretation of *format_spec* will depend on the type - of the *value* argument, however there is a standard formatting syntax that + of the *value* argument; however, there is a standard formatting syntax that is used by most built-in types: :ref:`formatspec`. The default *format_spec* is an empty string which usually gives the same @@ -686,9 +736,9 @@ are always available. They are listed here in alphabetical order. .. function:: globals() - Return the dictionary implementing the current module namespace. For code within - functions, this is set when the function is defined and remains the same - regardless of where the function is called. + Return a dictionary representing the current global symbol table. This is always + the dictionary of the current module (inside a function or method, this is the + module where it is defined, not the module from which it is called). .. function:: hasattr(object, name) @@ -721,7 +771,7 @@ are always available. They are listed here in alphabetical order. topic, and a help page is printed on the console. If the argument is any other kind of object, a help page on the object is generated. - Note that if a slash(/) appears in the parameter list of a function, when + Note that if a slash(/) appears in the parameter list of a function when invoking :func:`help`, it means that the parameters prior to the slash are positional-only. For more info, see :ref:`the FAQ entry on positional-only parameters `. @@ -844,35 +894,34 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.8 Falls back to :meth:`__index__` if :meth:`__int__` is not defined. - .. versionchanged:: 3.9.14 - :class:`int` string inputs and string representations can be limited to - help avoid denial of service attacks. A :exc:`ValueError` is raised when - the limit is exceeded while converting a string *x* to an :class:`int` or - when converting an :class:`int` into a string would exceed the limit. - See the :ref:`integer string conversion length limitation - ` documentation. - .. function:: isinstance(object, classinfo) Return ``True`` if the *object* argument is an instance of the *classinfo* - argument, or of a (direct, indirect or :term:`virtual `) subclass thereof. If *object* is not an object of the given type, the function always returns ``False``. If *classinfo* is a tuple of type objects (or recursively, other such - tuples), return ``True`` if *object* is an instance of any of the types. + tuples) or a :ref:`types-union` of multiple types, return ``True`` if + *object* is an instance of any of the types. If *classinfo* is not a type or tuple of types and such tuples, a :exc:`TypeError` exception is raised. + .. versionchanged:: 3.10 + *classinfo* can be a :ref:`types-union`. + .. function:: issubclass(class, classinfo) - Return ``True`` if *class* is a subclass (direct, indirect or :term:`virtual + Return ``True`` if *class* is a subclass (direct, indirect, or :term:`virtual `) of *classinfo*. A class is considered a subclass of itself. *classinfo* may be a tuple of class - objects (or recursively, other such tuples), - in which case return ``True`` if *class* is a subclass of any entry - in *classinfo*. In any other case, a :exc:`TypeError` exception is raised. + objects or a :ref:`types-union`, in which case return ``True`` if *class* is a + subclass of any entry in *classinfo*. In any other case, a :exc:`TypeError` + exception is raised. + + .. versionchanged:: 3.10 + *classinfo* can be a :ref:`types-union`. .. function:: iter(object[, sentinel]) @@ -1019,7 +1068,7 @@ are always available. They are listed here in alphabetical order. .. class:: object() Return a new featureless object. :class:`object` is a base for all classes. - It has the methods that are common to all instances of Python classes. This + It has methods that are common to all instances of Python classes. This function does not accept any arguments. .. note:: @@ -1040,7 +1089,7 @@ are always available. They are listed here in alphabetical order. >>> oct(-56) '-0o70' - If you want to convert an integer number to octal string either with prefix + If you want to convert an integer number to an octal string either with the prefix "0o" or not, you can use either of the following ways. >>> '%#o' % 10, '%o' % 10 @@ -1064,16 +1113,16 @@ are always available. They are listed here in alphabetical order. *file* is a :term:`path-like object` giving the pathname (absolute or relative to the current working directory) of the file to be opened or an integer file descriptor of the file to be wrapped. (If a file descriptor is - given, it is closed when the returned I/O object is closed, unless *closefd* + given, it is closed when the returned I/O object is closed unless *closefd* is set to ``False``.) *mode* is an optional string that specifies the mode in which the file is opened. It defaults to ``'r'`` which means open for reading in text mode. Other common values are ``'w'`` for writing (truncating the file if it - already exists), ``'x'`` for exclusive creation and ``'a'`` for appending + already exists), ``'x'`` for exclusive creation, and ``'a'`` for appending (which on *some* Unix systems, means that *all* writes append to the end of the file regardless of the current seek position). In text mode, if - *encoding* is not specified the encoding used is platform dependent: + *encoding* is not specified the encoding used is platform-dependent: ``locale.getpreferredencoding(False)`` is called to get the current locale encoding. (For reading and writing raw bytes use binary mode and leave *encoding* unspecified.) The available modes are: @@ -1089,13 +1138,13 @@ are always available. They are listed here in alphabetical order. ``'r'`` open for reading (default) ``'w'`` open for writing, truncating the file first ``'x'`` open for exclusive creation, failing if the file already exists - ``'a'`` open for writing, appending to the end of the file if it exists + ``'a'`` open for writing, appending to the end of file if it exists ``'b'`` binary mode ``'t'`` text mode (default) ``'+'`` open for updating (reading and writing) ========= =============================================================== - The default mode is ``'r'`` (open for reading text, synonym of ``'rt'``). + The default mode is ``'r'`` (open for reading text, a synonym of ``'rt'``). Modes ``'w+'`` and ``'w+b'`` open and truncate the file. Modes ``'r+'`` and ``'r+b'`` open the file with no truncation. @@ -1109,7 +1158,7 @@ are always available. They are listed here in alphabetical order. There is an additional mode character permitted, ``'U'``, which no longer has any effect, and is considered deprecated. It previously enabled - :term:`universal newlines` in text mode, which became the default behaviour + :term:`universal newlines` in text mode, which became the default behavior in Python 3.0. Refer to the documentation of the :ref:`newline ` parameter for further details. @@ -1122,11 +1171,7 @@ are always available. They are listed here in alphabetical order. *buffering* is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate the size - in bytes of a fixed-size chunk buffer. Note that specifying a buffer size this - way applies for binary buffered I/O, but ``TextIOWrapper`` (i.e., files opened - with ``mode='r+'``) would have another buffering. To disable buffering in - ``TextIOWrapper``, consider using the ``write_through`` flag for - :func:`io.TextIOWrapper.reconfigure`. When no *buffering* argument is + in bytes of a fixed-size chunk buffer. When no *buffering* argument is given, the default buffering policy works as follows: * Binary files are buffered in fixed-size chunks; the size of the buffer is @@ -1205,8 +1250,8 @@ are always available. They are listed here in alphabetical order. If *closefd* is ``False`` and a file descriptor rather than a filename was given, the underlying file descriptor will be kept open when the file is - closed. If a filename is given *closefd* must be ``True`` (the default) - otherwise an error will be raised. + closed. If a filename is given *closefd* must be ``True`` (the default); + otherwise, an error will be raised. A custom opener can be used by passing a callable as *opener*. The underlying file descriptor for the file object is then obtained by calling *opener* with @@ -1250,7 +1295,7 @@ are always available. They are listed here in alphabetical order. single: text mode module: sys - See also the file handling modules, such as, :mod:`fileinput`, :mod:`io` + See also the file handling modules, such as :mod:`fileinput`, :mod:`io` (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`, and :mod:`shutil`. @@ -1312,10 +1357,7 @@ are always available. They are listed here in alphabetical order. operands, the result has the same type as the operands (after coercion) unless the second argument is negative; in that case, all arguments are converted to float and a float result is delivered. For example, ``pow(10, 2)`` - returns ``100``, but ``pow(10, -2)`` returns ``0.01``. For a negative base of - type :class:`int` or :class:`float` and a non-integral exponent, a complex - result is delivered. For example, ``pow(-9, 0.5)`` returns a value close - to ``3j``. + returns ``100``, but ``pow(10, -2)`` returns ``0.01``. For :class:`int` operands *base* and *exp*, if *mod* is present, *mod* must also be of integer type and *mod* must be nonzero. If *mod* is present and @@ -1343,7 +1385,7 @@ are always available. They are listed here in alphabetical order. .. function:: print(*objects, sep=' ', end='\\n', file=sys.stdout, flush=False) Print *objects* to the text stream *file*, separated by *sep* and followed - by *end*. *sep*, *end*, *file* and *flush*, if present, must be given as keyword + by *end*. *sep*, *end*, *file*, and *flush*, if present, must be given as keyword arguments. All non-keyword arguments are converted to strings like :func:`str` does and @@ -1357,7 +1399,7 @@ are always available. They are listed here in alphabetical order. arguments are converted to text strings, :func:`print` cannot be used with binary mode file objects. For these, use ``file.write(...)`` instead. - Whether output is buffered is usually determined by *file*, but if the + Whether the output is buffered is usually determined by *file*, but if the *flush* keyword argument is true, the stream is forcibly flushed. .. versionchanged:: 3.3 @@ -1390,7 +1432,7 @@ are always available. They are listed here in alphabetical order. x = property(getx, setx, delx, "I'm the 'x' property.") If *c* is an instance of *C*, ``c.x`` will invoke the getter, - ``c.x = value`` will invoke the setter and ``del c.x`` the deleter. + ``c.x = value`` will invoke the setter, and ``del c.x`` the deleter. If given, *doc* will be the docstring of the property attribute. Otherwise, the property will copy *fget*'s docstring (if it exists). This makes it possible to @@ -1455,7 +1497,7 @@ are always available. They are listed here in alphabetical order. Return a string containing a printable representation of an object. For many types, this function makes an attempt to return a string that would yield an - object with the same value when passed to :func:`eval`, otherwise the + object with the same value when passed to :func:`eval`; otherwise, the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object. A class can control what this @@ -1483,7 +1525,7 @@ are always available. They are listed here in alphabetical order. ``2``). Any integer value is valid for *ndigits* (positive, zero, or negative). The return value is an integer if *ndigits* is omitted or ``None``. - Otherwise the return value has the same type as *number*. + Otherwise, the return value has the same type as *number*. For a general Python object ``number``, ``round`` delegates to ``number.__round__``. @@ -1513,7 +1555,7 @@ are always available. They are listed here in alphabetical order. .. function:: setattr(object, name, value) This is the counterpart of :func:`getattr`. The arguments are an object, a - string and an arbitrary value. The string may name an existing attribute or a + string, and an arbitrary value. The string may name an existing attribute or a new attribute. The function assigns the value to the attribute, provided the object allows it. For example, ``setattr(x, 'foobar', 123)`` is equivalent to ``x.foobar = 123``. @@ -1532,15 +1574,15 @@ are always available. They are listed here in alphabetical order. Return a :term:`slice` object representing the set of indices specified by ``range(start, stop, step)``. The *start* and *step* arguments default to ``None``. Slice objects have read-only data attributes :attr:`~slice.start`, - :attr:`~slice.stop` and :attr:`~slice.step` which merely return the argument + :attr:`~slice.stop`, and :attr:`~slice.step` which merely return the argument values (or their default). They have no other explicit functionality; - however they are used by NumPy and other third party packages. + however, they are used by NumPy and other third-party packages. Slice objects are also generated when extended indexing syntax is used. For example: ``a[start:stop:step]`` or ``a[start:stop, i]``. See :func:`itertools.islice` for an alternate version that returns an iterator. -.. function:: sorted(iterable, /, *, key=None, reverse=False) +.. function:: sorted(iterable, *, key=None, reverse=False) Return a new sorted list from the items in *iterable*. @@ -1586,10 +1628,11 @@ are always available. They are listed here in alphabetical order. The ``@staticmethod`` form is a function :term:`decorator` -- see :ref:`function` for details. - A static method can be called either on the class (such as ``C.f()``) or on an instance (such - as ``C().f()``). + A static method can be called either on the class (such as ``C.f()``) or on + an instance (such as ``C().f()``). Moreover, they can be called as regular + functions (such as ``f()``). - Static methods in Python are similar to those found in Java or C++. Also see + Static methods in Python are similar to those found in Java or C++. Also, see :func:`classmethod` for a variant that is useful for creating alternate class constructors. @@ -1599,11 +1642,20 @@ are always available. They are listed here in alphabetical order. body and you want to avoid the automatic transformation to instance method. For these cases, use this idiom:: + def regular_function(): + ... + class C: - builtin_open = staticmethod(open) + method = staticmethod(regular_function) For more information on static methods, see :ref:`types`. + .. versionchanged:: 3.10 + Static methods now inherit the method attributes (``__module__``, + ``__name__``, ``__qualname__``, ``__doc__`` and ``__annotations__``), + have a new ``__wrapped__`` attribute, and are now callable as regular + functions. + .. index:: single: string; str() (built-in function) @@ -1634,7 +1686,7 @@ are always available. They are listed here in alphabetical order. .. versionchanged:: 3.8 The *start* parameter can be specified as a keyword argument. -.. function:: super([type[, object-or-type]]) +.. class:: super([type[, object-or-type]]) Return a proxy object that delegates method calls to a parent or sibling class of *type*. This is useful for accessing inherited methods that have @@ -1770,50 +1822,90 @@ are always available. They are listed here in alphabetical order. it doesn't have a :attr:`~object.__dict__` attribute (for example, if its class defines the :attr:`~object.__slots__` attribute). -.. function:: zip(*iterables) - - Make an iterator that aggregates elements from each of the iterables. - - Returns an iterator of tuples, where the *i*-th tuple contains - the *i*-th element from each of the argument sequences or iterables. The - iterator stops when the shortest input iterable is exhausted. With a single - iterable argument, it returns an iterator of 1-tuples. With no arguments, - it returns an empty iterator. Equivalent to:: - - def zip(*iterables): - # zip('ABCD', 'xy') --> Ax By - sentinel = object() - iterators = [iter(it) for it in iterables] - while iterators: - result = [] - for it in iterators: - elem = next(it, sentinel) - if elem is sentinel: - return - result.append(elem) - yield tuple(result) - - The left-to-right evaluation order of the iterables is guaranteed. This - makes possible an idiom for clustering a data series into n-length groups - using ``zip(*[iter(s)]*n)``. This repeats the *same* iterator ``n`` times - so that each output tuple has the result of ``n`` calls to the iterator. - This has the effect of dividing the input into n-length chunks. - - :func:`zip` should only be used with unequal length inputs when you don't - care about trailing, unmatched values from the longer iterables. If those - values are important, use :func:`itertools.zip_longest` instead. - - :func:`zip` in conjunction with the ``*`` operator can be used to unzip a - list:: - - >>> x = [1, 2, 3] - >>> y = [4, 5, 6] - >>> zipped = zip(x, y) - >>> list(zipped) - [(1, 4), (2, 5), (3, 6)] - >>> x2, y2 = zip(*zip(x, y)) - >>> x == list(x2) and y == list(y2) - True +.. function:: zip(*iterables, strict=False) + + Iterate over several iterables in parallel, producing tuples with an item + from each one. + + Example:: + + >>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']): + ... print(item) + ... + (1, 'sugar') + (2, 'spice') + (3, 'everything nice') + + More formally: :func:`zip` returns an iterator of tuples, where the *i*-th + tuple contains the *i*-th element from each of the argument iterables. + + Another way to think of :func:`zip` is that it turns rows into columns, and + columns into rows. This is similar to `transposing a matrix + `_. + + :func:`zip` is lazy: The elements won't be processed until the iterable is + iterated on, e.g. by a :keyword:`!for` loop or by wrapping in a + :class:`list`. + + One thing to consider is that the iterables passed to :func:`zip` could have + different lengths; sometimes by design, and sometimes because of a bug in + the code that prepared these iterables. Python offers three different + approaches to dealing with this issue: + + * By default, :func:`zip` stops when the shortest iterable is exhausted. + It will ignore the remaining items in the longer iterables, cutting off + the result to the length of the shortest iterable:: + + >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'])) + [(0, 'fee'), (1, 'fi'), (2, 'fo')] + + * :func:`zip` is often used in cases where the iterables are assumed to be + of equal length. In such cases, it's recommended to use the ``strict=True`` + option. Its output is the same as regular :func:`zip`:: + + >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) + [('a', 1), ('b', 2), ('c', 3)] + + Unlike the default behavior, it checks that the lengths of iterables are + identical, raising a :exc:`ValueError` if they aren't: + + >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) + Traceback (most recent call last): + ... + ValueError: zip() argument 2 is longer than argument 1 + + Without the ``strict=True`` argument, any bug that results in iterables of + different lengths will be silenced, possibly manifesting as a hard-to-find + bug in another part of the program. + + * Shorter iterables can be padded with a constant value to make all the + iterables have the same length. This is done by + :func:`itertools.zip_longest`. + + Edge cases: With a single iterable argument, :func:`zip` returns an + iterator of 1-tuples. With no arguments, it returns an empty iterator. + + Tips and tricks: + + * The left-to-right evaluation order of the iterables is guaranteed. This + makes possible an idiom for clustering a data series into n-length groups + using ``zip(*[iter(s)]*n, strict=True)``. This repeats the *same* iterator + ``n`` times so that each output tuple has the result of ``n`` calls to the + iterator. This has the effect of dividing the input into n-length chunks. + + * :func:`zip` in conjunction with the ``*`` operator can be used to unzip a + list:: + + >>> x = [1, 2, 3] + >>> y = [4, 5, 6] + >>> list(zip(x, y)) + [(1, 4), (2, 5), (3, 6)] + >>> x2, y2 = zip(*zip(x, y)) + >>> x == list(x2) and y == list(y2) + True + + .. versionchanged:: 3.10 + Added the ``strict`` argument. .. function:: __import__(name, globals=None, locals=None, fromlist=(), level=0) @@ -1840,7 +1932,7 @@ are always available. They are listed here in alphabetical order. and *locals* to determine how to interpret the name in a package context. The *fromlist* gives the names of objects or submodules that should be imported from the module given by *name*. The standard implementation does - not use its *locals* argument at all, and uses its *globals* only to + not use its *locals* argument at all and uses its *globals* only to determine the package context of the :keyword:`import` statement. *level* specifies whether to use absolute or relative imports. ``0`` (the diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst index 1e408482..e40fe7bb 100644 --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -154,15 +154,16 @@ The :mod:`functools` module defines the following functions: @lru_cache def count_vowels(sentence): - sentence = sentence.casefold() - return sum(sentence.count(vowel) for vowel in 'aeiou') + return sum(sentence.count(vowel) for vowel in 'AEIOUaeiou') If *maxsize* is set to ``None``, the LRU feature is disabled and the cache can grow without bound. If *typed* is set to true, function arguments of different types will be - cached separately. For example, ``f(3)`` and ``f(3.0)`` will be treated - as distinct calls with distinct results. + cached separately. For example, ``f(3)`` and ``f(3.0)`` will always be + treated as distinct calls with distinct results. If *typed* is false, + the implementation will usually but not always regard them as equivalent + calls and only cache a single result. The wrapped function is instrumented with a :func:`cache_parameters` function that returns a new :class:`dict` showing the values for *maxsize* @@ -172,8 +173,7 @@ The :mod:`functools` module defines the following functions: To help measure the effectiveness of the cache and tune the *maxsize* parameter, the wrapped function is instrumented with a :func:`cache_info` function that returns a :term:`named tuple` showing *hits*, *misses*, - *maxsize* and *currsize*. In a multi-threaded environment, the hits - and misses are approximate. + *maxsize* and *currsize*. The decorator also provides a :func:`cache_clear` function for clearing or invalidating the cache. @@ -182,6 +182,9 @@ The :mod:`functools` module defines the following functions: :attr:`__wrapped__` attribute. This is useful for introspection, for bypassing the cache, or for rewrapping the function with a different cache. + The cache keeps references to the arguments and return values until they age + out of the cache or until the cache is cleared. + An `LRU (least recently used) cache `_ works best when the most recent calls are the best predictors of upcoming @@ -279,6 +282,13 @@ The :mod:`functools` module defines the following functions: application, implementing all six rich comparison methods instead is likely to provide an easy speed boost. + .. note:: + + This decorator makes no attempt to override methods that have been + declared in the class *or its superclasses*. Meaning that if a + superclass defines a comparison operator, *total_ordering* will not + implement it again, even if the original method is abstract. + .. versionadded:: 3.2 .. versionchanged:: 3.4 @@ -392,8 +402,8 @@ The :mod:`functools` module defines the following functions: dispatch>` :term:`generic function`. To define a generic function, decorate it with the ``@singledispatch`` - decorator. When defining a function using ``@singledispatch``, note that the - dispatch happens on the type of the first argument:: + decorator. Note that the dispatch happens on the type of the first argument, + create your function accordingly:: >>> from functools import singledispatch >>> @singledispatch @@ -403,9 +413,9 @@ The :mod:`functools` module defines the following functions: ... print(arg) To add overloaded implementations to the function, use the :func:`register` - attribute of the generic function, which can be used as a decorator. For - functions annotated with types, the decorator will infer the type of the - first argument automatically:: + attribute of the generic function. It is a decorator. For functions + annotated with types, the decorator will infer the type of the first + argument automatically:: >>> @fun.register ... def _(arg: int, verbose=False): @@ -431,17 +441,17 @@ The :mod:`functools` module defines the following functions: ... - To enable registering :term:`lambdas` and pre-existing functions, - the :func:`register` attribute can also be used in a functional form:: + To enable registering lambdas and pre-existing functions, the + :func:`register` attribute can be used in a functional form:: >>> def nothing(arg, verbose=False): ... print("Nothing.") ... >>> fun.register(type(None), nothing) - The :func:`register` attribute returns the undecorated function. This - enables decorator stacking, :mod:`pickling`, and the creation - of unit tests for each variant independently:: + The :func:`register` attribute returns the undecorated function which + enables decorator stacking, pickling, as well as creating unit tests for + each variant independently:: >>> @fun.register(float) ... @fun.register(Decimal) @@ -476,12 +486,11 @@ The :mod:`functools` module defines the following functions: Where there is no registered implementation for a specific type, its method resolution order is used to find a more generic implementation. The original function decorated with ``@singledispatch`` is registered - for the base :class:`object` type, which means it is used if no better + for the base ``object`` type, which means it is used if no better implementation is found. - If an implementation is registered to an :term:`abstract base class`, - virtual subclasses of the base class will be dispatched to that - implementation:: + If an implementation registered to :term:`abstract base class`, virtual + subclasses will be dispatched to that implementation:: >>> from collections.abc import Mapping >>> @fun.register @@ -494,7 +503,7 @@ The :mod:`functools` module defines the following functions: >>> fun({"a": "b"}) a => b - To check which implementation the generic function will choose for + To check which implementation will the generic function choose for a given type, use the ``dispatch()`` attribute:: >>> fun.dispatch(float) @@ -517,7 +526,7 @@ The :mod:`functools` module defines the following functions: .. versionadded:: 3.4 .. versionchanged:: 3.7 - The :func:`register` attribute now supports using type annotations. + The :func:`register` attribute supports using type annotations. .. class:: singledispatchmethod(func) @@ -526,9 +535,8 @@ The :mod:`functools` module defines the following functions: dispatch>` :term:`generic function`. To define a generic method, decorate it with the ``@singledispatchmethod`` - decorator. When defining a function using ``@singledispatchmethod``, note - that the dispatch happens on the type of the first non-*self* or non-*cls* - argument:: + decorator. Note that the dispatch happens on the type of the first non-self + or non-cls argument, create your function accordingly:: class Negator: @singledispatchmethod @@ -544,10 +552,9 @@ The :mod:`functools` module defines the following functions: return not arg ``@singledispatchmethod`` supports nesting with other decorators such as - :func:`@classmethod`. Note that to allow for - ``dispatcher.register``, ``singledispatchmethod`` must be the *outer most* - decorator. Here is the ``Negator`` class with the ``neg`` methods bound to - the class, rather than an instance of the class:: + ``@classmethod``. Note that to allow for ``dispatcher.register``, + ``singledispatchmethod`` must be the *outer most* decorator. Here is the + ``Negator`` class with the ``neg`` methods being class bound:: class Negator: @singledispatchmethod @@ -565,9 +572,8 @@ The :mod:`functools` module defines the following functions: def _(cls, arg: bool): return not arg - The same pattern can be used for other similar decorators: - :func:`@staticmethod`, - :func:`@abstractmethod`, and others. + The same pattern can be used for other similar decorators: ``staticmethod``, + ``abstractmethod``, and others. .. versionadded:: 3.8 diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst index ced84c7f..215f60d3 100644 --- a/Doc/library/glob.rst +++ b/Doc/library/glob.rst @@ -23,11 +23,8 @@ according to the rules used by the Unix shell, although results are returned in arbitrary order. No tilde expansion is done, but ``*``, ``?``, and character ranges expressed with ``[]`` will be correctly matched. This is done by using the :func:`os.scandir` and :func:`fnmatch.fnmatch` functions in concert, and -not by actually invoking a subshell. - -Note that files beginning with a dot (``.``) can only be matched by -patterns that also start with a dot, -unlike :func:`fnmatch.fnmatch` or :func:`pathlib.Path.glob`. +not by actually invoking a subshell. Note that unlike :func:`fnmatch.fnmatch`, +:mod:`glob` treats filenames beginning with a dot (``.``) as special cases. (For tilde and shell variable expansion, use :func:`os.path.expanduser` and :func:`os.path.expandvars`.) @@ -39,7 +36,7 @@ For example, ``'[?]'`` matches the character ``'?'``. The :mod:`pathlib` module offers high-level path objects. -.. function:: glob(pathname, *, recursive=False) +.. function:: glob(pathname, *, root_dir=None, dir_fd=None, recursive=False) Return a possibly-empty list of path names that match *pathname*, which must be a string containing a path specification. *pathname* can be either absolute @@ -50,6 +47,15 @@ For example, ``'[?]'`` matches the character ``'?'``. conditions is removed or added during the call of this function, whether a path name for that file be included is unspecified. + If *root_dir* is not ``None``, it should be a :term:`path-like object` + specifying the root directory for searching. It has the same effect on + :func:`glob` as changing the current directory before calling it. If + *pathname* is relative, the result will contain paths relative to + *root_dir*. + + This function can support :ref:`paths relative to directory descriptors + ` with the *dir_fd* parameter. + .. index:: single: **; in glob-style wildcards @@ -59,6 +65,7 @@ For example, ``'[?]'`` matches the character ``'?'``. match. .. audit-event:: glob.glob pathname,recursive glob.glob + .. audit-event:: glob.glob/2 pathname,recursive,root_dir,dir_fd glob.glob .. note:: Using the "``**``" pattern in large directory trees may consume @@ -67,13 +74,23 @@ For example, ``'[?]'`` matches the character ``'?'``. .. versionchanged:: 3.5 Support for recursive globs using "``**``". + .. versionchanged:: 3.10 + Added the *root_dir* and *dir_fd* parameters. -.. function:: iglob(pathname, *, recursive=False) + +.. function:: iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False) Return an :term:`iterator` which yields the same values as :func:`glob` without actually storing them all simultaneously. .. audit-event:: glob.glob pathname,recursive glob.iglob + .. audit-event:: glob.glob/2 pathname,recursive,root_dir,dir_fd glob.iglob + + .. versionchanged:: 3.5 + Support for recursive globs using "``**``". + + .. versionchanged:: 3.10 + Added the *root_dir* and *dir_fd* parameters. .. function:: escape(pathname) @@ -119,4 +136,3 @@ default. For example, consider a directory containing :file:`card.gif` and Module :mod:`fnmatch` Shell-style filename (not path) expansion - diff --git a/Doc/library/grp.rst b/Doc/library/grp.rst index fbfb922d..74de3f95 100644 --- a/Doc/library/grp.rst +++ b/Doc/library/grp.rst @@ -12,7 +12,7 @@ Unix versions. Group database entries are reported as a tuple-like object, whose attributes correspond to the members of the ``group`` structure (Attribute field below, see -````): +````): +-------+-----------+---------------------------------+ | Index | Attribute | Meaning | diff --git a/Doc/library/hashlib-blake2-tree.png b/Doc/library/hashlib-blake2-tree.png index faef21b55f96b13beaa7b0f54e7288574e903c81..73e849444ed7d38fa57e700f4acd2fc5110d7a44 100644 GIT binary patch literal 11146 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 literal 11070 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 Cf}_j; diff --git a/Doc/library/hashlib.rst b/Doc/library/hashlib.rst index bd25f008..77b35fd1 100644 --- a/Doc/library/hashlib.rst +++ b/Doc/library/hashlib.rst @@ -23,7 +23,7 @@ This module implements a common interface to many different secure hash and message digest algorithms. Included are the FIPS secure hash algorithms SHA1, SHA224, SHA256, SHA384, and SHA512 (defined in FIPS 180-2) as well as RSA's MD5 -algorithm (defined in Internet :rfc:`1321`). The terms "secure hash" and +algorithm (defined in internet :rfc:`1321`). The terms "secure hash" and "message digest" are interchangeable. Older algorithms were called message digests. The modern term is secure hash. @@ -120,10 +120,10 @@ More condensed: Using :func:`new` with an algorithm provided by OpenSSL: - >>> h = hashlib.new('sha256') + >>> h = hashlib.new('sha512_256') >>> h.update(b"Nobody inspects the spammish repetition") >>> h.hexdigest() - '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406' + '19197dc4d03829df858011c6c87600f994a858103bbc19005f20987aa19a97e2' Hashlib provides the following constant attributes: @@ -268,6 +268,12 @@ include a `salt `_. Python implementation uses an inline version of :mod:`hmac`. It is about three times slower and doesn't release the GIL. + .. deprecated:: 3.10 + + Slow Python implementation of *pbkdf2_hmac* is deprecated. In the + future the function will only be available when Python is compiled + with OpenSSL. + .. function:: scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64) The function provides scrypt password-based key derivation function as @@ -282,8 +288,6 @@ include a `salt `_. factor and *maxmem* limits memory (OpenSSL 1.1.0 defaults to 32 MiB). *dklen* is the length of the derived key. - .. availability:: OpenSSL 1.1+. - .. versionadded:: 3.6 @@ -496,7 +500,7 @@ Keyed hashing Keyed hashing can be used for authentication as a faster and simpler replacement for `Hash-based message authentication code -`_ (HMAC). +`_ (HMAC). BLAKE2 can be securely used in prefix-MAC mode thanks to the indifferentiability property inherited from BLAKE. @@ -748,5 +752,5 @@ Domain Dedication 1.0 Universal: Wikipedia article with information on which algorithms have known issues and what that means regarding their use. - https://www.ietf.org/rfc/rfc2898.txt - PKCS #5: Password-Based Cryptography Specification Version 2.0 + https://www.ietf.org/rfc/rfc8018.txt + PKCS #5: Password-Based Cryptography Specification Version 2.1 diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst index 897edc2d..6f1b59b5 100644 --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -138,7 +138,7 @@ This module also provides the following helper function: .. versionadded:: 3.3 - .. versionchanged:: 3.9 + .. versionchanged:: 3.10 The function uses OpenSSL's ``CRYPTO_memcmp()`` internally when available. diff --git a/Doc/library/html.entities.rst b/Doc/library/html.entities.rst index 7d836fe7..067e1b1e 100644 --- a/Doc/library/html.entities.rst +++ b/Doc/library/html.entities.rst @@ -44,4 +44,4 @@ This module defines four dictionaries, :data:`html5`, .. rubric:: Footnotes -.. [#] See https://html.spec.whatwg.org/multipage/syntax.html#named-character-references +.. [#] See https://www.w3.org/TR/html5/syntax.html#named-character-references diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst index 03aff25c..ac844a68 100644 --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -126,7 +126,7 @@ implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): .. method:: HTMLParser.handle_starttag(tag, attrs) - This method is called to handle the start tag of an element (e.g. ``

``). + This method is called to handle the start of a tag (e.g. ``
``). The *tag* argument is the name of the tag converted to lower case. The *attrs* argument is a list of ``(name, value)`` pairs containing the attributes found diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst index 35997db2..e605f7b8 100644 --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -99,6 +99,11 @@ The module provides the following classes: :attr:`ssl.SSLContext.post_handshake_auth` for the default *context* or when *cert_file* is passed with a custom *context*. + .. versionchanged:: 3.10 + This class now sends an ALPN extension with protocol indicator + ``http/1.1`` when no *context* is given. Custom *context* should set + ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocol`. + .. deprecated:: 3.6 *key_file* and *cert_file* are deprecated in favor of *context*. @@ -363,6 +368,8 @@ HTTPConnection Objects this is called automatically when making a request if the client does not already have a connection. + .. audit-event:: http.client.connect self,host,port http.client.HTTPConnection.connect + .. method:: HTTPConnection.close() @@ -432,6 +439,8 @@ also send your request step by step, by using the four functions below. :meth:`endheaders` method has been called and before :meth:`getresponse` is called. + .. audit-event:: http.client.send self,data http.client.HTTPConnection.send + .. _httpresponse-objects: diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst index fb113d89..6234e656 100644 --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -20,7 +20,7 @@ Both the regular Netscape cookie protocol and the protocol defined by :rfc:`2965` are handled. RFC 2965 handling is switched off by default. :rfc:`2109` cookies are parsed as Netscape cookies and subsequently treated either as Netscape or RFC 2965 cookies according to the 'policy' in effect. -Note that the great majority of cookies on the Internet are Netscape cookies. +Note that the great majority of cookies on the internet are Netscape cookies. :mod:`http.cookiejar` attempts to follow the de-facto Netscape cookie protocol (which differs substantially from that set out in the original Netscape specification), including taking note of the ``max-age`` and ``port`` cookie-attributes @@ -122,7 +122,7 @@ The following classes are provided: :mod:`http.cookiejar` and :mod:`http.cookies` modules do not depend on each other. - https://curl.se/rfc/cookie_spec.html + https://curl.haxx.se/rfc/cookie_spec.html The specification of the original Netscape cookie protocol. Though this is still the dominant protocol, the 'Netscape cookie protocol' implemented by all the major browsers (and :mod:`http.cookiejar`) only bears a passing resemblance to @@ -462,16 +462,16 @@ receiving cookies. There are also some strictness switches that allow you to tighten up the rather loose Netscape protocol rules a little bit (at the cost of blocking some benign cookies). -A domain blacklist and whitelist is provided (both off by default). Only domains -not in the blacklist and present in the whitelist (if the whitelist is active) +A domain blocklist and allowlist is provided (both off by default). Only domains +not in the blocklist and present in the allowlist (if the allowlist is active) participate in cookie setting and returning. Use the *blocked_domains* constructor argument, and :meth:`blocked_domains` and :meth:`set_blocked_domains` methods (and the corresponding argument and methods -for *allowed_domains*). If you set a whitelist, you can turn it off again by +for *allowed_domains*). If you set an allowlist, you can turn it off again by setting it to :const:`None`. Domains in block or allow lists that do not start with a dot must equal the -cookie domain to be matched. For example, ``"example.com"`` matches a blacklist +cookie domain to be matched. For example, ``"example.com"`` matches a blocklist entry of ``"example.com"``, but ``"www.example.com"`` does not. Domains that do start with a dot are matched by more specific domains too. For example, both ``"www.example.com"`` and ``"www.coyote.example.com"`` match ``".example.com"`` @@ -494,7 +494,7 @@ and ``".168.1.2"``, 192.168.1.2 is blocked, but 193.168.1.2 is not. .. method:: DefaultCookiePolicy.is_blocked(domain) - Return whether *domain* is on the blacklist for setting or receiving cookies. + Return whether *domain* is on the blocklist for setting or receiving cookies. .. method:: DefaultCookiePolicy.allowed_domains() @@ -509,7 +509,7 @@ and ``".168.1.2"``, 192.168.1.2 is blocked, but 193.168.1.2 is not. .. method:: DefaultCookiePolicy.is_not_allowed(domain) - Return whether *domain* is not on the whitelist for setting or receiving + Return whether *domain* is not on the allowlist for setting or receiving cookies. :class:`DefaultCookiePolicy` instances have the following attributes, which are diff --git a/Doc/library/http.rst b/Doc/library/http.rst index 14ee7336..2466c844 100644 --- a/Doc/library/http.rst +++ b/Doc/library/http.rst @@ -45,7 +45,7 @@ associated messages through the :class:`http.HTTPStatus` enum: >>> HTTPStatus.OK.description 'Request fulfilled, document follows' >>> list(HTTPStatus) - [, , ...] + [, , ...] .. _http-status-codes: diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst index 94647e99..c3cee079 100644 --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -14,13 +14,13 @@ -------------- -This module defines classes for implementing HTTP servers (Web servers). +This module defines classes for implementing HTTP servers. .. warning:: :mod:`http.server` is not recommended for production. It only implements - :ref:`basic security checks `. + basic security checks. One class, :class:`HTTPServer`, is a :class:`socketserver.TCPServer` subclass. It creates and listens at the HTTP socket, dispatching the requests to a @@ -412,22 +412,17 @@ the current directory:: .. _http-server-cli: :mod:`http.server` can also be invoked directly using the :option:`-m` -switch of the interpreter. Similar to +switch of the interpreter with a ``port number`` argument. Similar to the previous example, this serves files relative to the current directory:: - python -m http.server + python -m http.server 8000 -The server listens to port 8000 by default. The default can be overridden -by passing the desired port number as an argument:: - - python -m http.server 9000 - -By default, the server binds itself to all interfaces. The option ``-b/--bind`` +By default, server binds itself to all interfaces. The option ``-b/--bind`` specifies a specific address to which it should bind. Both IPv4 and IPv6 addresses are supported. For example, the following command causes the server to bind to localhost only:: - python -m http.server --bind 127.0.0.1 + python -m http.server 8000 --bind 127.0.0.1 .. versionadded:: 3.4 ``--bind`` argument was introduced. @@ -435,14 +430,14 @@ to bind to localhost only:: .. versionadded:: 3.8 ``--bind`` argument enhanced to support IPv6 -By default, the server uses the current directory. The option ``-d/--directory`` +By default, server uses the current directory. The option ``-d/--directory`` specifies a directory to which it should serve the files. For example, the following command uses a specific directory:: python -m http.server --directory /tmp/ .. versionadded:: 3.7 - ``--directory`` argument was introduced. + ``--directory`` specify alternate directory .. class:: CGIHTTPRequestHandler(request, client_address, server) @@ -487,24 +482,4 @@ the following command uses a specific directory:: :class:`CGIHTTPRequestHandler` can be enabled in the command line by passing the ``--cgi`` option:: - python -m http.server --cgi - -.. _http.server-security: - -Security Considerations ------------------------ - -.. index:: pair: http.server; security - -:class:`SimpleHTTPRequestHandler` will follow symbolic links when handling -requests, this makes it possible for files outside of the specified directory -to be served. - -Earlier versions of Python did not scrub control characters from the -log messages emitted to stderr from ``python -m http.server`` or the -default :class:`BaseHTTPRequestHandler` ``.log_message`` -implementation. This could allow remote clients connecting to your -server to send nefarious control codes to your terminal. - -.. versionadded:: 3.9.16 - scrubbing control characters from log messages + python -m http.server --cgi 8000 diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index b8febb9a..d740973a 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -96,13 +96,11 @@ Save Copy As... Print Window Print the current window to the default printer. -Close Window - Close the current window (if an unsaved editor, ask to save; if an unsaved - Shell, ask to quit execution). Calling ``exit()`` or ``close()`` in the Shell - window also closes Shell. If this is the only window, also exit IDLE. +Close + Close the current window (ask to save if unsaved). -Exit IDLE - Close all windows and quit IDLE (ask to save unsaved edit windows). +Exit + Close all windows and quit IDLE (ask to save unsaved windows). Edit menu (Shell and Editor) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -615,6 +613,12 @@ keywords, builtin class and function names, names following ``class`` and ``def``, strings, and comments. For any text window, these are the cursor (when present), found text (when possible), and selected text. +IDLE also highlights the :ref:`soft keywords ` :keyword:`match`, +:keyword:`case `, and :keyword:`_ ` in +pattern-matching statements. However, this highlighting is not perfect and +will be incorrect in some rare cases, including some ``_``-s in ``case`` +patterns. + Text coloring is done in the background, so uncolorized text is occasionally visible. To change the color scheme, use the Configure IDLE dialog Highlighting tab. The marking of debugger breakpoint lines in the editor and @@ -865,7 +869,7 @@ Running without a subprocess By default, IDLE executes user code in a separate subprocess via a socket, which uses the internal loopback interface. This connection is not -externally visible and no data is sent to or received from the Internet. +externally visible and no data is sent to or received from the internet. If firewall software complains anyway, you can ignore it. If the attempt to make the socket connection fails, Idle will notify you. diff --git a/Doc/library/imghdr.rst b/Doc/library/imghdr.rst index 186480be..3d7f6de7 100644 --- a/Doc/library/imghdr.rst +++ b/Doc/library/imghdr.rst @@ -3,14 +3,9 @@ .. module:: imghdr :synopsis: Determine the type of image contained in a file or byte stream. - :deprecated: **Source code:** :source:`Lib/imghdr.py` -.. deprecated:: 3.11 - The :mod:`imghdr` module is deprecated - (see :pep:`PEP 594 <594#imghdr>` for details and alternatives). - -------------- The :mod:`imghdr` module determines the type of image contained in a file or @@ -19,11 +14,11 @@ byte stream. The :mod:`imghdr` module defines the following function: -.. function:: what(filename, h=None) +.. function:: what(file, h=None) - Tests the image data contained in the file named by *filename*, and returns a - string describing the image type. If optional *h* is provided, the *filename* - is ignored and *h* is assumed to contain the byte stream to test. + Tests the image data contained in the file named by *file*, and returns a + string describing the image type. If optional *h* is provided, the *file* + argument is ignored and *h* is assumed to contain the byte stream to test. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. diff --git a/Doc/library/importlib.metadata.rst b/Doc/library/importlib.metadata.rst index 7652d501..c43457a3 100644 --- a/Doc/library/importlib.metadata.rst +++ b/Doc/library/importlib.metadata.rst @@ -7,13 +7,11 @@ .. module:: importlib.metadata :synopsis: The implementation of the importlib metadata. -**Source code:** :source:`Lib/importlib/metadata.py` - .. versionadded:: 3.8 +.. versionchanged:: 3.10 + ``importlib.metadata`` is no longer provisional. -.. note:: - This functionality is provisional and may deviate from the usual - version semantics of the standard library. +**Source code:** :source:`Lib/importlib/metadata.py` ``importlib.metadata`` is a library that provides for access to installed package metadata. Built in part on Python's import system, this library @@ -81,18 +79,48 @@ This package provides the following functionality via its public API. Entry points ------------ -The ``entry_points()`` function returns a dictionary of all entry points, -keyed by group. Entry points are represented by ``EntryPoint`` instances; +The ``entry_points()`` function returns a collection of entry points. +Entry points are represented by ``EntryPoint`` instances; each ``EntryPoint`` has a ``.name``, ``.group``, and ``.value`` attributes and a ``.load()`` method to resolve the value. There are also ``.module``, ``.attr``, and ``.extras`` attributes for getting the components of the -``.value`` attribute:: +``.value`` attribute. + +Query all entry points:: >>> eps = entry_points() # doctest: +SKIP - >>> list(eps) # doctest: +SKIP + +The ``entry_points()`` function returns an ``EntryPoints`` object, +a sequence of all ``EntryPoint`` objects with ``names`` and ``groups`` +attributes for convenience:: + + >>> sorted(eps.groups) # doctest: +SKIP ['console_scripts', 'distutils.commands', 'distutils.setup_keywords', 'egg_info.writers', 'setuptools.installation'] - >>> scripts = eps['console_scripts'] # doctest: +SKIP - >>> wheel = [ep for ep in scripts if ep.name == 'wheel'][0] # doctest: +SKIP + +``EntryPoints`` has a ``select`` method to select entry points +matching specific properties. Select entry points in the +``console_scripts`` group:: + + >>> scripts = eps.select(group='console_scripts') # doctest: +SKIP + +Equivalently, since ``entry_points`` passes keyword arguments +through to select:: + + >>> scripts = entry_points(group='console_scripts') # doctest: +SKIP + +Pick out a specific script named "wheel" (found in the wheel project):: + + >>> 'wheel' in scripts.names # doctest: +SKIP + True + >>> wheel = scripts['wheel'] # doctest: +SKIP + +Equivalently, query for that entry point during selection:: + + >>> (wheel,) = entry_points(group='console_scripts', name='wheel') # doctest: +SKIP + >>> (wheel,) = entry_points().select(group='console_scripts', name='wheel') # doctest: +SKIP + +Inspect the resolved entry point:: + >>> wheel # doctest: +SKIP EntryPoint(name='wheel', value='wheel.cli:main', group='console_scripts') >>> wheel.module # doctest: +SKIP @@ -111,6 +139,17 @@ group. Read `the setuptools docs `_ for more information on entry points, their definition, and usage. +*Compatibility Note* + +The "selectable" entry points were introduced in ``importlib_metadata`` +3.6 and Python 3.10. Prior to those changes, ``entry_points`` accepted +no parameters and always returned a dictionary of entry points, keyed +by group. For compatibility, if no parameters are passed to entry_points, +a ``SelectableGroups`` object is returned, implementing that dict +interface. In the future, calling ``entry_points`` with no parameters +will return an ``EntryPoints`` object. Users should rely on the selection +interface to retrieve entry points by group. + .. _metadata: @@ -122,12 +161,26 @@ Every distribution includes some metadata, which you can extract using the >>> wheel_metadata = metadata('wheel') # doctest: +SKIP -The keys of the returned data structure [#f1]_ name the metadata keywords, and -their values are returned unparsed from the distribution metadata:: +The keys of the returned data structure, a ``PackageMetadata``, +name the metadata keywords, and +the values are returned unparsed from the distribution metadata:: >>> wheel_metadata['Requires-Python'] # doctest: +SKIP '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' +``PackageMetadata`` also presents a ``json`` attribute that returns +all the metadata in a JSON-compatible form per :PEP:`566`:: + + >>> wheel_metadata.json['requires_python'] + '>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*' + +.. versionchanged:: 3.10 + The ``Description`` is now included in the metadata when presented + through the payload. Line continuation characters have been removed. + +.. versionadded:: 3.10 + The ``json`` attribute was added. + .. _version: @@ -199,7 +252,18 @@ function:: ["pytest (>=3.0.0) ; extra == 'test'", "pytest-cov ; extra == 'test'"] -.. _distributions: +Package distributions +--------------------- + +A convience method to resolve the distribution or +distributions (in the case of a namespace package) for top-level +Python packages or modules:: + + >>> packages_distributions() + {'importlib_metadata': ['importlib-metadata'], 'yaml': ['PyYAML'], 'jaraco': ['jaraco.classes', 'jaraco.functools'], ...} + +.. versionadded:: 3.10 + Distributions ============= @@ -274,9 +338,3 @@ a custom finder, return instances of this derived ``Distribution`` in the .. rubric:: Footnotes - -.. [#f1] Technically, the returned distribution metadata object is an - :class:`email.message.EmailMessage` - instance, but this is an implementation detail, and not part of the - stable API. You should only use dictionary-like methods and syntax - to access the metadata contents. diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst index 97564815..b5ee7a6b 100644 --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -208,7 +208,7 @@ Functions .. versionadded:: 3.4 .. versionchanged:: 3.7 :exc:`ModuleNotFoundError` is raised when the module being reloaded lacks - a :class:`ModuleSpec`. + a :class:`~importlib.machinery.ModuleSpec`. :mod:`importlib.abc` -- Abstract base classes related to import @@ -257,6 +257,10 @@ ABC hierarchy:: Returns ``None`` when called instead of raising :exc:`NotImplementedError`. + .. deprecated:: 3.10 + Implement :meth:`MetaPathFinder.find_spec` or + :meth:`PathEntryFinder.find_spec` instead. + .. class:: MetaPathFinder @@ -265,6 +269,9 @@ ABC hierarchy:: .. versionadded:: 3.3 + .. versionchanged:: 3.10 + No longer a subclass of :class:`Finder`. + .. method:: find_spec(fullname, path, target=None) An abstract method for finding a :term:`spec ` for @@ -313,11 +320,13 @@ ABC hierarchy:: An abstract base class representing a :term:`path entry finder`. Though it bears some similarities to :class:`MetaPathFinder`, ``PathEntryFinder`` is meant for use only within the path-based import subsystem provided - by :class:`PathFinder`. This ABC is a subclass of :class:`Finder` for - compatibility reasons only. + by :class:`importlib.machinery.PathFinder`. .. versionadded:: 3.3 + .. versionchanged:: 3.10 + No longer a subclass of :class:`Finder`. + .. method:: find_spec(fullname, target=None) An abstract method for finding a :term:`spec ` for @@ -363,7 +372,8 @@ ABC hierarchy:: .. method:: invalidate_caches() An optional method which, when called, should invalidate any internal - cache used by the finder. Used by :meth:`PathFinder.invalidate_caches` + cache used by the finder. Used by + :meth:`importlib.machinery.PathFinder.invalidate_caches` when invalidating the caches of all cached finders. @@ -805,48 +815,6 @@ ABC hierarchy:: .. versionadded:: 3.9 - .. abstractmethod:: name() - - The base name of this object without any parent references. - - .. abstractmethod:: iterdir() - - Yield Traversable objects in self. - - .. abstractmethod:: is_dir() - - Return True if self is a directory. - - .. abstractmethod:: is_file() - - Return True if self is a file. - - .. abstractmethod:: joinpath(child) - - Return Traversable child in self. - - .. abstractmethod:: __truediv__(child) - - Return Traversable child in self. - - .. abstractmethod:: open(mode='r', *args, **kwargs) - - *mode* may be 'r' or 'rb' to open as text or binary. Return a handle - suitable for reading (same as :attr:`pathlib.Path.open`). - - When opening as text, accepts encoding parameters such as those - accepted by :attr:`io.TextIOWrapper`. - - .. method:: read_bytes() - - Read contents of self as bytes. - - .. method:: read_text(encoding=None) - - Read contents of self as text. - - Note: In Python 3.11 and later, this class is found in ``importlib.resources.abc``. - .. class:: TraversableResources @@ -856,9 +824,10 @@ ABC hierarchy:: methods. Therefore, any loader supplying TraversableReader also supplies ResourceReader. - .. versionadded:: 3.9 + Loaders that wish to support resource reading are expected to + implement this interface. - Note: In Python 3.11 and later, this class is found in ``importlib.resources.abc``. + .. versionadded:: 3.9 :mod:`importlib.resources` -- Resources @@ -922,7 +891,7 @@ The following functions are available. .. function:: files(package) - Returns an :class:`importlib.abc.Traversable` object + Returns an :class:`importlib.resources.abc.Traversable` object representing the resource container for the package (think directory) and its resources (think files). A Traversable may contain other containers (think subdirectories). @@ -934,7 +903,7 @@ The following functions are available. .. function:: as_file(traversable) - Given a :class:`importlib.abc.Traversable` object representing + Given a :class:`importlib.resources.abc.Traversable` object representing a file, typically from :func:`importlib.resources.files`, return a context manager for use in a :keyword:`with` statement. The context manager provides a :class:`pathlib.Path` object. @@ -1234,6 +1203,9 @@ find and load modules. Attempt to find the loader to handle *fullname* within :attr:`path`. + .. deprecated:: 3.10 + Use :meth:`find_spec` instead. + .. method:: invalidate_caches() Clear out the internal cache. @@ -1648,9 +1620,9 @@ an :term:`importer`. .. function:: spec_from_loader(name, loader, *, origin=None, is_package=None) - A factory function for creating a :class:`ModuleSpec` instance based - on a loader. The parameters have the same meaning as they do for - ModuleSpec. The function uses available :term:`loader` APIs, such as + A factory function for creating a :class:`~importlib.machinery.ModuleSpec` + instance based on a loader. The parameters have the same meaning as they do + for ModuleSpec. The function uses available :term:`loader` APIs, such as :meth:`InspectLoader.is_package`, to fill in any missing information on the spec. @@ -1658,9 +1630,9 @@ an :term:`importer`. .. function:: spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None) - A factory function for creating a :class:`ModuleSpec` instance based - on the path to a file. Missing information will be filled in on the - spec by making use of loader APIs and by the implication that the + A factory function for creating a :class:`~importlib.machinery.ModuleSpec` + instance based on the path to a file. Missing information will be filled in + on the spec by making use of loader APIs and by the implication that the module will be file-based. .. versionadded:: 3.4 @@ -1778,6 +1750,29 @@ To import a Python source file directly, use the following recipe spec.loader.exec_module(module) +Implementing lazy imports +''''''''''''''''''''''''' + +The example below shows how to implement lazy imports:: + + >>> import importlib.util + >>> import sys + >>> def lazy_import(name): + ... spec = importlib.util.find_spec(name) + ... loader = importlib.util.LazyLoader(spec.loader) + ... spec.loader = loader + ... module = importlib.util.module_from_spec(spec) + ... sys.modules[name] = module + ... loader.exec_module(module) + ... return module + ... + >>> lazy_typing = lazy_import("typing") + >>> #lazy_typing is a real module object, + >>> #but it is not loaded in memory yet. + >>> lazy_typing.TYPE_CHECKING + False + + Setting up an importer '''''''''''''''''''''' diff --git a/Doc/library/index.rst b/Doc/library/index.rst index 5007bacb..db8f0d9b 100644 --- a/Doc/library/index.rst +++ b/Doc/library/index.rst @@ -71,8 +71,8 @@ the `Python Package Index `_. custominterp.rst modules.rst language.rst - misc.rst windows.rst unix.rst superseded.rst + undoc.rst security_warnings.rst diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst index d1e4a9b5..ed33cbb8 100644 --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -95,6 +95,8 @@ attributes: | | __globals__ | global namespace in which | | | | this function was defined | +-----------+-------------------+---------------------------+ +| | __builtins__ | builtins namespace | ++-----------+-------------------+---------------------------+ | | __annotations__ | mapping of parameters | | | | names to annotations; | | | | ``"return"`` key is | @@ -251,6 +253,10 @@ attributes: Add ``cr_origin`` attribute to coroutines. +.. versionchanged:: 3.10 + + Add ``__builtins__`` attribute to functions. + .. function:: getmembers(object[, predicate]) Return all the members of an object in a list of ``(name, value)`` @@ -556,7 +562,7 @@ The Signature object represents the call signature of a callable object and its return annotation. To retrieve a Signature object, use the :func:`signature` function. -.. function:: signature(callable, *, follow_wrapped=True) +.. function:: signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False) Return a :class:`Signature` object for the given ``callable``:: @@ -578,8 +584,20 @@ function. Accepts a wide range of Python callables, from plain functions and classes to :func:`functools.partial` objects. + For objects defined in modules using stringized annotations + (``from __future__ import annotations``), :func:`signature` will + attempt to automatically un-stringize the annotations using + :func:`inspect.get_annotations()`. The + ``global``, ``locals``, and ``eval_str`` parameters are passed + into :func:`inspect.get_annotations()` when resolving the + annotations; see the documentation for :func:`inspect.get_annotations()` + for instructions on how to use these parameters. + Raises :exc:`ValueError` if no signature can be provided, and - :exc:`TypeError` if that type of object is not supported. + :exc:`TypeError` if that type of object is not supported. Also, + if the annotations are stringized, and ``eval_str`` is not false, + the ``eval()`` call(s) to un-stringize the annotations could + potentially raise any kind of exception. A slash(/) in the signature of a function denotes that the parameters prior to it are positional-only. For more info, see @@ -590,6 +608,9 @@ function. ``callable`` specifically (``callable.__wrapped__`` will not be used to unwrap decorated callables.) + .. versionadded:: 3.10 + ``globals``, ``locals``, and ``eval_str`` parameters. + .. note:: Some callables may not be introspectable in certain implementations of @@ -668,11 +689,12 @@ function. >>> str(new_sig) "(a, b) -> 'new return anno'" - .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True) + .. classmethod:: Signature.from_callable(obj, *, follow_wrapped=True, globalns=None, localns=None) Return a :class:`Signature` (or its subclass) object for a given callable ``obj``. Pass ``follow_wrapped=False`` to get a signature of ``obj`` - without unwrapping its ``__wrapped__`` chain. + without unwrapping its ``__wrapped__`` chain. ``globalns`` and + ``localns`` will be used as the namespaces when resolving annotations. This method simplifies subclassing of :class:`Signature`:: @@ -683,6 +705,9 @@ function. .. versionadded:: 3.5 + .. versionadded:: 3.10 + ``globalns`` and ``localns`` parameters. + .. class:: Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty) @@ -1093,6 +1118,62 @@ Classes and functions .. versionadded:: 3.4 +.. function:: get_annotations(obj, *, globals=None, locals=None, eval_str=False) + + Compute the annotations dict for an object. + + ``obj`` may be a callable, class, or module. + Passing in an object of any other type raises :exc:`TypeError`. + + Returns a dict. ``get_annotations()`` returns a new dict every time + it's called; calling it twice on the same object will return two + different but equivalent dicts. + + This function handles several details for you: + + * If ``eval_str`` is true, values of type ``str`` will + be un-stringized using :func:`eval()`. This is intended + for use with stringized annotations + (``from __future__ import annotations``). + * If ``obj`` doesn't have an annotations dict, returns an + empty dict. (Functions and methods always have an + annotations dict; classes, modules, and other types of + callables may not.) + * Ignores inherited annotations on classes. If a class + doesn't have its own annotations dict, returns an empty dict. + * All accesses to object members and dict values are done + using ``getattr()`` and ``dict.get()`` for safety. + * Always, always, always returns a freshly-created dict. + + ``eval_str`` controls whether or not values of type ``str`` are replaced + with the result of calling :func:`eval()` on those values: + + * If eval_str is true, :func:`eval()` is called on values of type ``str``. + (Note that ``get_annotations`` doesn't catch exceptions; if :func:`eval()` + raises an exception, it will unwind the stack past the ``get_annotations`` + call.) + * If eval_str is false (the default), values of type ``str`` are unchanged. + + ``globals`` and ``locals`` are passed in to :func:`eval()`; see the documentation + for :func:`eval()` for more information. If ``globals`` or ``locals`` + is ``None``, this function may replace that value with a context-specific + default, contingent on ``type(obj)``: + + * If ``obj`` is a module, ``globals`` defaults to ``obj.__dict__``. + * If ``obj`` is a class, ``globals`` defaults to + ``sys.modules[obj.__module__].__dict__`` and ``locals`` defaults + to the ``obj`` class namespace. + * If ``obj`` is a callable, ``globals`` defaults to ``obj.__globals__``, + although if ``obj`` is a wrapped function (using + ``functools.update_wrapper()``) it is first unwrapped. + + Calling ``get_annotations`` is best practice for accessing the + annotations dict of any object. See :ref:`annotations-howto` for + more information on annotations best practices. + + .. versionadded:: 3.10 + + .. _inspect-stack: The interpreter stack diff --git a/Doc/library/internet.rst b/Doc/library/internet.rst index c8bab2a5..e745dd12 100644 --- a/Doc/library/internet.rst +++ b/Doc/library/internet.rst @@ -11,7 +11,7 @@ Internet Protocols and Support .. index:: module: socket -The modules described in this chapter implement Internet protocols and support +The modules described in this chapter implement internet protocols and support for related technology. They are all implemented in Python. Most of these modules require the presence of the system-dependent module :mod:`socket`, which is currently supported on most popular platforms. Here is an overview: @@ -20,6 +20,8 @@ is currently supported on most popular platforms. Here is an overview: .. toctree:: webbrowser.rst + cgi.rst + cgitb.rst wsgiref.rst urllib.rst urllib.request.rst @@ -31,7 +33,10 @@ is currently supported on most popular platforms. Here is an overview: ftplib.rst poplib.rst imaplib.rst + nntplib.rst smtplib.rst + smtpd.rst + telnetlib.rst uuid.rst socketserver.rst http.server.rst diff --git a/Doc/library/io.rst b/Doc/library/io.rst index ea57aae7..0881015c 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -106,6 +106,56 @@ stream by opening a file in binary mode with buffering disabled:: The raw stream API is described in detail in the docs of :class:`RawIOBase`. +.. _io-text-encoding: + +Text Encoding +------------- + +The default encoding of :class:`TextIOWrapper` and :func:`open` is +locale-specific (:func:`locale.getpreferredencoding(False) `). + +However, many developers forget to specify the encoding when opening text files +encoded in UTF-8 (e.g. JSON, TOML, Markdown, etc...) since most Unix +platforms use UTF-8 locale by default. This causes bugs because the locale +encoding is not UTF-8 for most Windows users. For example:: + + # May not work on Windows when non-ASCII characters in the file. + with open("README.md") as f: + long_description = f.read() + +Additionally, while there is no concrete plan as of yet, Python may change +the default text file encoding to UTF-8 in the future. + +Accordingly, it is highly recommended that you specify the encoding +explicitly when opening text files. If you want to use UTF-8, pass +``encoding="utf-8"``. To use the current locale encoding, +``encoding="locale"`` is supported in Python 3.10. + +When you need to run existing code on Windows that attempts to opens +UTF-8 files using the default locale encoding, you can enable the UTF-8 +mode. See :ref:`UTF-8 mode on Windows `. + +.. _io-encoding-warning: + +Opt-in EncodingWarning +^^^^^^^^^^^^^^^^^^^^^^ + +.. versionadded:: 3.10 + See :pep:`597` for more details. + +To find where the default locale encoding is used, you can enable +the ``-X warn_default_encoding`` command line option or set the +:envvar:`PYTHONWARNDEFAULTENCODING` environment variable, which will +emit an :exc:`EncodingWarning` when the default encoding is used. + +If you are providing an API that uses :func:`open` or +:class:`TextIOWrapper` and passes ``encoding=None`` as a parameter, you +can use :func:`text_encoding` so that callers of the API will emit an +:exc:`EncodingWarning` if they don't pass an ``encoding``. However, +please consider using UTF-8 by default (i.e. ``encoding="utf-8"``) for +new APIs. + + High-level Module Interface --------------------------- @@ -143,6 +193,32 @@ High-level Module Interface .. versionadded:: 3.8 +.. function:: text_encoding(encoding, stacklevel=2) + + This is a helper function for callables that use :func:`open` or + :class:`TextIOWrapper` and have an ``encoding=None`` parameter. + + This function returns *encoding* if it is not ``None`` and ``"locale"`` if + *encoding* is ``None``. + + This function emits an :class:`EncodingWarning` if + :data:`sys.flags.warn_default_encoding ` is true and *encoding* + is None. *stacklevel* specifies where the warning is emitted. + For example:: + + def read_text(path, encoding=None): + encoding = io.text_encoding(encoding) # stacklevel=2 + with open(path, encoding) as f: + return f.read() + + In this example, an :class:`EncodingWarning` is emitted for the caller of + ``read_text()``. + + See :ref:`io-text-encoding` for more information. + + .. versionadded:: 3.10 + + .. exception:: BlockingIOError This is a compatibility alias for the builtin :exc:`BlockingIOError` @@ -230,7 +306,8 @@ I/O Base Classes .. class:: IOBase - The abstract base class for all I/O classes. + The abstract base class for all I/O classes, acting on streams of bytes. + There is no public constructor. This class provides empty abstract implementations for many methods that derived classes can override selectively; the default @@ -299,7 +376,7 @@ I/O Base Classes Return ``True`` if the stream can be read from. If ``False``, :meth:`read` will raise :exc:`OSError`. - .. method:: readline(size=-1, /) + .. method:: readline(size=-1) Read and return one line from the stream. If *size* is specified, at most *size* bytes will be read. @@ -308,7 +385,7 @@ I/O Base Classes the *newline* argument to :func:`open` can be used to select the line terminator(s) recognized. - .. method:: readlines(hint=-1, /) + .. method:: readlines(hint=-1) Read and return a list of lines from the stream. *hint* can be specified to control the number of lines read: no more lines will be read if the @@ -320,7 +397,7 @@ I/O Base Classes Note that it's already possible to iterate on file objects using ``for line in file: ...`` without calling ``file.readlines()``. - .. method:: seek(offset, whence=SEEK_SET, /) + .. method:: seek(offset, whence=SEEK_SET) Change the stream position to the given byte *offset*. *offset* is interpreted relative to the position indicated by *whence*. The default @@ -352,7 +429,7 @@ I/O Base Classes Return the current stream position. - .. method:: truncate(size=None, /) + .. method:: truncate(size=None) Resize the stream to the given *size* in bytes (or the current position if *size* is not specified). The current stream position isn't changed. @@ -369,7 +446,7 @@ I/O Base Classes Return ``True`` if the stream supports writing. If ``False``, :meth:`write` and :meth:`truncate` will raise :exc:`OSError`. - .. method:: writelines(lines, /) + .. method:: writelines(lines) Write a list of lines to the stream. Line separators are not added, so it is usual for each of the lines provided to have a line separator at the @@ -384,7 +461,8 @@ I/O Base Classes .. class:: RawIOBase - Base class for raw binary streams. It inherits :class:`IOBase`. + Base class for raw binary streams. It inherits :class:`IOBase`. There is no + public constructor. Raw binary streams typically provide low-level access to an underlying OS device or API, and do not try to encapsulate it in high-level primitives @@ -394,7 +472,7 @@ I/O Base Classes :class:`RawIOBase` provides these methods in addition to those from :class:`IOBase`: - .. method:: read(size=-1, /) + .. method:: read(size=-1) Read up to *size* bytes from the object and return them. As a convenience, if *size* is unspecified or -1, all bytes until EOF are returned. @@ -413,7 +491,7 @@ I/O Base Classes Read and return all the bytes from the stream until EOF, using multiple calls to the stream if necessary. - .. method:: readinto(b, /) + .. method:: readinto(b) Read bytes into a pre-allocated, writable :term:`bytes-like object` *b*, and return the @@ -421,7 +499,7 @@ I/O Base Classes If the object is in non-blocking mode and no bytes are available, ``None`` is returned. - .. method:: write(b, /) + .. method:: write(b) Write the given :term:`bytes-like object`, *b*, to the underlying raw stream, and return the number of @@ -437,7 +515,7 @@ I/O Base Classes .. class:: BufferedIOBase Base class for binary streams that support some kind of buffering. - It inherits :class:`IOBase`. + It inherits :class:`IOBase`. There is no public constructor. The main difference with :class:`RawIOBase` is that methods :meth:`read`, :meth:`readinto` and :meth:`write` will try (respectively) to read as much @@ -478,7 +556,7 @@ I/O Base Classes .. versionadded:: 3.1 - .. method:: read(size=-1, /) + .. method:: read(size=-1) Read and return up to *size* bytes. If the argument is omitted, ``None``, or negative, data is read and returned until EOF is reached. An empty @@ -493,7 +571,7 @@ I/O Base Classes A :exc:`BlockingIOError` is raised if the underlying raw stream is in non blocking-mode, and has no data available at the moment. - .. method:: read1(size=-1, /) + .. method:: read1([size]) Read and return up to *size* bytes, with at most one call to the underlying raw stream's :meth:`~RawIOBase.read` (or @@ -504,7 +582,7 @@ I/O Base Classes If *size* is ``-1`` (the default), an arbitrary number of bytes are returned (more than zero unless EOF is reached). - .. method:: readinto(b, /) + .. method:: readinto(b) Read bytes into a pre-allocated, writable :term:`bytes-like object` *b* and return the number of bytes read. @@ -516,7 +594,7 @@ I/O Base Classes A :exc:`BlockingIOError` is raised if the underlying raw stream is in non blocking-mode, and has no data available at the moment. - .. method:: readinto1(b, /) + .. method:: readinto1(b) Read bytes into a pre-allocated, writable :term:`bytes-like object` *b*, using at most one call to @@ -528,7 +606,7 @@ I/O Base Classes .. versionadded:: 3.5 - .. method:: write(b, /) + .. method:: write(b) Write the given :term:`bytes-like object`, *b*, and return the number of bytes written (always equal to the length of *b* in bytes, since if @@ -611,7 +689,7 @@ Buffered Streams Buffered I/O streams provide a higher-level interface to an I/O device than raw I/O does. -.. class:: BytesIO(initial_bytes=b'') +.. class:: BytesIO([initial_bytes]) A binary stream using an in-memory bytes buffer. It inherits :class:`BufferedIOBase`. The buffer is discarded when the @@ -646,14 +724,14 @@ than raw I/O does. Return :class:`bytes` containing the entire contents of the buffer. - .. method:: read1(size=-1, /) + .. method:: read1([size]) In :class:`BytesIO`, this is the same as :meth:`~BufferedIOBase.read`. .. versionchanged:: 3.7 The *size* argument is now optional. - .. method:: readinto1(b, /) + .. method:: readinto1(b) In :class:`BytesIO`, this is the same as :meth:`~BufferedIOBase.readinto`. @@ -676,18 +754,18 @@ than raw I/O does. :class:`BufferedReader` provides or overrides these methods in addition to those from :class:`BufferedIOBase` and :class:`IOBase`: - .. method:: peek(size=0, /) + .. method:: peek([size]) Return bytes from the stream without advancing the position. At most one single read on the raw stream is done to satisfy the call. The number of bytes returned may be less or more than requested. - .. method:: read(size=-1, /) + .. method:: read([size]) Read and return *size* bytes, or if *size* is not given or negative, until EOF or if the read call would block in non-blocking mode. - .. method:: read1(size=-1, /) + .. method:: read1([size]) Read and return up to *size* bytes with only one call on the raw stream. If at least one byte is buffered, only buffered bytes are returned. @@ -724,7 +802,7 @@ than raw I/O does. Force bytes held in the buffer into the raw stream. A :exc:`BlockingIOError` should be raised if the raw stream blocks. - .. method:: write(b, /) + .. method:: write(b) Write the :term:`bytes-like object`, *b*, and return the number of bytes written. When in non-blocking mode, a @@ -747,7 +825,7 @@ than raw I/O does. are guaranteed to be implemented. -.. class:: BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE, /) +.. class:: BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE) A buffered binary stream providing higher-level access to two non seekable :class:`RawIOBase` raw binary streams---one readable, the other writeable. @@ -774,7 +852,8 @@ Text I/O .. class:: TextIOBase Base class for text streams. This class provides a character and line based - interface to stream I/O. It inherits :class:`IOBase`. + interface to stream I/O. It inherits :class:`IOBase`. There is no public + constructor. :class:`TextIOBase` provides or overrides these data attributes and methods in addition to those from :class:`IOBase`: @@ -814,19 +893,19 @@ Text I/O .. versionadded:: 3.1 - .. method:: read(size=-1, /) + .. method:: read(size=-1) Read and return at most *size* characters from the stream as a single :class:`str`. If *size* is negative or ``None``, reads until EOF. - .. method:: readline(size=-1, /) + .. method:: readline(size=-1) Read until newline or EOF and return a single ``str``. If the stream is already at EOF, an empty string is returned. If *size* is specified, at most *size* characters will be read. - .. method:: seek(offset, whence=SEEK_SET, /) + .. method:: seek(offset, whence=SEEK_SET) Change the stream position to the given *offset*. Behaviour depends on the *whence* parameter. The default value for *whence* is @@ -853,7 +932,7 @@ Text I/O does not usually represent a number of bytes in the underlying binary storage. - .. method:: write(s, /) + .. method:: write(s) Write the string *s* to the stream and return the number of characters written. @@ -869,6 +948,8 @@ Text I/O *encoding* gives the name of the encoding that the stream will be decoded or encoded with. It defaults to :func:`locale.getpreferredencoding(False) `. + ``encoding="locale"`` can be used to specify the current locale's encoding + explicitly. See :ref:`io-text-encoding` for more information. *errors* is an optional string that specifies how encoding and decoding errors are to be handled. Pass ``'strict'`` to raise a :exc:`ValueError` @@ -920,6 +1001,9 @@ Text I/O locale encoding using :func:`locale.setlocale`, use the current locale encoding instead of the user preferred encoding. + .. versionchanged:: 3.10 + The *encoding* argument now supports the ``"locale"`` dummy encoding name. + :class:`TextIOWrapper` provides these data attributes and methods in addition to those from :class:`TextIOBase` and :class:`IOBase`: diff --git a/Doc/library/ipaddress.rst b/Doc/library/ipaddress.rst index 9c2dff55..74d922d2 100644 --- a/Doc/library/ipaddress.rst +++ b/Doc/library/ipaddress.rst @@ -682,7 +682,7 @@ dictionaries. Note that currently expanded netmasks are not supported. That means ``2001:db00::0/24`` is a valid argument while ``2001:db00::0/ffff:ff00::`` - is not. + not. 2. An integer that fits into 128 bits. This is equivalent to a single-address network, with the network address being *address* and diff --git a/Doc/library/ipc.rst b/Doc/library/ipc.rst index 4849c82f..b88a174e 100644 --- a/Doc/library/ipc.rst +++ b/Doc/library/ipc.rst @@ -22,5 +22,7 @@ The list of modules described in this chapter is: ssl.rst select.rst selectors.rst + asyncore.rst + asynchat.rst signal.rst mmap.rst diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst index 6da55f8a..61d8b869 100644 --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -55,6 +55,7 @@ Iterator Arguments Results :func:`filterfalse` pred, seq elements of seq where pred(elem) is false ``filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8`` :func:`groupby` iterable[, key] sub-iterators grouped by value of key(v) :func:`islice` seq, [start,] stop [, step] elements from seq[start:stop:step] ``islice('ABCDEFG', 2, None) --> C D E F G`` +:func:`pairwise` iterable (p[0], p[1]), (p[1], p[2]) ``pairwise('ABCDEFG') --> AB BC CD DE EF FG`` :func:`starmap` func, seq func(\*seq[0]), func(\*seq[1]), ... ``starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000`` :func:`takewhile` pred, seq seq[0], seq[1], until pred fails ``takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4`` :func:`tee` it, n it1, it2, ... itn splits one iterator into n @@ -475,6 +476,24 @@ loops that truncate the stream. If *start* is ``None``, then iteration starts at zero. If *step* is ``None``, then the step defaults to one. +.. function:: pairwise(iterable) + + Return successive overlapping pairs taken from the input *iterable*. + + The number of 2-tuples in the output iterator will be one fewer than the + number of inputs. It will be empty if the input iterable has fewer than + two values. + + Roughly equivalent to:: + + def pairwise(iterable): + # pairwise('ABCDEFG') --> AB BC CD DE EF FG + a, b = tee(iterable) + next(b, None) + return zip(a, b) + + .. versionadded:: 3.10 + .. function:: permutations(iterable, r=None) @@ -794,18 +813,28 @@ which incur interpreter overhead. return starmap(func, repeat(args)) return starmap(func, repeat(args, times)) - def pairwise(iterable): - "s -> (s0,s1), (s1,s2), (s2, s3), ..." - a, b = tee(iterable) - next(b, None) - return zip(a, b) - def grouper(iterable, n, fillvalue=None): - "Collect data into fixed-length chunks or blocks" - # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" + "Collect data into non-overlapping fixed-length chunks or blocks" + # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx args = [iter(iterable)] * n return zip_longest(*args, fillvalue=fillvalue) + def triplewise(iterable): + "Return overlapping triplets from an iterable" + # triplewise('ABCDEFG') -> ABC BCD CDE DEF EFG + for (a, _), (b, c) in pairwise(pairwise(iterable)): + yield a, b, c + + def sliding_window(iterable, n): + # sliding_window('ABCDEFG', 4) -> ABCD BCDE CDEF DEFG + it = iter(iterable) + window = collections.deque(islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + def roundrobin(*iterables): "roundrobin('ABC', 'D', 'EF') --> A D E B F C" # Recipe credited to George Sakkis @@ -826,6 +855,35 @@ which incur interpreter overhead. t1, t2 = tee(iterable) return filterfalse(pred, t1), filter(pred, t2) + def before_and_after(predicate, it): + """ Variant of takewhile() that allows complete + access to the remainder of the iterator. + + >>> it = iter('ABCdEfGhI') + >>> all_upper, remainder = before_and_after(str.isupper, it) + >>> ''.join(all_upper) + 'ABC' + >>> ''.join(remainder) # takewhile() would lose the 'd' + 'dEfGhI' + + Note that the first iterator must be fully + consumed before the second iterator can + generate valid results. + """ + it = iter(it) + transition = [] + def true_iterator(): + for elem in it: + if predicate(elem): + yield elem + else: + transition.append(elem) + return + def remainder_iterator(): + yield from transition + yield from it + return true_iterator(), remainder_iterator() + def powerset(iterable): "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" s = list(iterable) @@ -937,4 +995,3 @@ which incur interpreter overhead. c, n = c*(n-r)//n, n-1 result.append(pool[-1-n]) return tuple(result) - diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 4dc085fd..c8184da8 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -11,18 +11,13 @@ -------------- -`JSON (JavaScript Object Notation) `_, specified by +`JSON (JavaScript Object Notation) `_, specified by :rfc:`7159` (which obsoletes :rfc:`4627`) and by -`ECMA-404 `_, +`ECMA-404 `_, is a lightweight data interchange format inspired by `JavaScript `_ object literal syntax (although it is not a strict subset of JavaScript [#rfc-errata]_ ). -.. warning:: - Be cautious when parsing JSON data from untrusted sources. A malicious - JSON string may cause the decoder to consume considerable CPU and memory - resources. Limiting the size of data to be parsed is recommended. - :mod:`json` exposes an API familiar to users of the standard library :mod:`marshal` and :mod:`pickle` modules. @@ -130,6 +125,13 @@ See :ref:`json-commandline` for detailed documentation. This module's encoders and decoders preserve input and output order by default. Order is only lost if the underlying containers are unordered. + Prior to Python 3.7, :class:`dict` was not guaranteed to be ordered, so + inputs and outputs were typically scrambled unless + :class:`collections.OrderedDict` was specifically requested. Starting + with Python 3.7, the regular :class:`dict` became order preserving, so + it is no longer necessary to specify :class:`collections.OrderedDict` for + JSON generation and parsing. + Basic Usage ----------- @@ -157,7 +159,7 @@ Basic Usage If *check_circular* is false (default: ``True``), then the circular reference check for container types will be skipped and a circular reference - will result in an :exc:`RecursionError` (or worse). + will result in an :exc:`OverflowError` (or worse). If *allow_nan* is false (default: ``True``), then it will be a :exc:`ValueError` to serialize out of range :class:`float` values (``nan``, @@ -253,12 +255,6 @@ Basic Usage be used to use another datatype or parser for JSON integers (e.g. :class:`float`). - .. versionchanged:: 3.9.14 - The default *parse_int* of :func:`int` now limits the maximum length of - the integer string via the interpreter's :ref:`integer string - conversion length limitation ` to help avoid denial - of service attacks. - *parse_constant*, if specified, will be called with one of the following strings: ``'-Infinity'``, ``'Infinity'``, ``'NaN'``. This can be used to raise an exception if invalid JSON numbers @@ -436,7 +432,7 @@ Encoders and Decoders If *check_circular* is true (the default), then lists, dicts, and custom encoded objects will be checked for circular references during encoding to - prevent an infinite recursion (which would cause an :exc:`RecursionError`). + prevent an infinite recursion (which would cause an :exc:`OverflowError`). Otherwise, no such check takes place. If *allow_nan* is true (the default), then ``NaN``, ``Infinity``, and @@ -548,7 +544,7 @@ Standard Compliance and Interoperability ---------------------------------------- The JSON format is specified by :rfc:`7159` and by -`ECMA-404 `_. +`ECMA-404 `_. This section details this module's level of compliance with the RFC. For simplicity, :class:`JSONEncoder` and :class:`JSONDecoder` subclasses, and parameters other than those explicitly mentioned, are not considered. diff --git a/Doc/library/language.rst b/Doc/library/language.rst index 1eac32e4..510f064c 100644 --- a/Doc/library/language.rst +++ b/Doc/library/language.rst @@ -13,10 +13,8 @@ These modules include: .. toctree:: - parser.rst ast.rst symtable.rst - symbol.rst token.rst keyword.rst tokenize.rst diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst index 5b5a0c75..60d0c59d 100644 --- a/Doc/library/locale.rst +++ b/Doc/library/locale.rst @@ -315,21 +315,25 @@ The :mod:`locale` module defines the following exception and functions: .. function:: getpreferredencoding(do_setlocale=True) - Return the encoding used for text data, according to user preferences. User - preferences are expressed differently on different systems, and might not be - available programmatically on some systems, so this function only returns a - guess. + Return the :term:`locale encoding` used for text data, according to user + preferences. User preferences are expressed differently on different + systems, and might not be available programmatically on some systems, so + this function only returns a guess. - On some systems, it is necessary to invoke :func:`setlocale` to obtain the user - preferences, so this function is not thread-safe. If invoking setlocale is not - necessary or desired, *do_setlocale* should be set to ``False``. + On some systems, it is necessary to invoke :func:`setlocale` to obtain the + user preferences, so this function is not thread-safe. If invoking setlocale + is not necessary or desired, *do_setlocale* should be set to ``False``. - On Android or in the UTF-8 mode (:option:`-X` ``utf8`` option), always - return ``'UTF-8'``, the locale and the *do_setlocale* argument are ignored. + On Android or if the :ref:`Python UTF-8 Mode ` is enabled, always + return ``'UTF-8'``, the :term:`locale encoding` and the *do_setlocale* + argument are ignored. + + The :ref:`Python preinitialization ` configures the LC_CTYPE + locale. See also the :term:`filesystem encoding and error handler`. .. versionchanged:: 3.7 - The function now always returns ``UTF-8`` on Android or if the UTF-8 mode - is enabled. + The function now always returns ``UTF-8`` on Android or if the + :ref:`Python UTF-8 Mode ` is enabled. .. function:: normalize(localename) @@ -423,10 +427,18 @@ The :mod:`locale` module defines the following exception and functions: .. versionadded:: 3.5 -.. function:: atof(string, func=float) +.. function:: localize(string, grouping=False, monetary=False) + + Converts a normalized number string into a formatted string following the + :const:`LC_NUMERIC` settings. + + .. versionadded:: 3.10 + + +.. function:: atof(string) - Converts a string to a number, following the :const:`LC_NUMERIC` settings, - by calling *func* on the result of calling :func:`delocalize` on *string*. + Converts a string to a floating point number, following the :const:`LC_NUMERIC` + settings. .. function:: atoi(string) @@ -508,7 +520,7 @@ Background, details, hints, tips and caveats -------------------------------------------- The C standard defines the locale as a program-wide property that may be -relatively expensive to change. On top of that, some implementation are broken +relatively expensive to change. On top of that, some implementations are broken in such a way that frequent locale changes may cause core dumps. This makes the locale somewhat painful to use correctly. diff --git a/Doc/library/logging.config.rst b/Doc/library/logging.config.rst index afc32e64..5a3e6868 100644 --- a/Doc/library/logging.config.rst +++ b/Doc/library/logging.config.rst @@ -77,7 +77,7 @@ in :mod:`logging` itself) and defining handlers which are declared either in .. versionadded:: 3.2 -.. function:: fileConfig(fname, defaults=None, disable_existing_loggers=True) +.. function:: fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=None) Reads the logging configuration from a :mod:`configparser`\-format file. The format of the file should be as described in @@ -111,6 +111,8 @@ in :mod:`logging` itself) and defining handlers which are declared either in they or their ancestors are explicitly named in the logging configuration. + :param encoding: The encoding used to open file when *fname* is filename. + .. versionchanged:: 3.4 An instance of a subclass of :class:`~configparser.RawConfigParser` is now accepted as a value for ``fname``. This facilitates: @@ -121,6 +123,9 @@ in :mod:`logging` itself) and defining handlers which are declared either in application (e.g. based on command-line parameters or other aspects of the runtime environment) before being passed to ``fileConfig``. + .. versionadded:: 3.10 + The *encoding* parameter is added. + .. function:: listen(port=DEFAULT_LOGGING_CONFIG_PORT, verify=None) Starts up a socket server on the specified port, and listens for new @@ -186,20 +191,6 @@ in :mod:`logging` itself) and defining handlers which are declared either in :func:`listen`. -Security considerations -^^^^^^^^^^^^^^^^^^^^^^^ - -The logging configuration functionality tries to offer convenience, and in part this -is done by offering the ability to convert text in configuration files into Python -objects used in logging configuration - for example, as described in -:ref:`logging-config-dict-userdef`. However, these same mechanisms (importing -callables from user-defined modules and calling them with parameters from the -configuration) could be used to invoke any code you like, and for this reason you -should treat configuration files from untrusted sources with *extreme caution* and -satisfy yourself that nothing bad can happen if you load them, before actually loading -them. - - .. _logging-config-dictschema: Configuration dictionary schema @@ -234,18 +225,29 @@ custom instantiation is required. If so, the mechanism described in :ref:`logging-config-dict-userdef` below is used to create an instance; otherwise, the context is used to determine what to instantiate. +.. _logging-config-dictschema-formatters: + * *formatters* - the corresponding value will be a dict in which each key is a formatter id and each value is a dict describing how to configure the corresponding :class:`~logging.Formatter` instance. - The configuring dict is searched for keys ``format`` and ``datefmt`` - (with defaults of ``None``) and these are used to construct a - :class:`~logging.Formatter` instance. + The configuring dict is searched for the following optional keys + which correspond to the arguments passed to create a + :class:`~logging.Formatter` object: + + * ``format`` + * ``datefmt`` + * ``style`` + * ``validate`` (since version >=3.8) - .. versionchanged:: 3.8 - a ``validate`` key (with default of ``True``) can be added into - the ``formatters`` section of the configuring dict, this is to - validate the format. + An optional ``class`` key indicates the name of the formatter's + class (as a dotted module and class name). The instantiation + arguments are as for :class:`~logging.Formatter`, thus this key is + most useful for instantiating a customised subclass of + :class:`~logging.Formatter`. For example, the alternative class + might present exception tracebacks in an expanded or condensed + format. If your formatter requires different or extra configuration + keys, you should use :ref:`logging-config-dict-userdef`. * *filters* - the corresponding value will be a dict in which each key is a filter id and each value is a dict describing how to configure @@ -593,7 +595,7 @@ in the configuration, the string ``'cfg://handlers'`` would resolve to the dict with key ``handlers``, the string ``'cfg://handlers.email`` would resolve to the dict with key ``email`` in the ``handlers`` dict, and so on. The string ``'cfg://handlers.email.toaddrs[1]`` would -resolve to ``'dev_team.domain.tld'`` and the string +resolve to ``'dev_team@domain.tld'`` and the string ``'cfg://handlers.email.toaddrs[0]'`` would resolve to the value ``'support_team@domain.tld'``. The ``subject`` value could be accessed using either ``'cfg://handlers.email.subject'`` or, equivalently, @@ -807,20 +809,13 @@ Sections which specify formatter configuration are typified by the following. [formatter_form01] format=F1 %(asctime)s %(levelname)s %(message)s datefmt= + style='%' + validate=True class=logging.Formatter -The ``format`` entry is the overall format string, and the ``datefmt`` entry is -the :func:`strftime`\ -compatible date/time format string. If empty, the -package substitutes something which is almost equivalent to specifying the date -format string ``'%Y-%m-%d %H:%M:%S'``. This format also specifies milliseconds, -which are appended to the result of using the above format string, with a comma -separator. An example time in this format is ``2003-01-23 00:29:50,411``. - -The ``class`` entry is optional. It indicates the name of the formatter's class -(as a dotted module and class name.) This option is useful for instantiating a -:class:`~logging.Formatter` subclass. Subclasses of -:class:`~logging.Formatter` can present exception tracebacks in an expanded or -condensed format. +The arguments for the formatter configuration are the same as the keys +in the dictionary schema :ref:`formatters section +`. .. note:: diff --git a/Doc/library/logging.handlers.rst b/Doc/library/logging.handlers.rst index f16bf328..73c542ba 100644 --- a/Doc/library/logging.handlers.rst +++ b/Doc/library/logging.handlers.rst @@ -231,19 +231,6 @@ need to override. return the same output every time for a given input, otherwise the rollover behaviour may not work as expected. - It's also worth noting that care should be taken when using a namer to - preserve certain attributes in the filename which are used during rotation. - For example, :class:`RotatingFileHandler` expects to have a set of log files - whose names contain successive integers, so that rotation works as expected, - and :class:`TimedRotatingFileHandler` deletes old log files (based on the - ``backupCount`` parameter passed to the handler's initializer) by determining - the oldest files to delete. For this to happen, the filenames should be - sortable using the date/time portion of the filename, and a namer needs to - respect this. (If a namer is wanted that doesn't respect this scheme, it will - need to be used in a subclass of :class:`TimedRotatingFileHandler` which - overrides the :meth:`~TimedRotatingFileHandler.getFilesToDelete` method to - fit in with the custom naming scheme.) - .. versionadded:: 3.3 @@ -453,10 +440,6 @@ timed intervals. Outputs the record to the file, catering for rollover as described above. - .. method:: getFilesToDelete() - - Returns a list of filenames which should be deleted as part of rollover. These - are the absolute paths of the oldest backup log files written by the handler. .. _socket-handler: @@ -944,7 +927,7 @@ HTTPHandler ^^^^^^^^^^^ The :class:`HTTPHandler` class, located in the :mod:`logging.handlers` module, -supports sending logging messages to a Web server, using either ``GET`` or +supports sending logging messages to a web server, using either ``GET`` or ``POST`` semantics. @@ -974,17 +957,17 @@ supports sending logging messages to a Web server, using either ``GET`` or .. method:: emit(record) - Sends the record to the Web server as a URL-encoded dictionary. The + Sends the record to the web server as a URL-encoded dictionary. The :meth:`mapLogRecord` method is used to convert the record to the dictionary to be sent. - .. note:: Since preparing a record for sending it to a Web server is not + .. note:: Since preparing a record for sending it to a web server is not the same as a generic formatting operation, using :meth:`~logging.Handler.setFormatter` to specify a :class:`~logging.Formatter` for a :class:`HTTPHandler` has no effect. Instead of calling :meth:`~logging.Handler.format`, this handler calls :meth:`mapLogRecord` and then :func:`urllib.parse.urlencode` to encode the - dictionary in a form suitable for sending to a Web server. + dictionary in a form suitable for sending to a web server. .. _queue-handler: @@ -1001,7 +984,7 @@ supports sending logging messages to a queue, such as those implemented in the Along with the :class:`QueueListener` class, :class:`QueueHandler` can be used to let handlers do their work on a separate thread from the one which does the -logging. This is important in Web applications and also other service +logging. This is important in web applications and also other service applications where threads servicing clients need to respond as quickly as possible, while any potentially slow operations (such as sending an email via :class:`SMTPHandler`) are done on a separate thread. @@ -1063,7 +1046,7 @@ because it works hand-in-hand with :class:`QueueHandler`. Along with the :class:`QueueHandler` class, :class:`QueueListener` can be used to let handlers do their work on a separate thread from the one which does the -logging. This is important in Web applications and also other service +logging. This is important in web applications and also other service applications where threads servicing clients need to respond as quickly as possible, while any potentially slow operations (such as sending an email via :class:`SMTPHandler`) are done on a separate thread. diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst index f85c691f..9de115a9 100644 --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -80,15 +80,6 @@ is the module's name in the Python package namespace. If this evaluates to false, logging messages are not passed to the handlers of ancestor loggers. - Spelling it out with an example: If the propagate attribute of the logger named - ``A.B.C`` evaluates to true, any event logged to ``A.B.C`` via a method call such as - ``logging.getLogger('A.B.C').error(...)`` will [subject to passing that logger's - level and filter settings] be passed in turn to any handlers attached to loggers - named ``A.B``, ``A`` and the root logger, after first being passed to any handlers - attached to ``A.B.C``. If any logger in the chain ``A.B.C``, ``A.B``, ``A`` has its - ``propagate`` attribute set to false, then that is the last logger whose handlers - are offered the event to handle, and propagation stops at that point. - The constructor sets this attribute to ``True``. .. note:: If you attach a handler to a logger *and* one or more of its @@ -212,7 +203,7 @@ is the module's name in the Python package namespace. attributes can then be used as you like. For example, they could be incorporated into logged messages. For example:: - FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s' + FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s' logging.basicConfig(format=FORMAT) d = {'clientip': '192.168.0.1', 'user': 'fbloggs'} logger = logging.getLogger('tcpserver') @@ -538,7 +529,7 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on :ref:`logrecord-attributes`. -.. class:: Formatter(fmt=None, datefmt=None, style='%', validate=True) +.. class:: Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None) Returns a new instance of the :class:`Formatter` class. The instance is initialized with a format string for the message as a whole, as well as a @@ -554,6 +545,10 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on :ref:`formatting-styles` for more information on using {- and $-formatting for log messages. + The *defaults* parameter can be a dictionary with default values to use in + custom fields. For example: + ``logging.Formatter('%(ip)s %(message)s', defaults={"ip": None})`` + .. versionchanged:: 3.2 The *style* parameter was added. @@ -562,6 +557,9 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on will raise a ``ValueError``. For example: ``logging.Formatter('%(asctime)s - %(message)s', style='{')``. + .. versionchanged:: 3.10 + The *defaults* parameter was added. + .. method:: format(record) The record's attribute dictionary is used as the operand to a string @@ -576,9 +574,9 @@ The useful mapping keys in a :class:`LogRecord` are given in the section on pickled and sent across the wire, but you should be careful if you have more than one :class:`Formatter` subclass which customizes the formatting of exception information. In this case, you will have to clear the cached - value after a formatter has done its formatting, so that the next - formatter to handle the event doesn't use the cached value but - recalculates it afresh. + value (by setting the *exc_text* attribute to ``None``) after a formatter + has done its formatting, so that the next formatter to handle the event + doesn't use the cached value, but recalculates it afresh. If stack information is available, it's appended after the exception information, using :meth:`formatStack` to transform it if necessary. @@ -1002,7 +1000,7 @@ functions. be used as you like. For example, they could be incorporated into logged messages. For example:: - FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s' + FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s' logging.basicConfig(format=FORMAT) d = {'clientip': '192.168.0.1', 'user': 'fbloggs'} logging.warning('Protocol problem: %s', 'connection reset', extra=d) @@ -1073,6 +1071,16 @@ functions. Logs a message with level *level* on the root logger. The other arguments are interpreted as for :func:`debug`. + .. note:: The above module-level convenience functions, which delegate to the + root logger, call :func:`basicConfig` to ensure that at least one handler + is available. Because of this, they should *not* be used in threads, + in versions of Python earlier than 2.7.1 and 3.2, unless at least one + handler has been added to the root logger *before* the threads are + started. In earlier versions of Python, due to a thread safety shortcoming + in :func:`basicConfig`, this can (under rare circumstances) lead to + handlers being added multiple times to the root logger, which can in turn + lead to multiple messages for the same event. + .. function:: disable(level=CRITICAL) Provides an overriding level *level* for all loggers which takes precedence over @@ -1170,9 +1178,9 @@ functions. +--------------+---------------------------------------------+ | Format | Description | +==============+=============================================+ - | *filename* | Specifies that a FileHandler be created, | - | | using the specified filename, rather than a | - | | StreamHandler. | + | *filename* | Specifies that a :class:`FileHandler` be | + | | created, using the specified filename, | + | | rather than a :class:`StreamHandler`. | +--------------+---------------------------------------------+ | *filemode* | If *filename* is specified, open the file | | | in this :ref:`mode `. Defaults | @@ -1198,9 +1206,10 @@ functions. | | :ref:`level `. | +--------------+---------------------------------------------+ | *stream* | Use the specified stream to initialize the | - | | StreamHandler. Note that this argument is | - | | incompatible with *filename* - if both | - | | are present, a ``ValueError`` is raised. | + | | :class:`StreamHandler`. Note that this | + | | argument is incompatible with *filename* - | + | | if both are present, a ``ValueError`` is | + | | raised. | +--------------+---------------------------------------------+ | *handlers* | If specified, this should be an iterable of | | | already created handlers to add to the root | @@ -1219,18 +1228,18 @@ functions. +--------------+---------------------------------------------+ | *encoding* | If this keyword argument is specified along | | | with *filename*, its value is used when the | - | | FileHandler is created, and thus used when | - | | opening the output file. | + | | :class:`FileHandler` is created, and thus | + | | used when opening the output file. | +--------------+---------------------------------------------+ | *errors* | If this keyword argument is specified along | | | with *filename*, its value is used when the | - | | FileHandler is created, and thus used when | - | | opening the output file. If not specified, | - | | the value 'backslashreplace' is used. Note | - | | that if ``None`` is specified, it will be | - | | passed as such to func:`open`, which means | - | | that it will be treated the same as passing | - | | 'errors'. | + | | :class:`FileHandler` is created, and thus | + | | used when opening the output file. If not | + | | specified, the value 'backslashreplace' is | + | | used. Note that if ``None`` is specified, | + | | it will be passed as such to :func:`open`, | + | | which means that it will be treated the | + | | same as passing 'errors'. | +--------------+---------------------------------------------+ .. versionchanged:: 3.2 diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst index 633c8787..21092645 100644 --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -19,8 +19,8 @@ interface supporting the ``.xz`` and legacy ``.lzma`` file formats used by the :program:`xz` utility, as well as raw compressed streams. The interface provided by this module is very similar to that of the :mod:`bz2` -module. However, note that :class:`LZMAFile` is *not* thread-safe, unlike -:class:`bz2.BZ2File`, so if you need to use a single :class:`LZMAFile` instance +module. Note that :class:`LZMAFile` and :class:`bz2.BZ2File` are *not* +thread-safe, so if you need to use a single :class:`LZMAFile` instance from multiple threads, it is necessary to protect it with a lock. diff --git a/Doc/library/mailcap.rst b/Doc/library/mailcap.rst index 7aa3380f..7749b7dd 100644 --- a/Doc/library/mailcap.rst +++ b/Doc/library/mailcap.rst @@ -3,28 +3,22 @@ .. module:: mailcap :synopsis: Mailcap file handling. - :deprecated: **Source code:** :source:`Lib/mailcap.py` -.. deprecated:: 3.11 - The :mod:`mailcap` module is deprecated - (see :pep:`PEP 594 <594#mailcap>` for details). - The :mod:`mimetypes` module provides an alternative. - -------------- Mailcap files are used to configure how MIME-aware applications such as mail -readers and Web browsers react to files with different MIME types. (The name +readers and web browsers react to files with different MIME types. (The name "mailcap" is derived from the phrase "mail capability".) For example, a mailcap file might contain a line like ``video/mpeg; xmpeg %s``. Then, if the user -encounters an email message or Web document with the MIME type +encounters an email message or web document with the MIME type :mimetype:`video/mpeg`, ``%s`` will be replaced by a filename (usually one belonging to a temporary file) and the :program:`xmpeg` program can be automatically started to view the file. The mailcap format is documented in :rfc:`1524`, "A User Agent Configuration -Mechanism For Multimedia Mail Format Information", but is not an Internet +Mechanism For Multimedia Mail Format Information", but is not an internet standard. However, mailcap files are supported on most Unix systems. @@ -60,18 +54,6 @@ standard. However, mailcap files are supported on most Unix systems. use) to determine whether or not the mailcap line applies. :func:`findmatch` will automatically check such conditions and skip the entry if the check fails. - .. versionchanged:: 3.11 - - To prevent security issues with shell metacharacters (symbols that have - special effects in a shell command line), ``findmatch`` will refuse - to inject ASCII characters other than alphanumerics and ``@+=:,./-_`` - into the returned command line. - - If a disallowed character appears in *filename*, ``findmatch`` will always - return ``(None, None)`` as if no entry was found. - If such a character appears elsewhere (a value in *plist* or in *MIMEtype*), - ``findmatch`` will ignore all mailcap entries which use that value. - A :mod:`warning ` will be raised in either case. .. function:: getcaps() diff --git a/Doc/library/marshal.rst b/Doc/library/marshal.rst index b38ba54b..24f9dc16 100644 --- a/Doc/library/marshal.rst +++ b/Doc/library/marshal.rst @@ -83,7 +83,7 @@ The module defines these functions: If an object containing an unsupported type was marshalled with :func:`dump`, :func:`load` will substitute ``None`` for the unmarshallable type. - .. versionchanged:: 3.9.7 + .. versionchanged:: 3.10 This call used to raise a ``code.__new__`` audit event for each code object. Now it raises a single ``marshal.load`` event for the entire load operation. @@ -109,7 +109,7 @@ The module defines these functions: .. audit-event:: marshal.loads bytes marshal.load - .. versionchanged:: 3.9.7 + .. versionchanged:: 3.10 This call used to raise a ``code.__new__`` audit event for each code object. Now it raises a single ``marshal.loads`` event for the entire load operation. diff --git a/Doc/library/math.rst b/Doc/library/math.rst index ad9116b6..145bac49 100644 --- a/Doc/library/math.rst +++ b/Doc/library/math.rst @@ -32,8 +32,8 @@ Number-theoretic and representation functions .. function:: ceil(x) Return the ceiling of *x*, the smallest integer greater than or equal to *x*. - If *x* is not a float, delegates to :meth:`x.__ceil__ `, - which should return an :class:`~numbers.Integral` value. + If *x* is not a float, delegates to ``x.__ceil__()``, which should return an + :class:`~numbers.Integral` value. .. function:: comb(n, k) @@ -77,9 +77,9 @@ Number-theoretic and representation functions .. function:: floor(x) - Return the floor of *x*, the largest integer less than or equal to *x*. If - *x* is not a float, delegates to :meth:`x.__floor__ `, which - should return an :class:`~numbers.Integral` value. + Return the floor of *x*, the largest integer less than or equal to *x*. + If *x* is not a float, delegates to ``x.__floor__()``, which should return an + :class:`~numbers.Integral` value. .. function:: fmod(x, y) @@ -298,11 +298,9 @@ Number-theoretic and representation functions .. function:: trunc(x) - Return *x* with the fractional part - removed, leaving the integer part. This rounds toward 0: ``trunc()`` is - equivalent to :func:`floor` for positive *x*, and equivalent to :func:`ceil` - for negative *x*. If *x* is not a float, delegates to :meth:`x.__trunc__ - `, which should return an :class:`~numbers.Integral` value. + Return the :class:`~numbers.Real` value *x* truncated to an + :class:`~numbers.Integral` (usually an integer). Delegates to + :meth:`x.__trunc__() `. .. function:: ulp(x) @@ -483,6 +481,11 @@ Trigonometric functions Added support for n-dimensional points. Formerly, only the two dimensional case was supported. + .. versionchanged:: 3.10 + Improved the algorithm's accuracy so that the maximum error is + under 1 ulp (unit in the last place). More typically, the result + is almost always correctly rounded to within 1/2 ulp. + .. function:: sin(x) @@ -624,23 +627,8 @@ Constants .. data:: nan - A floating-point "not a number" (NaN) value. Equivalent to the output of - ``float('nan')``. Due to the requirements of the `IEEE-754 standard - `_, ``math.nan`` and ``float('nan')`` are - not considered to equal to any other numeric value, including themselves. To check - whether a number is a NaN, use the :func:`isnan` function to test - for NaNs instead of ``is`` or ``==``. - Example:: - - >>> import math - >>> math.nan == math.nan - False - >>> float('nan') == float('nan') - False - >>> math.isnan(math.nan) - True - >>> math.isnan(float('nan')) - True + A floating-point "not a number" (NaN) value. Equivalent to the output of + ``float('nan')``. .. versionadded:: 3.5 diff --git a/Doc/library/misc.rst b/Doc/library/misc.rst deleted file mode 100644 index 09432352..00000000 --- a/Doc/library/misc.rst +++ /dev/null @@ -1,13 +0,0 @@ -.. _misc: - -********************** -Miscellaneous Services -********************** - -The modules described in this chapter provide miscellaneous services that are -available in all Python versions. Here's an overview: - - -.. toctree:: - - formatter.rst diff --git a/Doc/library/mm.rst b/Doc/library/mm.rst index cd06e938..c8f79c4d 100644 --- a/Doc/library/mm.rst +++ b/Doc/library/mm.rst @@ -11,5 +11,12 @@ discretion of the installation. Here's an overview: .. toctree:: + audioop.rst + aifc.rst + sunau.rst wave.rst + chunk.rst colorsys.rst + imghdr.rst + sndhdr.rst + ossaudiodev.rst diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst index 959f81fe..da174753 100644 --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -81,7 +81,9 @@ To map anonymous memory, -1 should be passed as the fileno along with the length private copy-on-write mapping, so changes to the contents of the mmap object will be private to this process, and :const:`MAP_SHARED` creates a mapping that's shared with all other processes mapping the same areas of - the file. The default value is :const:`MAP_SHARED`. + the file. The default value is :const:`MAP_SHARED`. Some systems have + additional possible flags with the full list specified in + :ref:`MAP_* constants `. *prot*, if specified, gives the desired memory protection; the two most useful values are :const:`PROT_READ` and :const:`PROT_WRITE`, to specify @@ -335,6 +337,8 @@ MADV_* Constants MADV_NOCORE MADV_CORE MADV_PROTECT + MADV_FREE_REUSABLE + MADV_FREE_REUSE These options can be passed to :meth:`mmap.madvise`. Not every option will be present on every system. @@ -342,3 +346,21 @@ MADV_* Constants Availability: Systems with the madvise() system call. .. versionadded:: 3.8 + +.. _map-constants: + +MAP_* Constants ++++++++++++++++ + +.. data:: MAP_SHARED + MAP_PRIVATE + MAP_DENYWRITE + MAP_EXECUTABLE + MAP_ANON + MAP_ANONYMOUS + MAP_POPULATE + + These are the various flags that can be passed to :meth:`mmap.mmap`. Note that some options might not be present on some systems. + + .. versionchanged:: 3.10 + Added MAP_POPULATE constant. diff --git a/Doc/library/msilib.rst b/Doc/library/msilib.rst index 0eba2275..83b3d497 100644 --- a/Doc/library/msilib.rst +++ b/Doc/library/msilib.rst @@ -4,7 +4,6 @@ .. module:: msilib :platform: Windows :synopsis: Creation of Microsoft Installer files, and CAB files. - :deprecated: .. moduleauthor:: Martin v. Löwis .. sectionauthor:: Martin v. Löwis @@ -13,10 +12,6 @@ .. index:: single: msi -.. deprecated:: 3.11 - The :mod:`msilib` module is deprecated - (see :pep:`PEP 594 <594#msilib>` for details). - -------------- The :mod:`msilib` supports the creation of Microsoft Installer (``.msi``) files. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 1bde2ec2..7225b65d 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -569,15 +569,8 @@ The :mod:`multiprocessing` package mostly replicates the API of the .. attribute:: exitcode The child's exit code. This will be ``None`` if the process has not yet - terminated. - - If the child's :meth:`run` method returned normally, the exit code - will be 0. If it terminated via :func:`sys.exit` with an integer - argument *N*, the exit code will be *N*. - - If the child terminated due to an exception not caught within - :meth:`run`, the exit code will be 1. If it was terminated by - signal *N*, the exit code will be the negative value *-N*. + terminated. A negative value *-N* indicates that the child was terminated + by signal *N*. .. attribute:: authkey @@ -868,7 +861,7 @@ For an example of the usage of queues for interprocess communication see A better name for this method might be ``allow_exit_without_flush()``. It is likely to cause enqueued - data to lost, and you almost certainly will not need to use it. + data to be lost, and you almost certainly will not need to use it. It is really only there if you need the current process to exit immediately without waiting to flush enqueued data to the underlying pipe, and you don't care about lost data. @@ -1047,9 +1040,9 @@ Miscellaneous .. versionadded:: 3.4 -.. function:: set_executable(executable) +.. function:: set_executable() - Set the path of the Python interpreter to use when starting a child process. + Sets the path of the Python interpreter to use when starting a child process. (By default :data:`sys.executable` is used). Embedders will probably need to do some thing like :: @@ -1648,7 +1641,6 @@ different machines. A manager object controls a server process which manages proxies. .. function:: multiprocessing.Manager() - :module: Returns a started :class:`~multiprocessing.managers.SyncManager` object which can be used for sharing objects between processes. The returned manager @@ -2161,7 +2153,7 @@ with the :class:`Pool` class. or by calling :meth:`close` and :meth:`terminate` manually. Failure to do this can lead to the process hanging on finalization. - Note that is **not correct** to rely on the garbage colletor to destroy the pool + Note that it is **not correct** to rely on the garbage collector to destroy the pool as CPython does not assure that the finalizer of the pool will be called (see :meth:`object.__del__` for more information). @@ -2258,9 +2250,8 @@ with the :class:`Pool` class. .. method:: starmap(func, iterable[, chunksize]) - Like :meth:`~multiprocessing.pool.Pool.map` except that the - elements of the *iterable* are expected to be iterables that are - unpacked as arguments. + Like :meth:`map` except that the elements of the *iterable* are expected + to be iterables that are unpacked as arguments. Hence an *iterable* of ``[(1,2), (3, 4)]`` results in ``[func(1,2), func(3,4)]``. @@ -2644,13 +2635,12 @@ handler type) for messages from different processes to get mixed up. inherited. .. currentmodule:: multiprocessing -.. function:: log_to_stderr(level=None) +.. function:: log_to_stderr() This function performs a call to :func:`get_logger` but in addition to returning the logger created by get_logger, it adds a handler which sends output to :data:`sys.stderr` using format ``'[%(levelname)s/%(processName)s] %(message)s'``. - You can modify ``levelname`` of the logger by passing a ``level`` argument. Below is an example session with logging turned on:: diff --git a/Doc/library/netdata.rst b/Doc/library/netdata.rst index 2520036c..e76280f2 100644 --- a/Doc/library/netdata.rst +++ b/Doc/library/netdata.rst @@ -6,16 +6,18 @@ Internet Data Handling ********************** This chapter describes modules which support handling data formats commonly used -on the Internet. +on the internet. .. toctree:: email.rst json.rst + mailcap.rst mailbox.rst mimetypes.rst base64.rst binhex.rst binascii.rst quopri.rst + uu.rst diff --git a/Doc/library/netrc.rst b/Doc/library/netrc.rst index 3d29ac49..4bf7de67 100644 --- a/Doc/library/netrc.rst +++ b/Doc/library/netrc.rst @@ -38,6 +38,10 @@ the Unix :program:`ftp` program and other FTP clients. :func:`os.path.expanduser` is used to find the location of the :file:`.netrc` file when *file* is not passed as argument. + .. versionchanged:: 3.10 + :class:`netrc` try UTF-8 encoding before using locale specific + encoding. + .. exception:: NetrcParseError diff --git a/Doc/library/nis.rst b/Doc/library/nis.rst index 49fe6295..10c67cbb 100644 --- a/Doc/library/nis.rst +++ b/Doc/library/nis.rst @@ -5,15 +5,10 @@ .. module:: nis :platform: Unix :synopsis: Interface to Sun's NIS (Yellow Pages) library. - :deprecated: .. moduleauthor:: Fred Gansevles .. sectionauthor:: Moshe Zadka -.. deprecated:: 3.11 - The :mod:`nis` module is deprecated - (see :pep:`PEP 594 <594#nis>` for details). - -------------- The :mod:`nis` module gives a thin wrapper around the NIS library, useful for diff --git a/Doc/library/nntplib.rst b/Doc/library/nntplib.rst index 2a996e45..e7ec9047 100644 --- a/Doc/library/nntplib.rst +++ b/Doc/library/nntplib.rst @@ -3,7 +3,6 @@ .. module:: nntplib :synopsis: NNTP protocol client (requires sockets). - :deprecated: **Source code:** :source:`Lib/nntplib.py` @@ -11,9 +10,6 @@ pair: NNTP; protocol single: Network News Transfer Protocol -.. deprecated:: 3.11 - The :mod:`nntplib` module is deprecated (see :pep:`594` for details). - -------------- This module defines the class :class:`NNTP` which implements the client side of diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst index f2fb084a..0cdba68f 100644 --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -112,6 +112,10 @@ The mathematical and bitwise operations are the most numerous: Return *a* converted to an integer. Equivalent to ``a.__index__()``. + .. versionchanged:: 3.10 + The result always has exact type :class:`int`. Previously, the result + could have been an instance of a subclass of ``int``. + .. function:: inv(obj) invert(obj) diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index 0d686b10..b1094198 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -131,7 +131,7 @@ option These option syntaxes are not supported by :mod:`optparse`, and they never will be. This is deliberate: the first three are non-standard on any environment, and the last only makes sense if you're exclusively targeting - Windows or certain legacy platforms (e.g. VMS, MS-DOS). + VMS, MS-DOS, and/or Windows. option argument an argument that follows an option, is closely associated with that option, diff --git a/Doc/library/os.path.rst b/Doc/library/os.path.rst index 97bb684a..a66b3c5a 100644 --- a/Doc/library/os.path.rst +++ b/Doc/library/os.path.rst @@ -5,16 +5,22 @@ :synopsis: Operations on pathnames. **Source code:** :source:`Lib/posixpath.py` (for POSIX) and -:source:`Lib/ntpath.py` (for Windows). +:source:`Lib/ntpath.py` (for Windows NT). .. index:: single: path; operations -------------- -This module implements some useful functions on pathnames. To read or write -files see :func:`open`, and for accessing the filesystem see the :mod:`os` -module. The path parameters can be passed as strings, or bytes, or any object -implementing the :class:`os.PathLike` protocol. +This module implements some useful functions on pathnames. To read or +write files see :func:`open`, and for accessing the filesystem see the +:mod:`os` module. The path parameters can be passed as either strings, +or bytes. Applications are encouraged to represent file names as +(Unicode) character strings. Unfortunately, some file names may not be +representable as strings on Unix, so applications that need to support +arbitrary file names on Unix should use bytes objects to represent +path names. Vice versa, using bytes objects cannot represent all file +names on Windows (in the standard ``mbcs`` encoding), hence Windows +applications should use string objects to access all files. Unlike a unix shell, Python does not do any *automatic* path expansions. Functions such as :func:`expanduser` and :func:`expandvars` can be invoked @@ -32,6 +38,7 @@ the :mod:`glob` module.) their parameters. The result is an object of the same type, if a path or file name is returned. + .. note:: Since different operating systems have different path name conventions, there @@ -168,8 +175,8 @@ the :mod:`glob` module.) On Windows, :envvar:`USERPROFILE` will be used if set, otherwise a combination of :envvar:`HOMEPATH` and :envvar:`HOMEDRIVE` will be used. An initial - ``~user`` is handled by stripping the last directory component from the created - user path derived above. + ``~user`` is handled by checking that the last directory component of the current + user's home directory matches :envvar:`USERNAME`, and replacing it if so. If the expansion fails or if the path does not begin with a tilde, the path is returned unchanged. @@ -345,15 +352,24 @@ the :mod:`glob` module.) Accepts a :term:`path-like object`. -.. function:: realpath(path) +.. function:: realpath(path, *, strict=False) Return the canonical path of the specified filename, eliminating any symbolic links encountered in the path (if they are supported by the operating system). + If a path doesn't exist or a symlink loop is encountered, and *strict* is + ``True``, :exc:`OSError` is raised. If *strict* is ``False``, the path is + resolved as far as possible and any remainder is appended without checking + whether it exists. + .. note:: - When symbolic link cycles occur, the returned path will be one member of - the cycle, but no guarantee is made about which member that will be. + This function emulates the operating system's procedure for making a path + canonical, which differs slightly between Windows and UNIX with respect + to how links and subsequent path components interact. + + Operating system APIs make paths canonical as needed, so it's not + normally necessary to call this function. .. versionchanged:: 3.6 Accepts a :term:`path-like object`. @@ -361,6 +377,9 @@ the :mod:`glob` module.) .. versionchanged:: 3.8 Symbolic links and junctions are now resolved on Windows. + .. versionchanged:: 3.10 + The *strict* parameter was added. + .. function:: relpath(path, start=os.curdir) @@ -482,16 +501,11 @@ the :mod:`glob` module.) >>> splitext('foo.bar.exe') ('foo.bar', '.exe') - >>> splitext('/foo/bar.exe') - ('/foo/bar', '.exe') - Leading periods of the last component of the path are considered to - be part of the root:: + Leading periods on the basename are ignored:: >>> splitext('.cshrc') ('.cshrc', '') - >>> splitext('/foo/....jpg') - ('/foo/....jpg', '') .. versionchanged:: 3.6 Accepts a :term:`path-like object`. diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 35a7e1e9..237ca4b4 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -32,7 +32,7 @@ Notes on the availability of these functions: objects, and result in an object of the same type, if a path or file name is returned. -* On VxWorks, os.fork, os.execv and os.spawn*p* are not supported. +* On VxWorks, os.popen, os.fork, os.execv and os.spawn*p* are not supported. .. note:: @@ -68,8 +68,13 @@ File Names, Command Line Arguments, and Environment Variables In Python, file names, command line arguments, and environment variables are represented using the string type. On some systems, decoding these strings to and from bytes is necessary before passing them to the operating system. Python -uses the file system encoding to perform this conversion (see -:func:`sys.getfilesystemencoding`). +uses the :term:`filesystem encoding and error handler` to perform this +conversion (see :func:`sys.getfilesystemencoding`). + +The :term:`filesystem encoding and error handler` are configured at Python +startup by the :c:func:`PyConfig_Read` function: see +:c:member:`~PyConfig.filesystem_encoding` and +:c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. .. versionchanged:: 3.1 On some systems, conversion using the file system encoding may fail. In this @@ -79,9 +84,72 @@ uses the file system encoding to perform this conversion (see original byte on encoding. -The file system encoding must guarantee to successfully decode all bytes -below 128. If the file system encoding fails to provide this guarantee, API -functions may raise UnicodeErrors. +The :term:`file system encoding ` must +guarantee to successfully decode all bytes below 128. If the file system +encoding fails to provide this guarantee, API functions can raise +:exc:`UnicodeError`. + +See also the :term:`locale encoding`. + + +.. _utf8-mode: + +Python UTF-8 Mode +----------------- + +.. versionadded:: 3.7 + See :pep:`540` for more details. + +The Python UTF-8 Mode ignores the :term:`locale encoding` and forces the usage +of the UTF-8 encoding: + +* Use UTF-8 as the :term:`filesystem encoding `. +* :func:`sys.getfilesystemencoding()` returns ``'UTF-8'``. +* :func:`locale.getpreferredencoding()` returns ``'UTF-8'`` (the *do_setlocale* + argument has no effect). +* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` all use + UTF-8 as their text encoding, with the ``surrogateescape`` + :ref:`error handler ` being enabled for :data:`sys.stdin` + and :data:`sys.stdout` (:data:`sys.stderr` continues to use + ``backslashreplace`` as it does in the default locale-aware mode) +* On Unix, :func:`os.device_encoding` returns ``'UTF-8'``. rather than the + device encoding. + +Note that the standard stream settings in UTF-8 mode can be overridden by +:envvar:`PYTHONIOENCODING` (just as they can be in the default locale-aware +mode). + +As a consequence of the changes in those lower level APIs, other higher +level APIs also exhibit different default behaviours: + +* Command line arguments, environment variables and filenames are decoded + to text using the UTF-8 encoding. +* :func:`os.fsdecode()` and :func:`os.fsencode()` use the UTF-8 encoding. +* :func:`open()`, :func:`io.open()`, and :func:`codecs.open()` use the UTF-8 + encoding by default. However, they still use the strict error handler by + default so that attempting to open a binary file in text mode is likely + to raise an exception rather than producing nonsense data. + +The :ref:`Python UTF-8 Mode ` is enabled if the LC_CTYPE locale is +``C`` or ``POSIX`` at Python startup (see the :c:func:`PyConfig_Read` +function). + +It can be enabled or disabled using the :option:`-X utf8 <-X>` command line +option and the :envvar:`PYTHONUTF8` environment variable. + +If the :envvar:`PYTHONUTF8` environment variable is not set at all, then the +interpreter defaults to using the current locale settings, *unless* the current +locale is identified as a legacy ASCII-based locale (as described for +:envvar:`PYTHONCOERCECLOCALE`), and locale coercion is either disabled or +fails. In such legacy locales, the interpreter will default to enabling UTF-8 +mode unless explicitly instructed not to do so. + +The Python UTF-8 Mode can only be enabled at the Python startup. Its value +can be read from :data:`sys.flags.utf8_mode `. + +See also the :ref:`UTF-8 mode on Windows ` +and the :term:`filesystem encoding and error handler`. .. _os-procinfo: @@ -102,15 +170,14 @@ process and user. .. data:: environ - A :term:`mapping` object where keys and values are strings that represent - the process environment. For example, ``environ['HOME']`` is the pathname - of your home directory (on some platforms), and is equivalent to - ``getenv("HOME")`` in C. + A :term:`mapping` object representing the string environment. For example, + ``environ['HOME']`` is the pathname of your home directory (on some platforms), + and is equivalent to ``getenv("HOME")`` in C. This mapping is captured the first time the :mod:`os` module is imported, typically during Python startup as part of processing :file:`site.py`. Changes - to the environment made after this time are not reflected in :data:`os.environ`, - except for changes made by modifying :data:`os.environ` directly. + to the environment made after this time are not reflected in ``os.environ``, + except for changes made by modifying ``os.environ`` directly. This mapping may be used to modify the environment as well as query the environment. :func:`putenv` will be called automatically when the mapping @@ -122,8 +189,8 @@ process and user. .. note:: - Calling :func:`putenv` directly does not change :data:`os.environ`, so it's better - to modify :data:`os.environ`. + Calling :func:`putenv` directly does not change ``os.environ``, so it's better + to modify ``os.environ``. .. note:: @@ -133,7 +200,7 @@ process and user. You can delete items in this mapping to unset environment variables. :func:`unsetenv` will be called automatically when an item is deleted from - :data:`os.environ`, and when one of the :meth:`pop` or :meth:`clear` methods is + ``os.environ``, and when one of the :meth:`pop` or :meth:`clear` methods is called. .. versionchanged:: 3.9 @@ -142,10 +209,10 @@ process and user. .. data:: environb - Bytes version of :data:`environ`: a :term:`mapping` object where both keys - and values are :class:`bytes` objects representing the process environment. - :data:`environ` and :data:`environb` are synchronized (modifying - :data:`environb` updates :data:`environ`, and vice versa). + Bytes version of :data:`environ`: a :term:`mapping` object representing the + environment as byte strings. :data:`environ` and :data:`environb` are + synchronized (modify :data:`environb` updates :data:`environ`, and vice + versa). :data:`environb` is only available if :data:`supports_bytes_environ` is ``True``. @@ -166,9 +233,9 @@ process and user. .. function:: fsencode(filename) - Encode :term:`path-like ` *filename* to the filesystem - encoding with ``'surrogateescape'`` error handler, or ``'strict'`` on - Windows; return :class:`bytes` unchanged. + Encode :term:`path-like ` *filename* to the + :term:`filesystem encoding and error handler`; return :class:`bytes` + unchanged. :func:`fsdecode` is the reverse function. @@ -182,8 +249,8 @@ process and user. .. function:: fsdecode(filename) Decode the :term:`path-like ` *filename* from the - filesystem encoding with ``'surrogateescape'`` error handler, or ``'strict'`` - on Windows; return :class:`str` unchanged. + :term:`filesystem encoding and error handler`; return :class:`str` + unchanged. :func:`fsencode` is the reverse function. @@ -224,10 +291,7 @@ process and user. .. function:: getenv(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are str. Note that - since :func:`getenv` uses :data:`os.environ`, the mapping of :func:`getenv` is - similarly also captured on import, and the function may not reflect - future environment changes. + *default* if it doesn't. *key*, *default* and the result are str. On Unix, keys and values are decoded with :func:`sys.getfilesystemencoding` and ``'surrogateescape'`` error handler. Use :func:`os.getenvb` if you @@ -239,11 +303,7 @@ process and user. .. function:: getenvb(key, default=None) Return the value of the environment variable *key* if it exists, or - *default* if it doesn't. *key*, *default* and the result are bytes. Note that - since :func:`getenvb` uses :data:`os.environb`, the mapping of :func:`getenvb` is - similarly also captured on import, and the function may not reflect - future environment changes. - + *default* if it doesn't. *key*, *default* and the result are bytes. :func:`getenvb` is only available if :data:`supports_bytes_environ` is ``True``. @@ -294,8 +354,7 @@ process and user. Return list of group ids that *user* belongs to. If *group* is not in the list, it is included; typically, *group* is specified as the group ID - field from the password record for *user*, because that group ID will - otherwise be potentially omitted. + field from the password record for *user*. .. availability:: Unix. @@ -450,11 +509,10 @@ process and user. changes to the environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Assignments to items in :data:`os.environ` are automatically translated into + Assignments to items in ``os.environ`` are automatically translated into corresponding calls to :func:`putenv`; however, calls to :func:`putenv` - don't update :data:`os.environ`, so it is actually preferable to assign to items - of :data:`os.environ`. This also applies to :func:`getenv` and :func:`getenvb`, which - respectively use :data:`os.environ` and :data:`os.environb` in their implementations. + don't update ``os.environ``, so it is actually preferable to assign to items + of ``os.environ``. .. note:: @@ -653,10 +711,10 @@ process and user. environment affect subprocesses started with :func:`os.system`, :func:`popen` or :func:`fork` and :func:`execv`. - Deletion of items in :data:`os.environ` is automatically translated into a + Deletion of items in ``os.environ`` is automatically translated into a corresponding call to :func:`unsetenv`; however, calls to :func:`unsetenv` - don't update :data:`os.environ`, so it is actually preferable to delete items of - :data:`os.environ`. + don't update ``os.environ``, so it is actually preferable to delete items of + ``os.environ``. .. audit-event:: os.unsetenv key os.unsetenv @@ -752,6 +810,12 @@ as internal buffering of data. Return a string describing the encoding of the device associated with *fd* if it is connected to a terminal; else return :const:`None`. + On Unix, if the :ref:`Python UTF-8 Mode ` is enabled, return + ``'UTF-8'`` rather than the device encoding. + + .. versionchanged:: 3.10 + On Unix, the function now implements the Python UTF-8 Mode. + .. function:: dup(fd) @@ -1026,6 +1090,16 @@ or `the MSDN `_ on Windo The above constants are only available on Windows. +.. data:: O_EVTONLY + O_FSYNC + O_SYMLINK + O_NOFOLLOW_ANY + + The above constants are only available on macOS. + + .. versionchanged:: 3.10 + Add :data:`O_EVTONLY`, :data:`O_FSYNC`, :data:`O_SYMLINK` + and :data:`O_NOFOLLOW_ANY` constants. .. data:: O_ASYNC O_DIRECT @@ -1221,6 +1295,7 @@ or `the MSDN `_ on Windo - :data:`RWF_DSYNC` - :data:`RWF_SYNC` + - :data:`RWF_APPEND` Return the total number of bytes actually written. @@ -1238,8 +1313,8 @@ or `the MSDN `_ on Windo .. data:: RWF_DSYNC - Provide a per-write equivalent of the :data:`O_DSYNC` ``open(2)`` flag. This - flag effect applies only to the data range written by the system call. + Provide a per-write equivalent of the :data:`O_DSYNC` :func:`os.open` flag. + This flag effect applies only to the data range written by the system call. .. availability:: Linux 4.7 and newer. @@ -1248,14 +1323,28 @@ or `the MSDN `_ on Windo .. data:: RWF_SYNC - Provide a per-write equivalent of the :data:`O_SYNC` ``open(2)`` flag. This - flag effect applies only to the data range written by the system call. + Provide a per-write equivalent of the :data:`O_SYNC` :func:`os.open` flag. + This flag effect applies only to the data range written by the system call. .. availability:: Linux 4.7 and newer. .. versionadded:: 3.7 +.. data:: RWF_APPEND + + Provide a per-write equivalent of the :data:`O_APPEND` :func:`os.open` + flag. This flag is meaningful only for :func:`os.pwritev`, and its + effect applies only to the data range written by the system call. The + *offset* argument does not affect the write operation; the data is always + appended to the end of the file. However, if the *offset* argument is + ``-1``, the current file *offset* is updated. + + .. availability:: Linux 4.16 and newer. + + .. versionadded:: 3.10 + + .. function:: read(fd, n) Read at most *n* bytes from file descriptor *fd*. @@ -1340,6 +1429,39 @@ or `the MSDN `_ on Windo .. versionadded:: 3.3 +.. function:: splice(src, dst, count, offset_src=None, offset_dst=None) + + Transfer *count* bytes from file descriptor *src*, starting from offset + *offset_src*, to file descriptor *dst*, starting from offset *offset_dst*. + At least one of the file descriptors must refer to a pipe. If *offset_src* + is None, then *src* is read from the current position; respectively for + *offset_dst*. The offset associated to the file descriptor that refers to a + pipe must be ``None``. The files pointed by *src* and *dst* must reside in + the same filesystem, otherwise an :exc:`OSError` is raised with + :attr:`~OSError.errno` set to :data:`errno.EXDEV`. + + This copy is done without the additional cost of transferring data + from the kernel to user space and then back into the kernel. Additionally, + some filesystems could implement extra optimizations. The copy is done as if + both files are opened as binary. + + Upon successful completion, returns the number of bytes spliced to or from + the pipe. A return value of 0 means end of input. If *src* refers to a + pipe, then this means that there was no data to transfer, and it would not + make sense to block because there are no writers connected to the write end + of the pipe. + + .. availability:: Linux kernel >= 2.6.17 and glibc >= 2.5 + + .. versionadded:: 3.10 + + +.. data:: SPLICE_F_MOVE + SPLICE_F_NONBLOCK + SPLICE_F_MORE + + .. versionadded:: 3.10 + .. function:: readv(fd, buffers) Read from a file descriptor *fd* into a number of mutable :term:`bytes-like @@ -1918,8 +2040,7 @@ features: Create a directory named *path* with numeric mode *mode*. - If the directory already exists, :exc:`FileExistsError` is raised. If a parent - directory in the path does not exist, :exc:`FileNotFoundError` is raised. + If the directory already exists, :exc:`FileExistsError` is raised. .. _mkdir_modebits: @@ -2215,7 +2336,7 @@ features: .. function:: replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) - Rename the file or directory *src* to *dst*. If *dst* is a non-empty directory, + Rename the file or directory *src* to *dst*. If *dst* is a directory, :exc:`OSError` will be raised. If *dst* exists and is a file, it will be replaced silently if the user has permission. The operation may fail if *src* and *dst* are on different filesystems. If successful, @@ -3199,6 +3320,102 @@ features: .. versionadded:: 3.8 +.. function:: eventfd(initval[, flags=os.EFD_CLOEXEC]) + + Create and return an event file descriptor. The file descriptors supports + raw :func:`read` and :func:`write` with a buffer size of 8, + :func:`~select.select`, :func:`~select.poll` and similar. See man page + :manpage:`eventfd(2)` for more information. By default, the + new file descriptor is :ref:`non-inheritable `. + + *initval* is the initial value of the event counter. The initial value + must be an 32 bit unsigned integer. Please note that the initial value is + limited to a 32 bit unsigned int although the event counter is an unsigned + 64 bit integer with a maximum value of 2\ :sup:`64`\ -\ 2. + + *flags* can be constructed from :const:`EFD_CLOEXEC`, + :const:`EFD_NONBLOCK`, and :const:`EFD_SEMAPHORE`. + + If :const:`EFD_SEMAPHORE` is specified and the event counter is non-zero, + :func:`eventfd_read` returns 1 and decrements the counter by one. + + If :const:`EFD_SEMAPHORE` is not specified and the event counter is + non-zero, :func:`eventfd_read` returns the current event counter value and + resets the counter to zero. + + If the event counter is zero and :const:`EFD_NONBLOCK` is not + specified, :func:`eventfd_read` blocks. + + :func:`eventfd_write` increments the event counter. Write blocks if the + write operation would increment the counter to a value larger than + 2\ :sup:`64`\ -\ 2. + + Example:: + + import os + + # semaphore with start value '1' + fd = os.eventfd(1, os.EFD_SEMAPHORE | os.EFC_CLOEXEC) + try: + # acquire semaphore + v = os.eventfd_read(fd) + try: + do_work() + finally: + # release semaphore + os.eventfd_write(fd, v) + finally: + os.close(fd) + + .. availability:: Linux 2.6.27 or newer with glibc 2.8 or newer. + + .. versionadded:: 3.10 + +.. function:: eventfd_read(fd) + + Read value from an :func:`eventfd` file descriptor and return a 64 bit + unsigned int. The function does not verify that *fd* is an :func:`eventfd`. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. function:: eventfd_write(fd, value) + + Add value to an :func:`eventfd` file descriptor. *value* must be a 64 bit + unsigned int. The function does not verify that *fd* is an :func:`eventfd`. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. data:: EFD_CLOEXEC + + Set close-on-exec flag for new :func:`eventfd` file descriptor. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. data:: EFD_NONBLOCK + + Set :const:`O_NONBLOCK` status flag for new :func:`eventfd` file + descriptor. + + .. availability:: See :func:`eventfd` + + .. versionadded:: 3.10 + +.. data:: EFD_SEMAPHORE + + Provide semaphore-like semantics for reads from a :func:`eventfd` file + descriptor. On read the internal counter is decremented by one. + + .. availability:: Linux 2.6.30 or newer with glibc 2.8 or newer. + + .. versionadded:: 3.10 + + Linux extended attributes ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -3243,7 +3460,7 @@ These functions are all available on Linux only. Removes the extended filesystem attribute *attribute* from *path*. *attribute* should be bytes or str (directly or indirectly through the :class:`PathLike` interface). If it is a string, it is encoded - with the filesystem encoding. + with the :term:`filesystem encoding and error handler`. This function can support :ref:`specifying a file descriptor ` and :ref:`not following symlinks `. @@ -3259,7 +3476,7 @@ These functions are all available on Linux only. Set the extended filesystem attribute *attribute* on *path* to *value*. *attribute* must be a bytes or str with no embedded NULs (directly or indirectly through the :class:`PathLike` interface). If it is a str, - it is encoded with the filesystem encoding. *flags* may be + it is encoded with the :term:`filesystem encoding and error handler`. *flags* may be :data:`XATTR_REPLACE` or :data:`XATTR_CREATE`. If :data:`XATTR_REPLACE` is given and the attribute does not exist, ``ENODATA`` will be raised. If :data:`XATTR_CREATE` is given and the attribute already exists, the @@ -3327,8 +3544,8 @@ to be ignored. Add a path to the DLL search path. This search path is used when resolving dependencies for imported - extension modules (the module itself is resolved through - :data:`sys.path`), and also by :mod:`ctypes`. + extension modules (the module itself is resolved through sys.path), + and also by :mod:`ctypes`. Remove the directory by calling **close()** on the returned object or using it in a :keyword:`with` statement. @@ -3939,7 +4156,7 @@ written in Python, such as a mail server's external command delivery program. .. availability:: Windows. -.. function:: startfile(path[, operation]) +.. function:: startfile(path, [operation], [arguments], [cwd], [show_cmd]) Start a file with its associated application. @@ -3953,13 +4170,25 @@ written in Python, such as a mail server's external command delivery program. ``'print'`` and ``'edit'`` (to be used on files) as well as ``'explore'`` and ``'find'`` (to be used on directories). + When launching an application, specify *arguments* to be passed as a single + string. This argument may have no effect when using this function to launch a + document. + + The default working directory is inherited, but may be overridden by the *cwd* + argument. This should be an absolute path. A relative *path* will be resolved + against this argument. + + Use *show_cmd* to override the default window style. Whether this has any + effect will depend on the application being launched. Values are integers as + supported by the Win32 :c:func:`ShellExecute` function. + :func:`startfile` returns as soon as the associated application is launched. There is no option to wait for the application to close, and no way to retrieve the application's exit status. The *path* parameter is relative to the current - directory. If you want to use an absolute path, make sure the first character - is not a slash (``'/'``); the underlying Win32 :c:func:`ShellExecute` function - doesn't work if it is. Use the :func:`os.path.normpath` function to ensure that - the path is properly encoded for Win32. + directory or *cwd*. If you want to use an absolute path, make sure the first + character is not a slash (``'/'``) Use :mod:`pathlib` or the + :func:`os.path.normpath` function to ensure that paths are properly encoded for + Win32. To reduce interpreter startup overhead, the Win32 :c:func:`ShellExecute` function is not resolved until this function is first called. If the function @@ -3967,8 +4196,14 @@ written in Python, such as a mail server's external command delivery program. .. audit-event:: os.startfile path,operation os.startfile + .. audit-event:: os.startfile/2 path,operation,arguments,cwd,show_cmd os.startfile + .. availability:: Windows. + .. versionchanged:: 3.10 + Added the *arguments*, *cwd* and *show_cmd* arguments, and the + ``os.startfile/2`` audit event. + .. function:: system(command) @@ -4008,20 +4243,20 @@ written in Python, such as a mail server's external command delivery program. Returns the current global process times. The return value is an object with five attributes: - * :attr:`!user` - user time - * :attr:`!system` - system time - * :attr:`!children_user` - user time of all child processes - * :attr:`!children_system` - system time of all child processes - * :attr:`!elapsed` - elapsed real time since a fixed point in the past + * :attr:`user` - user time + * :attr:`system` - system time + * :attr:`children_user` - user time of all child processes + * :attr:`children_system` - system time of all child processes + * :attr:`elapsed` - elapsed real time since a fixed point in the past For backwards compatibility, this object also behaves like a five-tuple - containing :attr:`!user`, :attr:`!system`, :attr:`!children_user`, - :attr:`!children_system`, and :attr:`!elapsed` in that order. + containing :attr:`user`, :attr:`system`, :attr:`children_user`, + :attr:`children_system`, and :attr:`elapsed` in that order. See the Unix manual page :manpage:`times(2)` and :manpage:`times(3)` manual page on Unix or `the GetProcessTimes MSDN `_ - on Windows. On Windows, only :attr:`!user` and :attr:`!system` are known; the other attributes are zero. + on Windows. On Windows, only :attr:`user` and :attr:`system` are known; the other attributes are zero. .. availability:: Unix, Windows. @@ -4633,7 +4868,7 @@ Random numbers .. function:: urandom(size) - Return a bytestring of *size* random bytes suitable for cryptographic use. + Return a string of *size* random bytes suitable for cryptographic use. This function returns random bytes from an OS-specific randomness source. The returned data should be unpredictable enough for cryptographic applications, diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst index 728ee303..a7d3dac3 100644 --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -4,11 +4,6 @@ .. module:: ossaudiodev :platform: Linux, FreeBSD :synopsis: Access to OSS-compatible audio devices. - :deprecated: - -.. deprecated:: 3.11 - The :mod:`ossaudiodev` module is deprecated - (see :pep:`PEP 594 <594#ossaudiodev>` for details). -------------- diff --git a/Doc/library/parser.rst b/Doc/library/parser.rst deleted file mode 100644 index 79fc10d0..00000000 --- a/Doc/library/parser.rst +++ /dev/null @@ -1,357 +0,0 @@ -:mod:`parser` --- Access Python parse trees -=========================================== - -.. module:: parser - :synopsis: Access parse trees for Python source code. - -.. moduleauthor:: Fred L. Drake, Jr. -.. sectionauthor:: Fred L. Drake, Jr. - -.. Copyright 1995 Virginia Polytechnic Institute and State University and Fred - L. Drake, Jr. This copyright notice must be distributed on all copies, but - this document otherwise may be distributed as part of the Python - distribution. No fee may be charged for this document in any representation, - either on paper or electronically. This restriction does not affect other - elements in a distributed package in any way. - -.. index:: single: parsing; Python source code - --------------- - -The :mod:`parser` module provides an interface to Python's internal parser and -byte-code compiler. The primary purpose for this interface is to allow Python -code to edit the parse tree of a Python expression and create executable code -from this. This is better than trying to parse and modify an arbitrary Python -code fragment as a string because parsing is performed in a manner identical to -the code forming the application. It is also faster. - -.. warning:: - - The parser module is deprecated and will be removed in future versions of - Python. For the majority of use cases you can leverage the Abstract Syntax - Tree (AST) generation and compilation stage, using the :mod:`ast` module. - -There are a few things to note about this module which are important to making -use of the data structures created. This is not a tutorial on editing the parse -trees for Python code, but some examples of using the :mod:`parser` module are -presented. - -Most importantly, a good understanding of the Python grammar processed by the -internal parser is required. For full information on the language syntax, refer -to :ref:`reference-index`. The parser -itself is created from a grammar specification defined in the file -:file:`Grammar/Grammar` in the standard Python distribution. The parse trees -stored in the ST objects created by this module are the actual output from the -internal parser when created by the :func:`expr` or :func:`suite` functions, -described below. The ST objects created by :func:`sequence2st` faithfully -simulate those structures. Be aware that the values of the sequences which are -considered "correct" will vary from one version of Python to another as the -formal grammar for the language is revised. However, transporting code from one -Python version to another as source text will always allow correct parse trees -to be created in the target version, with the only restriction being that -migrating to an older version of the interpreter will not support more recent -language constructs. The parse trees are not typically compatible from one -version to another, though source code has usually been forward-compatible within -a major release series. - -Each element of the sequences returned by :func:`st2list` or :func:`st2tuple` -has a simple form. Sequences representing non-terminal elements in the grammar -always have a length greater than one. The first element is an integer which -identifies a production in the grammar. These integers are given symbolic names -in the C header file :file:`Include/graminit.h` and the Python module -:mod:`symbol`. Each additional element of the sequence represents a component -of the production as recognized in the input string: these are always sequences -which have the same form as the parent. An important aspect of this structure -which should be noted is that keywords used to identify the parent node type, -such as the keyword :keyword:`if` in an :const:`if_stmt`, are included in the -node tree without any special treatment. For example, the :keyword:`!if` keyword -is represented by the tuple ``(1, 'if')``, where ``1`` is the numeric value -associated with all :const:`NAME` tokens, including variable and function names -defined by the user. In an alternate form returned when line number information -is requested, the same token might be represented as ``(1, 'if', 12)``, where -the ``12`` represents the line number at which the terminal symbol was found. - -Terminal elements are represented in much the same way, but without any child -elements and the addition of the source text which was identified. The example -of the :keyword:`if` keyword above is representative. The various types of -terminal symbols are defined in the C header file :file:`Include/token.h` and -the Python module :mod:`token`. - -The ST objects are not required to support the functionality of this module, -but are provided for three purposes: to allow an application to amortize the -cost of processing complex parse trees, to provide a parse tree representation -which conserves memory space when compared to the Python list or tuple -representation, and to ease the creation of additional modules in C which -manipulate parse trees. A simple "wrapper" class may be created in Python to -hide the use of ST objects. - -The :mod:`parser` module defines functions for a few distinct purposes. The -most important purposes are to create ST objects and to convert ST objects to -other representations such as parse trees and compiled code objects, but there -are also functions which serve to query the type of parse tree represented by an -ST object. - - -.. seealso:: - - Module :mod:`symbol` - Useful constants representing internal nodes of the parse tree. - - Module :mod:`token` - Useful constants representing leaf nodes of the parse tree and functions for - testing node values. - - -.. _creating-sts: - -Creating ST Objects -------------------- - -ST objects may be created from source code or from a parse tree. When creating -an ST object from source, different functions are used to create the ``'eval'`` -and ``'exec'`` forms. - - -.. function:: expr(source) - - The :func:`expr` function parses the parameter *source* as if it were an input - to ``compile(source, 'file.py', 'eval')``. If the parse succeeds, an ST object - is created to hold the internal parse tree representation, otherwise an - appropriate exception is raised. - - -.. function:: suite(source) - - The :func:`suite` function parses the parameter *source* as if it were an input - to ``compile(source, 'file.py', 'exec')``. If the parse succeeds, an ST object - is created to hold the internal parse tree representation, otherwise an - appropriate exception is raised. - - -.. function:: sequence2st(sequence) - - This function accepts a parse tree represented as a sequence and builds an - internal representation if possible. If it can validate that the tree conforms - to the Python grammar and all nodes are valid node types in the host version of - Python, an ST object is created from the internal representation and returned - to the called. If there is a problem creating the internal representation, or - if the tree cannot be validated, a :exc:`ParserError` exception is raised. An - ST object created this way should not be assumed to compile correctly; normal - exceptions raised by compilation may still be initiated when the ST object is - passed to :func:`compilest`. This may indicate problems not related to syntax - (such as a :exc:`MemoryError` exception), but may also be due to constructs such - as the result of parsing ``del f(0)``, which escapes the Python parser but is - checked by the bytecode compiler. - - Sequences representing terminal tokens may be represented as either two-element - lists of the form ``(1, 'name')`` or as three-element lists of the form ``(1, - 'name', 56)``. If the third element is present, it is assumed to be a valid - line number. The line number may be specified for any subset of the terminal - symbols in the input tree. - - -.. function:: tuple2st(sequence) - - This is the same function as :func:`sequence2st`. This entry point is - maintained for backward compatibility. - - -.. _converting-sts: - -Converting ST Objects ---------------------- - -ST objects, regardless of the input used to create them, may be converted to -parse trees represented as list- or tuple- trees, or may be compiled into -executable code objects. Parse trees may be extracted with or without line -numbering information. - - -.. function:: st2list(st, line_info=False, col_info=False) - - This function accepts an ST object from the caller in *st* and returns a - Python list representing the equivalent parse tree. The resulting list - representation can be used for inspection or the creation of a new parse tree in - list form. This function does not fail so long as memory is available to build - the list representation. If the parse tree will only be used for inspection, - :func:`st2tuple` should be used instead to reduce memory consumption and - fragmentation. When the list representation is required, this function is - significantly faster than retrieving a tuple representation and converting that - to nested lists. - - If *line_info* is true, line number information will be included for all - terminal tokens as a third element of the list representing the token. Note - that the line number provided specifies the line on which the token *ends*. - This information is omitted if the flag is false or omitted. - - -.. function:: st2tuple(st, line_info=False, col_info=False) - - This function accepts an ST object from the caller in *st* and returns a - Python tuple representing the equivalent parse tree. Other than returning a - tuple instead of a list, this function is identical to :func:`st2list`. - - If *line_info* is true, line number information will be included for all - terminal tokens as a third element of the list representing the token. This - information is omitted if the flag is false or omitted. - - -.. function:: compilest(st, filename='') - - .. index:: - builtin: exec - builtin: eval - - The Python byte compiler can be invoked on an ST object to produce code objects - which can be used as part of a call to the built-in :func:`exec` or :func:`eval` - functions. This function provides the interface to the compiler, passing the - internal parse tree from *st* to the parser, using the source file name - specified by the *filename* parameter. The default value supplied for *filename* - indicates that the source was an ST object. - - Compiling an ST object may result in exceptions related to compilation; an - example would be a :exc:`SyntaxError` caused by the parse tree for ``del f(0)``: - this statement is considered legal within the formal grammar for Python but is - not a legal language construct. The :exc:`SyntaxError` raised for this - condition is actually generated by the Python byte-compiler normally, which is - why it can be raised at this point by the :mod:`parser` module. Most causes of - compilation failure can be diagnosed programmatically by inspection of the parse - tree. - - -.. _querying-sts: - -Queries on ST Objects ---------------------- - -Two functions are provided which allow an application to determine if an ST was -created as an expression or a suite. Neither of these functions can be used to -determine if an ST was created from source code via :func:`expr` or -:func:`suite` or from a parse tree via :func:`sequence2st`. - - -.. function:: isexpr(st) - - .. index:: builtin: compile - - When *st* represents an ``'eval'`` form, this function returns ``True``, otherwise - it returns ``False``. This is useful, since code objects normally cannot be queried - for this information using existing built-in functions. Note that the code - objects created by :func:`compilest` cannot be queried like this either, and - are identical to those created by the built-in :func:`compile` function. - - -.. function:: issuite(st) - - This function mirrors :func:`isexpr` in that it reports whether an ST object - represents an ``'exec'`` form, commonly known as a "suite." It is not safe to - assume that this function is equivalent to ``not isexpr(st)``, as additional - syntactic fragments may be supported in the future. - - -.. _st-errors: - -Exceptions and Error Handling ------------------------------ - -The parser module defines a single exception, but may also pass other built-in -exceptions from other portions of the Python runtime environment. See each -function for information about the exceptions it can raise. - - -.. exception:: ParserError - - Exception raised when a failure occurs within the parser module. This is - generally produced for validation failures rather than the built-in - :exc:`SyntaxError` raised during normal parsing. The exception argument is - either a string describing the reason of the failure or a tuple containing a - sequence causing the failure from a parse tree passed to :func:`sequence2st` - and an explanatory string. Calls to :func:`sequence2st` need to be able to - handle either type of exception, while calls to other functions in the module - will only need to be aware of the simple string values. - -Note that the functions :func:`compilest`, :func:`expr`, and :func:`suite` may -raise exceptions which are normally raised by the parsing and compilation -process. These include the built in exceptions :exc:`MemoryError`, -:exc:`OverflowError`, :exc:`SyntaxError`, and :exc:`SystemError`. In these -cases, these exceptions carry all the meaning normally associated with them. -Refer to the descriptions of each function for detailed information. - - -.. _st-objects: - -ST Objects ----------- - -Ordered and equality comparisons are supported between ST objects. Pickling of -ST objects (using the :mod:`pickle` module) is also supported. - - -.. data:: STType - - The type of the objects returned by :func:`expr`, :func:`suite` and - :func:`sequence2st`. - -ST objects have the following methods: - - -.. method:: ST.compile(filename='') - - Same as ``compilest(st, filename)``. - - -.. method:: ST.isexpr() - - Same as ``isexpr(st)``. - - -.. method:: ST.issuite() - - Same as ``issuite(st)``. - - -.. method:: ST.tolist(line_info=False, col_info=False) - - Same as ``st2list(st, line_info, col_info)``. - - -.. method:: ST.totuple(line_info=False, col_info=False) - - Same as ``st2tuple(st, line_info, col_info)``. - - -Example: Emulation of :func:`compile` -------------------------------------- - -While many useful operations may take place between parsing and bytecode -generation, the simplest operation is to do nothing. For this purpose, using -the :mod:`parser` module to produce an intermediate data structure is equivalent -to the code :: - - >>> code = compile('a + 5', 'file.py', 'eval') - >>> a = 5 - >>> eval(code) - 10 - -The equivalent operation using the :mod:`parser` module is somewhat longer, and -allows the intermediate internal parse tree to be retained as an ST object:: - - >>> import parser - >>> st = parser.expr('a + 5') - >>> code = st.compile('file.py') - >>> a = 5 - >>> eval(code) - 10 - -An application which needs both ST and code objects can package this code into -readily available functions:: - - import parser - - def load_suite(source_string): - st = parser.suite(source_string) - return st, st.compile() - - def load_expression(source_string): - st = parser.expr(source_string) - return st, st.compile() diff --git a/Doc/library/pathlib-inheritance.svg b/Doc/library/pathlib-inheritance.svg index 01f8684a..49057f67 100644 --- a/Doc/library/pathlib-inheritance.svg +++ b/Doc/library/pathlib-inheritance.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst index 30611abc..b6507eb4 100644 --- a/Doc/library/pathlib.rst +++ b/Doc/library/pathlib.rst @@ -336,6 +336,8 @@ Pure paths provide the following methods and properties: >>> p.parents[2] PureWindowsPath('c:/') + .. versionchanged:: 3.10 + The parents sequence now supports :term:`slices ` and negative index values. .. data:: PurePath.parent @@ -703,23 +705,25 @@ call fails (for example because the path doesn't exist). .. classmethod:: Path.home() Return a new path object representing the user's home directory (as - returned by :func:`os.path.expanduser` with ``~`` construct):: + returned by :func:`os.path.expanduser` with ``~`` construct). If the home + directory can't be resolved, :exc:`RuntimeError` is raised. + + :: >>> Path.home() PosixPath('/home/antoine') - Note that unlike :func:`os.path.expanduser`, on POSIX systems a - :exc:`KeyError` or :exc:`RuntimeError` will be raised, and on Windows systems a - :exc:`RuntimeError` will be raised if home directory can't be resolved. - .. versionadded:: 3.5 -.. method:: Path.stat() +.. method:: Path.stat(*, follow_symlinks=True) Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`. The result is looked up at each call to this method. + This method normally follows symlinks; to stat a symlink add the argument + ``follow_symlinks=False``, or use :meth:`~Path.lstat`. + :: >>> p = Path('setup.py') @@ -728,10 +732,18 @@ call fails (for example because the path doesn't exist). >>> p.stat().st_mtime 1327883547.852554 + .. versionchanged:: 3.10 + The *follow_symlinks* parameter was added. + +.. method:: Path.chmod(mode, *, follow_symlinks=True) -.. method:: Path.chmod(mode) + Change the file mode and permissions, like :func:`os.chmod`. - Change the file mode and permissions, like :func:`os.chmod`:: + This method normally follows symlinks. Some Unix flavours support changing + permissions on the symlink itself; on these platforms you may add the + argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`. + + :: >>> p = Path('setup.py') >>> p.stat().st_mode @@ -740,6 +752,8 @@ call fails (for example because the path doesn't exist). >>> p.stat().st_mode 33060 + .. versionchanged:: 3.10 + The *follow_symlinks* parameter was added. .. method:: Path.exists() @@ -762,16 +776,15 @@ call fails (for example because the path doesn't exist). .. method:: Path.expanduser() Return a new path with expanded ``~`` and ``~user`` constructs, - as returned by :meth:`os.path.expanduser`:: + as returned by :meth:`os.path.expanduser`. If a home directory can't be + resolved, :exc:`RuntimeError` is raised. + + :: >>> p = PosixPath('~/films/Monty Python') >>> p.expanduser() PosixPath('/home/eric/films/Monty Python') - Note that unlike :func:`os.path.expanduser`, on POSIX systems a - :exc:`KeyError` or :exc:`RuntimeError` will be raised, and on Windows systems a - :exc:`RuntimeError` will be raised if home directory can't be resolved. - .. versionadded:: 3.5 @@ -785,8 +798,9 @@ call fails (for example because the path doesn't exist). >>> sorted(Path('.').glob('*/*.py')) [PosixPath('docs/conf.py')] - The "``**``" pattern means "this directory and all subdirectories, - recursively". In other words, it enables recursive globbing:: + Patterns are the same as for :mod:`fnmatch`, with the addition of "``**``" + which means "this directory and all subdirectories, recursively". In other + words, it enables recursive globbing:: >>> sorted(Path('.').glob('**/*.py')) [PosixPath('build/lib/pathlib.py'), @@ -900,7 +914,7 @@ call fails (for example because the path doesn't exist). The children are yielded in arbitrary order, and the special entries ``'.'`` and ``'..'`` are not included. If a file is removed from or added - to the directory after creating the iterator, whether a path object for + to the directory after creating the iterator, whether an path object for that file be included is unspecified. .. method:: Path.lchmod(mode) @@ -1028,7 +1042,7 @@ call fails (for example because the path doesn't exist). Rename this file or directory to the given *target*, and return a new Path instance pointing to *target*. If *target* points to an existing file or - empty directory, it will be unconditionally replaced. + directory, it will be unconditionally replaced. The target path may be absolute or relative. Relative paths are interpreted relative to the current working directory, *not* the directory of the Path @@ -1126,6 +1140,15 @@ call fails (for example because the path doesn't exist). The order of arguments (link, target) is the reverse of :func:`os.symlink`'s. +.. method:: Path.hardlink_to(target) + + Make this path a hard link to the same file as *target*. + + .. note:: + The order of arguments (link, target) is the reverse + of :func:`os.link`'s. + + .. versionadded:: 3.10 .. method:: Path.link_to(target) @@ -1135,11 +1158,17 @@ call fails (for example because the path doesn't exist). This function does not make this path a hard link to *target*, despite the implication of the function and argument names. The argument order - (target, link) is the reverse of :func:`Path.symlink_to`, but matches - that of :func:`os.link`. + (target, link) is the reverse of :func:`Path.symlink_to` and + :func:`Path.hardlink_to`, but matches that of :func:`os.link`. .. versionadded:: 3.8 + .. deprecated:: 3.10 + + This method is deprecated in favor of :meth:`Path.hardlink_to`, as the + argument order of :meth:`Path.link_to` does not match that of + :meth:`Path.symlink_to`. + .. method:: Path.touch(mode=0o666, exist_ok=True) @@ -1181,7 +1210,7 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 -.. method:: Path.write_text(data, encoding=None, errors=None) +.. method:: Path.write_text(data, encoding=None, errors=None, newline=None) Open the file pointed to in text mode, write *data* to it, and close the file:: @@ -1197,6 +1226,9 @@ call fails (for example because the path doesn't exist). .. versionadded:: 3.5 + .. versionchanged:: 3.10 + The *newline* parameter was added. + Correspondence to tools in the :mod:`os` module ----------------------------------------------- @@ -1205,14 +1237,15 @@ Below is a table mapping various :mod:`os` functions to their corresponding .. note:: - Although :func:`os.path.relpath` and :meth:`PurePath.relative_to` have some - overlapping use-cases, their semantics differ enough to warrant not - considering them equivalent. + Not all pairs of functions/methods below are equivalent. Some of them, + despite having some overlapping use-cases, have different semantics. They + include :func:`os.path.abspath` and :meth:`Path.resolve`, + :func:`os.path.relpath` and :meth:`PurePath.relative_to`. ==================================== ============================== -os and os.path pathlib +:mod:`os` and :mod:`os.path` :mod:`pathlib` ==================================== ============================== -:func:`os.path.abspath` :meth:`Path.resolve` +:func:`os.path.abspath` :meth:`Path.resolve` [#]_ :func:`os.chmod` :meth:`Path.chmod` :func:`os.mkdir` :meth:`Path.mkdir` :func:`os.makedirs` :meth:`Path.mkdir` @@ -1228,9 +1261,10 @@ os and os.path pathlib :func:`os.path.isdir` :meth:`Path.is_dir` :func:`os.path.isfile` :meth:`Path.is_file` :func:`os.path.islink` :meth:`Path.is_symlink` -:func:`os.link` :meth:`Path.link_to` +:func:`os.link` :meth:`Path.hardlink_to` :func:`os.symlink` :meth:`Path.symlink_to` :func:`os.readlink` :meth:`Path.readlink` +:func:`os.path.relpath` :meth:`Path.relative_to` [#]_ :func:`os.stat` :meth:`Path.stat`, :meth:`Path.owner`, :meth:`Path.group` @@ -1241,3 +1275,8 @@ os and os.path pathlib :func:`os.path.samefile` :meth:`Path.samefile` :func:`os.path.splitext` :data:`PurePath.suffix` ==================================== ============================== + +.. rubric:: Footnotes + +.. [#] :func:`os.path.abspath` does not resolve symbolic links while :meth:`Path.resolve` does. +.. [#] :meth:`Path.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not. diff --git a/Doc/library/pdb.rst b/Doc/library/pdb.rst index dcd509de..ed1e9712 100644 --- a/Doc/library/pdb.rst +++ b/Doc/library/pdb.rst @@ -67,13 +67,14 @@ useful than quitting the debugger upon program's exit. before the first line of the module. -The typical usage to break into the debugger is to insert:: +The typical usage to break into the debugger from a running program is to +insert :: import pdb; pdb.set_trace() -at the location you want to break into the debugger, and then run the program. -You can then step through the code following this statement, and continue -running without the debugger using the :pdbcmd:`continue` command. +at the location you want to break into the debugger. You can then step through +the code following this statement, and continue running without the debugger +using the :pdbcmd:`continue` command. .. versionadded:: 3.7 The built-in :func:`breakpoint()`, when called with defaults, can be used @@ -233,8 +234,7 @@ Multiple commands may be entered on a single line, separated by ``;;``. (A single ``;`` is not used as it is the separator for multiple commands in a line that is passed to the Python parser.) No intelligence is applied to separating the commands; the input is split at the first ``;;`` pair, even if it is in the -middle of a quoted string. A workaround for strings with double semicolons -is to use implicit string concatenation ``';'';'`` or ``";"";"``. +middle of a quoted string. .. index:: pair: .pdbrc; file diff --git a/Doc/library/pickle.rst b/Doc/library/pickle.rst index f7db0e84..be48561e 100644 --- a/Doc/library/pickle.rst +++ b/Doc/library/pickle.rst @@ -147,7 +147,7 @@ to read the pickle produced. earlier versions of Python. * Protocol version 2 was introduced in Python 2.3. It provides much more - efficient pickling of :term:`new-style classes `. Refer to :pep:`307` for + efficient pickling of :term:`new-style class`\es. Refer to :pep:`307` for information about improvements brought by protocol 2. * Protocol version 3 was added in Python 3.0. It has explicit support for @@ -261,7 +261,7 @@ process more convenient: protocol argument is needed. Bytes past the pickled representation of the object are ignored. - Arguments *fix_imports*, *encoding*, *errors*, *strict* and *buffers* + Arguments *file*, *fix_imports*, *encoding*, *errors*, *strict* and *buffers* have the same meaning as in the :class:`Unpickler` constructor. .. versionchanged:: 3.8 @@ -368,7 +368,7 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`, .. versionadded:: 3.3 - .. method:: reducer_override(obj) + .. method:: reducer_override(self, obj) Special reducer that can be defined in :class:`Pickler` subclasses. This method has priority over any reducer in the :attr:`dispatch_table`. It @@ -494,18 +494,20 @@ What can be pickled and unpickled? The following types can be pickled: -* ``None``, ``True``, and ``False``; +* ``None``, ``True``, and ``False`` + +* integers, floating point numbers, complex numbers -* integers, floating-point numbers, complex numbers; +* strings, bytes, bytearrays -* strings, bytes, bytearrays; +* tuples, lists, sets, and dictionaries containing only picklable objects -* tuples, lists, sets, and dictionaries containing only picklable objects; +* functions defined at the top level of a module (using :keyword:`def`, not + :keyword:`lambda`) -* functions (built-in and user-defined) defined at the top level of a module - (using :keyword:`def`, not :keyword:`lambda`); +* built-in functions defined at the top level of a module -* classes defined at the top level of a module; +* classes that are defined at the top level of a module * instances of such classes whose :attr:`~object.__dict__` or the result of calling :meth:`__getstate__` is picklable (see section :ref:`pickle-inst` for @@ -518,14 +520,14 @@ structure may exceed the maximum recursion depth, a :exc:`RecursionError` will b raised in this case. You can carefully raise this limit with :func:`sys.setrecursionlimit`. -Note that functions (built-in and user-defined) are pickled by fully qualified -name, not by value. [#]_ This means that only the function name is +Note that functions (built-in and user-defined) are pickled by "fully qualified" +name reference, not by value. [#]_ This means that only the function name is pickled, along with the name of the module the function is defined in. Neither the function's code, nor any of its function attributes are pickled. Thus the defining module must be importable in the unpickling environment, and the module must contain the named object, otherwise an exception will be raised. [#]_ -Similarly, classes are pickled by fully qualified name, so the same restrictions in +Similarly, classes are pickled by named reference, so the same restrictions in the unpickling environment apply. Note that none of the class's code or data is pickled, so in the following example the class attribute ``attr`` is not restored in the unpickling environment:: @@ -535,7 +537,7 @@ restored in the unpickling environment:: picklestring = pickle.dumps(Foo) -These restrictions are why picklable functions and classes must be defined at +These restrictions are why picklable functions and classes must be defined in the top level of a module. Similarly, when class instances are pickled, their class's code and data are not @@ -567,7 +569,7 @@ implementation of this behaviour:: def save(obj): return (obj.__class__, obj.__dict__) - def restore(cls, attributes): + def load(cls, attributes): obj = cls.__new__(cls) obj.__dict__.update(attributes) return obj @@ -786,15 +788,14 @@ the code :: f = io.BytesIO() p = MyPickler(f) -does the same but all instances of ``MyPickler`` will by default -share the private dispatch table. On the other hand, the code :: +does the same, but all instances of ``MyPickler`` will by default +share the same dispatch table. The equivalent code using the +:mod:`copyreg` module is :: copyreg.pickle(SomeClass, reduce_SomeClass) f = io.BytesIO() p = pickle.Pickler(f) -modifies the global dispatch table shared by all users of the :mod:`copyreg` module. - .. _pickle-state: Handling Stateful Objects @@ -1097,7 +1098,7 @@ Here is an example of an unpickler allowing only few safe classes from the """Helper function analogous to pickle.loads().""" return RestrictedUnpickler(io.BytesIO(s)).load() -A sample usage of our unpickler working as intended:: +A sample usage of our unpickler working has intended:: >>> restricted_loads(pickle.dumps([1, 2, range(15)])) [1, 2, range(0, 15)] @@ -1141,7 +1142,7 @@ For the simplest code, use the :func:`dump` and :func:`load` functions. :: # An arbitrary collection of objects supported by pickle. data = { - 'a': [1, 2.0, 3+4j], + 'a': [1, 2.0, 3, 4+6j], 'b': ("character string", b"byte string"), 'c': {None, True, False} } @@ -1197,6 +1198,6 @@ The following example reads the resulting pickled data. :: operations. .. [#] The limitation on alphanumeric characters is due to the fact - that persistent IDs in protocol 0 are delimited by the newline + the persistent IDs, in protocol 0, are delimited by the newline character. Therefore if any kind of newline characters occurs in - persistent IDs, the resulting pickled data will become unreadable. + persistent IDs, the resulting pickle will become unreadable. diff --git a/Doc/library/pipes.rst b/Doc/library/pipes.rst index bc21c097..57e27a6a 100644 --- a/Doc/library/pipes.rst +++ b/Doc/library/pipes.rst @@ -4,17 +4,11 @@ .. module:: pipes :platform: Unix :synopsis: A Python interface to Unix shell pipelines. - :deprecated: .. sectionauthor:: Moshe Zadka **Source code:** :source:`Lib/pipes.py` -.. deprecated:: 3.11 - The :mod:`pipes` module is deprecated - (see :pep:`PEP 594 <594#pipes>` for details). - Please use the :mod:`subprocess` module instead. - -------------- The :mod:`pipes` module defines a class to abstract the concept of a *pipeline* @@ -23,6 +17,8 @@ The :mod:`pipes` module defines a class to abstract the concept of a *pipeline* Because the module uses :program:`/bin/sh` command lines, a POSIX or compatible shell for :func:`os.system` and :func:`os.popen` is required. +.. availability:: Unix. Not available on VxWorks. + The :mod:`pipes` module defines the following class: diff --git a/Doc/library/pkgutil.rst b/Doc/library/pkgutil.rst index 788a02dc..3b17b9a6 100644 --- a/Doc/library/pkgutil.rst +++ b/Doc/library/pkgutil.rst @@ -26,7 +26,7 @@ support. __path__ = extend_path(__path__, __name__) This will add to the package's ``__path__`` all subdirectories of directories - on :data:`sys.path` named after the package. This is useful if one wants to + on ``sys.path`` named after the package. This is useful if one wants to distribute different parts of a single logical package as multiple directories. @@ -128,9 +128,9 @@ support. Yield :term:`finder` objects for the given module name. - If fullname contains a ``'.'``, the finders will be for the package + If fullname contains a '.', the finders will be for the package containing fullname, otherwise they will be all registered top level - finders (i.e. those on both :data:`sys.meta_path` and :data:`sys.path_hooks`). + finders (i.e. those on both sys.meta_path and sys.path_hooks). If the named module is in a package, that package is imported as a side effect of invoking this function. @@ -145,7 +145,7 @@ support. .. function:: iter_modules(path=None, prefix='') Yields :class:`ModuleInfo` for all submodules on *path*, or, if - *path* is ``None``, all top-level modules on :data:`sys.path`. + *path* is ``None``, all top-level modules on ``sys.path``. *path* should be either ``None`` or a list of paths to look for modules in. diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst index 722a5b59..a0eece6c 100644 --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -139,7 +139,7 @@ Cross Platform .. function:: release() - Returns the system's release, e.g. ``'2.2.0'`` or ``'NT'``. An empty string is + Returns the system's release, e.g. ``'2.2.0'`` or ``'NT'`` An empty string is returned if the value cannot be determined. @@ -176,7 +176,7 @@ Cross Platform Entries which cannot be determined are set to ``''``. .. versionchanged:: 3.3 - Result changed from a tuple to a :func:`~collections.namedtuple`. + Result changed from a tuple to a namedtuple. Java Platform @@ -201,9 +201,7 @@ Windows Platform Get additional version information from the Windows Registry and return a tuple ``(release, version, csd, ptype)`` referring to OS release, version number, - CSD level (service pack) and OS type (multi/single processor). Values which - cannot be determined are set to the defaults given as parameters (which all - default to an empty string). + CSD level (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers @@ -213,9 +211,9 @@ Windows Platform .. function:: win32_edition() - Returns a string representing the current Windows edition, or ``None`` if the - value cannot be determined. Possible values include but are not limited to - ``'Enterprise'``, ``'IoTUAP'``, ``'ServerStandard'``, and ``'nanoserver'``. + Returns a string representing the current Windows edition. Possible + values include but are not limited to ``'Enterprise'``, ``'IoTUAP'``, + ``'ServerStandard'``, and ``'nanoserver'``. .. versionadded:: 3.8 @@ -255,3 +253,41 @@ Unix Platforms using :program:`gcc`. The file is read and scanned in chunks of *chunksize* bytes. + + +Linux Platforms +--------------- + +.. function:: freedesktop_os_release() + + Get operating system identification from ``os-release`` file and return + it as a dict. The ``os-release`` file is a `freedesktop.org standard + `_ and + is available in most Linux distributions. A noticeable exception is + Android and Android-based distributions. + + Raises :exc:`OSError` or subclass when neither ``/etc/os-release`` nor + ``/usr/lib/os-release`` can be read. + + On success, the function returns a dictionary where keys and values are + strings. Values have their special characters like ``"`` and ``$`` + unquoted. The fields ``NAME``, ``ID``, and ``PRETTY_NAME`` are always + defined according to the standard. All other fields are optional. Vendors + may include additional fields. + + Note that fields like ``NAME``, ``VERSION``, and ``VARIANT`` are strings + suitable for presentation to users. Programs should use fields like + ``ID``, ``ID_LIKE``, ``VERSION_ID``, or ``VARIANT_ID`` to identify + Linux distributions. + + Example:: + + def get_like_distro(): + info = platform.freedesktop_os_release() + ids = [info["ID"]] + if "ID_LIKE" in info: + # ids are space separated and ordered by precedence + ids.extend(info["ID_LIKE"].split()) + return ids + + .. versionadded:: 3.10 diff --git a/Doc/library/posix.rst b/Doc/library/posix.rst index 2105af92..ad417a17 100644 --- a/Doc/library/posix.rst +++ b/Doc/library/posix.rst @@ -37,7 +37,7 @@ Large File Support .. sectionauthor:: Steve Clift -Several operating systems (including AIX, HP-UX, Irix and Solaris) provide +Several operating systems (including AIX, HP-UX and Solaris) provide support for files that are larger than 2 GiB from a C programming model where :c:type:`int` and :c:type:`long` are 32-bit values. This is typically accomplished by defining the relevant size and offset types as 64-bit values. Such files are @@ -47,8 +47,8 @@ Large file support is enabled in Python when the size of an :c:type:`off_t` is larger than a :c:type:`long` and the :c:type:`long long` is at least as large as an :c:type:`off_t`. It may be necessary to configure and compile Python with certain compiler flags -to enable this mode. For example, it is enabled by default with recent versions -of Irix, but with Solaris 2.6 and 2.7 you need to do something like:: +to enable this mode. For example, with Solaris 2.6 and 2.7 you need to do +something like:: CFLAGS="`getconf LFS_CFLAGS`" OPT="-g -O2 $CFLAGS" \ ./configure diff --git a/Doc/library/pprint.rst b/Doc/library/pprint.rst index 16256c54..8f374503 100644 --- a/Doc/library/pprint.rst +++ b/Doc/library/pprint.rst @@ -28,6 +28,9 @@ Dictionaries are sorted by key before the display is computed. .. versionchanged:: 3.9 Added support for pretty-printing :class:`types.SimpleNamespace`. +.. versionchanged:: 3.10 + Added support for pretty-printing :class:`dataclasses.dataclass`. + The :mod:`pprint` module defines one class: .. First the implementation class: @@ -36,26 +39,41 @@ The :mod:`pprint` module defines one class: .. index:: single: ...; placeholder .. class:: PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, \ - compact=False, sort_dicts=True) + compact=False, sort_dicts=True, underscore_numbers=False) Construct a :class:`PrettyPrinter` instance. This constructor understands - several keyword parameters. An output stream may be set using the *stream* - keyword; the only method used on the stream object is the file protocol's - :meth:`write` method. If not specified, the :class:`PrettyPrinter` adopts - ``sys.stdout``. The - amount of indentation added for each recursive level is specified by *indent*; - the default is one. Other values can cause output to look a little odd, but can - make nesting easier to spot. The number of levels which may be printed is - controlled by *depth*; if the data structure being printed is too deep, the next - contained level is replaced by ``...``. By default, there is no constraint on - the depth of the objects being formatted. The desired output width is - constrained using the *width* parameter; the default is 80 characters. If a - structure cannot be formatted within the constrained width, a best effort will - be made. If *compact* is false (the default) each item of a long sequence - will be formatted on a separate line. If *compact* is true, as many items - as will fit within the *width* will be formatted on each output line. If - *sort_dicts* is true (the default), dictionaries will be formatted with their - keys sorted, otherwise they will display in insertion order. + several keyword parameters. + + *stream* (default ``sys.stdout``) is a :term:`file-like object` to + which the output will be written by calling its :meth:`write` method. + + Other values configure the manner in which nesting of complex data + structures is displayed. + + *indent* (default 1) specifies the amount of indentation added for + each nesting level. + + *depth* controls the number of nesting levels which may be printed; if + the data structure being printed is too deep, the next contained level + is replaced by ``...``. By default, there is no constraint on the + depth of the objects being formatted. + + *width* (default 80) specifies the desired maximum number of characters per + line in the output. If a structure cannot be formatted within the width + constraint, a best effort will be made. + + *compact* impacts the way that long sequences (lists, tuples, sets, etc) + are formatted. If *compact* is false (the default) then each item of a + sequence will be formatted on a separate line. If *compact* is true, as + many items as will fit within the *width* will be formatted on each output + line. + + If *sort_dicts* is true (the default), dictionaries will be formatted with + their keys sorted, otherwise they will display in insertion order. + + If *underscore_numbers* is true, integers will be formatted with the + ``_`` character for a thousands separator, otherwise underscores are not + displayed (the default). .. versionchanged:: 3.4 Added the *compact* parameter. @@ -63,6 +81,8 @@ The :mod:`pprint` module defines one class: .. versionchanged:: 3.8 Added the *sort_dicts* parameter. + .. versionchanged:: 3.10 + Added the *underscore_numbers* parameter. >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] @@ -91,10 +111,10 @@ The :mod:`pprint` module defines one class: The :mod:`pprint` module also provides several shortcut functions: .. function:: pformat(object, indent=1, width=80, depth=None, *, \ - compact=False, sort_dicts=True) + compact=False, sort_dicts=True, underscore_numbers=False) Return the formatted representation of *object* as a string. *indent*, - *width*, *depth*, *compact* and *sort_dicts* will be passed to the + *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* will be passed to the :class:`PrettyPrinter` constructor as formatting parameters. .. versionchanged:: 3.4 @@ -103,6 +123,9 @@ The :mod:`pprint` module also provides several shortcut functions: .. versionchanged:: 3.8 Added the *sort_dicts* parameter. + .. versionchanged:: 3.10 + Added the *underscore_numbers* parameter. + .. function:: pp(object, *args, sort_dicts=False, **kwargs) @@ -116,13 +139,13 @@ The :mod:`pprint` module also provides several shortcut functions: .. function:: pprint(object, stream=None, indent=1, width=80, depth=None, *, \ - compact=False, sort_dicts=True) + compact=False, sort_dicts=True, underscore_numbers=False) Prints the formatted representation of *object* on *stream*, followed by a newline. If *stream* is ``None``, ``sys.stdout`` is used. This may be used in the interactive interpreter instead of the :func:`print` function for inspecting values (you can even reassign ``print = pprint.pprint`` for use - within a scope). *indent*, *width*, *depth*, *compact* and *sort_dicts* will + within a scope). *indent*, *width*, *depth*, *compact*, *sort_dicts* and *underscore_numbers* will be passed to the :class:`PrettyPrinter` constructor as formatting parameters. .. versionchanged:: 3.4 @@ -131,6 +154,9 @@ The :mod:`pprint` module also provides several shortcut functions: .. versionchanged:: 3.8 Added the *sort_dicts* parameter. + .. versionchanged:: 3.10 + Added the *underscore_numbers* parameter. + >>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index 73d4f102..7f4da41e 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -2,8 +2,8 @@ ======================================== .. module:: pty - :platform: Linux - :synopsis: Pseudo-Terminal Handling for Linux. + :platform: Unix + :synopsis: Pseudo-Terminal Handling for Unix. .. moduleauthor:: Steen Lumholt .. sectionauthor:: Moshe Zadka @@ -16,9 +16,9 @@ The :mod:`pty` module defines operations for handling the pseudo-terminal concept: starting another process and being able to write to and read from its controlling terminal programmatically. -Because pseudo-terminal handling is highly platform dependent, there is code to -do it only for Linux. (The Linux code is supposed to work on other platforms, -but hasn't been tested yet.) +Pseudo-terminal handling is highly platform dependent. This code is mainly +tested on Linux, FreeBSD, and macOS (it is supposed to work on other POSIX +platforms but it's not been thoroughly tested). The :mod:`pty` module defines the following functions: @@ -47,10 +47,14 @@ The :mod:`pty` module defines the following functions: spawned behind the pty will eventually terminate, and when it does *spawn* will return. + A loop copies STDIN of the current process to the child and data received + from the child to STDOUT of the current process. It is not signaled to the + child if STDIN of the current process closes down. + The functions *master_read* and *stdin_read* are passed a file descriptor which they should read from, and they should always return a byte string. In order to force spawn to return before the child process exits an - :exc:`OSError` should be thrown. + empty byte array should be returned to signal end of file. The default implementation for both functions will read and return up to 1024 bytes each time the function is called. The *master_read* callback is passed @@ -65,10 +69,6 @@ The :mod:`pty` module defines the following functions: process will quit without any input, *spawn* will then loop forever. If *master_read* signals EOF the same behavior results (on linux at least). - If both callbacks signal EOF then *spawn* will probably never return, unless - *select* throws an error on your platform when passed three empty lists. This - is a bug, documented in `issue 26228 `_. - Return the exit status value from :func:`os.waitpid` on the child process. :func:`waitstatus_to_exitcode` can be used to convert the exit status into diff --git a/Doc/library/py_compile.rst b/Doc/library/py_compile.rst index cac6dcb6..4fba4cba 100644 --- a/Doc/library/py_compile.rst +++ b/Doc/library/py_compile.rst @@ -125,21 +125,33 @@ byte-code cache files in the directory containing the source code. system external to Python like a build system. -.. function:: main(args=None) +Command-Line Interface +---------------------- - Compile several source files. The files named in *args* (or on the command - line, if *args* is ``None``) are compiled and the resulting byte-code is - cached in the normal manner. This function does not search a directory - structure to locate source files; it only compiles files named explicitly. - If ``'-'`` is the only parameter in args, the list of files is taken from - standard input. +This module can be invoked as a script to compile several source +files. The files named in *filenames* are compiled and the resulting +bytecode is cached in the normal manner. This program does not search +a directory structure to locate source files; it only compiles files +named explicitly. The exit status is nonzero if one of the files could +not be compiled. - .. versionchanged:: 3.2 - Added support for ``'-'``. +.. program:: python -m py_compile + +.. cmdoption:: ... + - + + Positional arguments are files to compile. If ``-`` is the only + parameter, the list of files is taken from standard input. + +.. cmdoption:: -q, --quiet + + Suppress errors output. + +.. versionchanged:: 3.2 + Added support for ``-``. -When this module is run as a script, the :func:`main` is used to compile all the -files named on the command line. The exit status is nonzero if one of the files -could not be compiled. +.. versionchanged:: 3.10 + Added support for :option:`-q`. .. seealso:: diff --git a/Doc/library/pyclbr.rst b/Doc/library/pyclbr.rst index 36e83e85..1c40ba48 100644 --- a/Doc/library/pyclbr.rst +++ b/Doc/library/pyclbr.rst @@ -97,6 +97,13 @@ statements. They have the following attributes: .. versionadded:: 3.7 +.. attribute:: Function.is_async + + ``True`` for functions that are defined with the ``async`` prefix, ``False`` otherwise. + + .. versionadded:: 3.10 + + .. _pyclbr-class-objects: Class Objects diff --git a/Doc/library/pydoc.rst b/Doc/library/pydoc.rst index f956b9d2..94daf4a5 100644 --- a/Doc/library/pydoc.rst +++ b/Doc/library/pydoc.rst @@ -18,7 +18,7 @@ The :mod:`pydoc` module automatically generates documentation from Python modules. The documentation can be presented as pages of text on the console, -served to a Web browser, or saved to HTML files. +served to a web browser, or saved to HTML files. For modules, classes, functions and methods, the displayed documentation is derived from the docstring (i.e. the :attr:`__doc__` attribute) of the object, @@ -65,9 +65,9 @@ manner similar to the Unix :program:`man` command. The synopsis line of a module is the first line of its documentation string. You can also use :program:`pydoc` to start an HTTP server on the local machine -that will serve documentation to visiting Web browsers. :program:`pydoc -p 1234` +that will serve documentation to visiting web browsers. :program:`pydoc -p 1234` will start a HTTP server on port 1234, allowing you to browse the -documentation at ``http://localhost:1234/`` in your preferred Web browser. +documentation at ``http://localhost:1234/`` in your preferred web browser. Specifying ``0`` as the port number will select an arbitrary unused port. :program:`pydoc -n ` will start the server listening at the given diff --git a/Doc/library/queue.rst b/Doc/library/queue.rst index def39eae..0ec5900b 100644 --- a/Doc/library/queue.rst +++ b/Doc/library/queue.rst @@ -138,7 +138,7 @@ provide the public methods described below. .. method:: Queue.put_nowait(item) - Equivalent to ``put(item, block=False)``. + Equivalent to ``put(item, False)``. .. method:: Queue.get(block=True, timeout=None) @@ -249,7 +249,7 @@ SimpleQueue Objects .. method:: SimpleQueue.put_nowait(item) - Equivalent to ``put(item, block=False)``, provided for compatibility with + Equivalent to ``put(item)``, provided for compatibility with :meth:`Queue.put_nowait`. diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 758d1292..e924127d 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -135,6 +135,16 @@ Functions for integers values. Formerly it used a style like ``int(random()*n)`` which could produce slightly uneven distributions. + .. deprecated:: 3.10 + The automatic conversion of non-integer types to equivalent integers is + deprecated. Currently ``randrange(10.0)`` is losslessly converted to + ``randrange(10)``. In the future, this will raise a :exc:`TypeError`. + + .. deprecated:: 3.10 + The exception raised for non-integral values such as ``randrange(10.5)`` + or ``randrange('10')`` will be changed from :exc:`ValueError` to + :exc:`TypeError`. + .. function:: randint(a, b) Return a random integer *N* such that ``a <= N <= b``. Alias for @@ -181,8 +191,8 @@ Functions for sequences The *weights* or *cum_weights* can use any numeric type that interoperates with the :class:`float` values returned by :func:`random` (that includes - integers, floats, and fractions but excludes decimals). Behavior is - undefined if any weight is negative. A :exc:`ValueError` is raised if all + integers, floats, and fractions but excludes decimals). Weights are assumed + to be non-negative and finite. A :exc:`ValueError` is raised if all weights are zero. For a given seed, the :func:`choices` function with equal weighting @@ -316,9 +326,9 @@ be found in any statistics text. .. function:: gauss(mu, sigma) - Gaussian distribution. *mu* is the mean, and *sigma* is the standard - deviation. This is slightly faster than the :func:`normalvariate` function - defined below. + Normal distribution, also called the Gaussian distribution. *mu* is the mean, + and *sigma* is the standard deviation. This is slightly faster than + the :func:`normalvariate` function defined below. Multithreading note: When two threads call this function simultaneously, it is possible that they will receive the @@ -502,9 +512,9 @@ between the effects of a drug versus a placebo:: Simulation of arrival times and service deliveries for a multiserver queue:: - from heapq import heapify, heapreplace + from heapq import heappush, heappop from random import expovariate, gauss - from statistics import mean, median, stdev + from statistics import mean, quantiles average_arrival_interval = 5.6 average_service_time = 15.0 @@ -514,18 +524,17 @@ Simulation of arrival times and service deliveries for a multiserver queue:: waits = [] arrival_time = 0.0 servers = [0.0] * num_servers # time when each server becomes available - heapify(servers) - for i in range(1_000_000): + for i in range(100_000): arrival_time += expovariate(1.0 / average_arrival_interval) - next_server_available = servers[0] + next_server_available = heappop(servers) wait = max(0.0, next_server_available - arrival_time) waits.append(wait) - service_duration = max(0.0, gauss(average_service_time, stdev_service_time)) + service_duration = gauss(average_service_time, stdev_service_time) service_completed = arrival_time + wait + service_duration - heapreplace(servers, service_completed) + heappush(servers, service_completed) - print(f'Mean wait: {mean(waits):.1f}. Stdev wait: {stdev(waits):.1f}.') - print(f'Median wait: {median(waits):.1f}. Max wait: {max(waits):.1f}.') + print(f'Mean wait: {mean(waits):.1f} Max wait: {max(waits):.1f}') + print('Quartiles:', [round(q, 1) for q in quantiles(waits)]) .. seealso:: diff --git a/Doc/library/re.rst b/Doc/library/re.rst index b12ce4b9..ff7687cc 100644 --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -1572,7 +1572,7 @@ find all of the adverbs in some text, they might use :func:`findall` in the following manner:: >>> text = "He was carefully disguised but captured quickly by police." - >>> re.findall(r"\w+ly\b", text) + >>> re.findall(r"\w+ly", text) ['carefully', 'quickly'] @@ -1586,7 +1586,7 @@ a writer wanted to find all of the adverbs *and their positions* in some text, they would use :func:`finditer` in the following manner:: >>> text = "He was carefully disguised but captured quickly by police." - >>> for m in re.finditer(r"\w+ly\b", text): + >>> for m in re.finditer(r"\w+ly", text): ... print('%02d-%02d: %s' % (m.start(), m.end(), m.group(0))) 07-16: carefully 40-47: quickly diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst index eae0a6df..4d485d25 100644 --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -258,7 +258,9 @@ with a custom completer, a different set of word delimiters should be set. Get the beginning or ending index of the completion scope. These indexes are the *start* and *end* arguments passed to the :c:data:`rl_attempted_completion_function` callback of the - underlying library. + underlying library. The values may be different in the same + input editing scenario based on the underlying C readline implementation. + Ex: libedit is known to behave differently than libreadline. .. function:: set_completer_delims(string) diff --git a/Doc/library/resource.rst b/Doc/library/resource.rst index c8c1348b..67e9b44f 100644 --- a/Doc/library/resource.rst +++ b/Doc/library/resource.rst @@ -257,6 +257,14 @@ platform. .. versionadded:: 3.4 +.. data:: RLIMIT_KQUEUES + + The maximum number of kqueues this user id is allowed to create. + + .. availability:: FreeBSD 11 or later. + + .. versionadded:: 3.10 + Resource Usage -------------- diff --git a/Doc/library/runpy.rst b/Doc/library/runpy.rst index 26a4f143..af35e81a 100644 --- a/Doc/library/runpy.rst +++ b/Doc/library/runpy.rst @@ -93,7 +93,7 @@ The :mod:`runpy` module provides two functions: run this way, as well as ensuring the real module name is always accessible as ``__spec__.name``. -.. function:: run_path(path_name, init_globals=None, run_name=None) +.. function:: run_path(file_path, init_globals=None, run_name=None) .. index:: module: __main__ @@ -140,7 +140,7 @@ The :mod:`runpy` module provides two functions: A number of alterations are also made to the :mod:`sys` module. Firstly, ``sys.path`` may be altered as described above. ``sys.argv[0]`` is updated - with the value of ``path_name`` and ``sys.modules[__name__]`` is updated + with the value of ``file_path`` and ``sys.modules[__name__]`` is updated with a temporary module object for the module being executed. All modifications to items in :mod:`sys` are reverted before the function returns. diff --git a/Doc/library/secrets.rst b/Doc/library/secrets.rst index c22da727..afa8e2d3 100644 --- a/Doc/library/secrets.rst +++ b/Doc/library/secrets.rst @@ -193,7 +193,7 @@ suitable for password recovery applications: .. testcode:: import secrets - url = 'https://example.com/reset=' + secrets.token_urlsafe() + url = 'https://mydomain.com/reset=' + secrets.token_urlsafe() diff --git a/Doc/library/security_warnings.rst b/Doc/library/security_warnings.rst index 8432248d..26b015c0 100644 --- a/Doc/library/security_warnings.rst +++ b/Doc/library/security_warnings.rst @@ -7,12 +7,14 @@ Security Considerations The following modules have specific security considerations: +* :mod:`base64`: :ref:`base64 security considerations ` in + :rfc:`4648` * :mod:`cgi`: :ref:`CGI security considerations ` * :mod:`hashlib`: :ref:`all constructors take a "usedforsecurity" keyword-only argument disabling known insecure and blocked algorithms ` * :mod:`http.server` is not suitable for production use, only implementing - basic security checks. See the :ref:`security considerations `. + basic security checks * :mod:`logging`: :ref:`Logging configuration uses eval() ` * :mod:`multiprocessing`: :ref:`Connection.recv() uses pickle diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index 98ad4082..684f239e 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -25,8 +25,9 @@ lots of shared sub-objects. The keys are ordinary strings. database file is opened for reading and writing. The optional *flag* parameter has the same interpretation as the *flag* parameter of :func:`dbm.open`. - By default, version 3 pickles are used to serialize values. The version of the - pickle protocol can be specified with the *protocol* parameter. + By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used + to serialize values. The version of the pickle protocol can be specified + with the *protocol* parameter. Because of Python semantics, a shelf cannot know when a mutable persistent-dictionary entry is modified. By default modified objects are @@ -40,6 +41,10 @@ lots of shared sub-objects. The keys are ordinary strings. determine which accessed entries are mutable, nor which ones were actually mutated). + .. versionchanged:: 3.10 + :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle + protocol. + .. note:: Do not rely on the shelf being closed automatically; always call @@ -111,9 +116,10 @@ Restrictions A subclass of :class:`collections.abc.MutableMapping` which stores pickled values in the *dict* object. - By default, version 3 pickles are used to serialize values. The version of the - pickle protocol can be specified with the *protocol* parameter. See the - :mod:`pickle` documentation for a discussion of the pickle protocols. + By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used + to serialize values. The version of the pickle protocol can be specified + with the *protocol* parameter. See the :mod:`pickle` documentation for a + discussion of the pickle protocols. If the *writeback* parameter is ``True``, the object will hold a cache of all entries accessed and write them back to the *dict* at sync and close times. @@ -133,6 +139,10 @@ Restrictions .. versionchanged:: 3.4 Added context manager support. + .. versionchanged:: 3.10 + :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle + protocol. + .. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8') diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst index 7f7f0c7f..aab6a543 100644 --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -61,6 +61,20 @@ The :mod:`shlex` module defines the following functions: string that can safely be used as one token in a shell command line, for cases where you cannot use a list. + .. _shlex-quote-warning: + + .. warning:: + + The ``shlex`` module is **only designed for Unix shells**. + + The :func:`quote` function is not guaranteed to be correct on non-POSIX + compliant shells or shells from other operating systems such as Windows. + Executing commands quoted by this module on such shells can open up the + possibility of a command injection vulnerability. + + Consider using functions that pass command arguments with lists such as + :func:`subprocess.run` with ``shell=False``. + This idiom would be unsafe: >>> filename = 'somefile; rm -rf ~' diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst index 193c0100..11c67074 100644 --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -160,8 +160,7 @@ Directory and files operations Copies the file *src* to the file or directory *dst*. *src* and *dst* should be :term:`path-like objects ` or strings. If *dst* specifies a directory, the file will be copied into *dst* using the - base filename from *src*. If *dst* specifies a file that already exists, - it will be replaced. Returns the path to the newly created file. + base filename from *src*. Returns the path to the newly created file. If *follow_symlinks* is false, and *src* is a symbolic link, *dst* will be created as a symbolic link. If *follow_symlinks* @@ -231,8 +230,9 @@ Directory and files operations dirs_exist_ok=False) Recursively copy an entire directory tree rooted at *src* to a directory - named *dst* and return the destination directory. All intermediate - directories needed to contain *dst* will also be created by default. + named *dst* and return the destination directory. *dirs_exist_ok* dictates + whether to raise an exception in case *dst* or any missing parent directory + already exists. Permissions and times of directories are copied with :func:`copystat`, individual files are copied using :func:`~shutil.copy2`. @@ -263,14 +263,8 @@ Directory and files operations If *copy_function* is given, it must be a callable that will be used to copy each file. It will be called with the source path and the destination path - as arguments. By default, :func:`~shutil.copy2` is used, but any function - that supports the same signature (like :func:`~shutil.copy`) can be used. - - If *dirs_exist_ok* is false (the default) and *dst* already exists, a - :exc:`FileExistsError` is raised. If *dirs_exist_ok* is true, the copying - operation will continue if it encounters existing directories, and files - within the *dst* tree will be overwritten by corresponding files from the - *src* tree. +   as arguments. By default, :func:`~shutil.copy2` is used, but any function +   that supports the same signature (like :func:`~shutil.copy`) can be used. .. audit-event:: shutil.copytree src,dst shutil.copytree @@ -281,7 +275,7 @@ Directory and files operations .. versionchanged:: 3.2 Added the *copy_function* argument to be able to provide a custom copy function. - Added the *ignore_dangling_symlinks* argument to silence dangling symlinks + Added the *ignore_dangling_symlinks* argument to silent dangling symlinks errors when *symlinks* is false. .. versionchanged:: 3.8 @@ -476,7 +470,42 @@ file then shutil will silently fallback on using less efficient copytree example ~~~~~~~~~~~~~~~~ -An example that uses the :func:`ignore_patterns` helper:: +This example is the implementation of the :func:`copytree` function, described +above, with the docstring omitted. It demonstrates many of the other functions +provided by this module. :: + + def copytree(src, dst, symlinks=False): + names = os.listdir(src) + os.makedirs(dst) + errors = [] + for name in names: + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if symlinks and os.path.islink(srcname): + linkto = os.readlink(srcname) + os.symlink(linkto, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks) + else: + copy2(srcname, dstname) + # XXX What about devices, sockets etc.? + except OSError as why: + errors.append((srcname, dstname, str(why))) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + try: + copystat(src, dst) + except OSError as why: + # can't copy file access times on Windows + if why.winerror is None: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +Another example that uses the :func:`ignore_patterns` helper:: from shutil import copytree, ignore_patterns @@ -630,16 +659,10 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. .. audit-event:: shutil.unpack_archive filename,extract_dir,format shutil.unpack_archive - .. warning:: - - Never extract archives from untrusted sources without prior inspection. - It is possible that files are created outside of the path specified in - the *extract_dir* argument, e.g. members that have absolute filenames - starting with "/" or filenames with two dots "..". - .. versionchanged:: 3.7 Accepts a :term:`path-like object` for *filename* and *extract_dir*. + .. function:: register_unpack_format(name, extensions, function[, extra_args[, description]]) Registers an unpack format. *name* is the name of the format and diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 1a419f42..84a569d0 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -46,9 +46,6 @@ This has consequences: arbitrary amount of time, regardless of any signals received. The Python signal handlers will be called when the calculation finishes. -* If the handler raises an exception, it will be raised "out of thin air" in - the main thread. See the :ref:`note below ` for a - discussion. .. _signals-and-threads: @@ -419,7 +416,7 @@ The :mod:`signal` module defines the following functions: :data:`SIGKILL` and :data:`SIGSTOP` cannot be blocked. - .. availability:: Unix. See the man page :manpage:`sigprocmask(3)` and + .. availability:: Unix. See the man page :manpage:`sigprocmask(2)` and :manpage:`pthread_sigmask(3)` for further information. See also :func:`pause`, :func:`sigpending` and :func:`sigwait`. @@ -676,75 +673,7 @@ case, wrap your entry point to catch this exception as follows:: if __name__ == '__main__': main() -Do not set :const:`SIGPIPE`'s disposition to :const:`SIG_DFL` in -order to avoid :exc:`BrokenPipeError`. Doing that would cause -your program to exit unexpectedly whenever any socket -connection is interrupted while your program is still writing to -it. - -.. _handlers-and-exceptions: - -Note on Signal Handlers and Exceptions --------------------------------------- - -If a signal handler raises an exception, the exception will be propagated to -the main thread and may be raised after any :term:`bytecode` instruction. Most -notably, a :exc:`KeyboardInterrupt` may appear at any point during execution. -Most Python code, including the standard library, cannot be made robust against -this, and so a :exc:`KeyboardInterrupt` (or any other exception resulting from -a signal handler) may on rare occasions put the program in an unexpected state. - -To illustrate this issue, consider the following code:: - - class SpamContext: - def __init__(self): - self.lock = threading.Lock() - - def __enter__(self): - # If KeyboardInterrupt occurs here, everything is fine - self.lock.acquire() - # If KeyboardInterrupt occcurs here, __exit__ will not be called - ... - # KeyboardInterrupt could occur just before the function returns - - def __exit__(self, exc_type, exc_val, exc_tb): - ... - self.lock.release() - -For many programs, especially those that merely want to exit on -:exc:`KeyboardInterrupt`, this is not a problem, but applications that are -complex or require high reliability should avoid raising exceptions from signal -handlers. They should also avoid catching :exc:`KeyboardInterrupt` as a means -of gracefully shutting down. Instead, they should install their own -:const:`SIGINT` handler. Below is an example of an HTTP server that avoids -:exc:`KeyboardInterrupt`:: - - import signal - import socket - from selectors import DefaultSelector, EVENT_READ - from http.server import HTTPServer, SimpleHTTPRequestHandler - - interrupt_read, interrupt_write = socket.socketpair() - - def handler(signum, frame): - print('Signal handler called with signal', signum) - interrupt_write.send(b'\0') - signal.signal(signal.SIGINT, handler) - - def serve_forever(httpd): - sel = DefaultSelector() - sel.register(interrupt_read, EVENT_READ) - sel.register(httpd, EVENT_READ) - - while True: - for key, _ in sel.select(): - if key.fileobj == interrupt_read: - interrupt_read.recv(1) - return - if key.fileobj == httpd: - httpd.handle_request() - - print("Serving on port 8000") - httpd = HTTPServer(('', 8000), SimpleHTTPRequestHandler) - serve_forever(httpd) - print("Shutdown...") +Do not set :const:`SIGPIPE`'s disposition to :const:`SIG_DFL` +in order to avoid :exc:`BrokenPipeError`. Doing that would cause +your program to exit unexpectedly also whenever any socket connection +is interrupted while your program is still writing to it. diff --git a/Doc/library/smtpd.rst b/Doc/library/smtpd.rst index 8fd009e5..803430f1 100644 --- a/Doc/library/smtpd.rst +++ b/Doc/library/smtpd.rst @@ -3,7 +3,6 @@ .. module:: smtpd :synopsis: A SMTP server implementation in Python. - :deprecated: .. moduleauthor:: Barry Warsaw .. sectionauthor:: Moshe Zadka @@ -15,8 +14,6 @@ This module offers several classes to implement SMTP (email) servers. .. deprecated:: 3.6 - :mod:`smtpd` will be removed in Python 3.12 - (see :pep:`PEP 594 <594#smtpd>` for details). The `aiosmtpd `_ package is a recommended replacement for this module. It is based on :mod:`asyncio` and provides a more straightforward API. diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index c1a20fee..aaab6b11 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -15,7 +15,7 @@ -------------- The :mod:`smtplib` module defines an SMTP client session object that can be used -to send mail to any Internet machine with an SMTP or ESMTP listener daemon. For +to send mail to any internet machine with an SMTP or ESMTP listener daemon. For details of SMTP and ESMTP operation, consult :rfc:`821` (Simple Mail Transfer Protocol) and :rfc:`1869` (SMTP Service Extensions). @@ -32,7 +32,7 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions). than a success code, an :exc:`SMTPConnectError` is raised. The optional *timeout* parameter specifies a timeout in seconds for blocking operations like the connection attempt (if not specified, the global default timeout - setting will be used). If the timeout expires, :exc:`socket.timeout` is + setting will be used). If the timeout expires, :exc:`TimeoutError` is raised. The optional source_address parameter allows binding to some specific source address in a machine with multiple network interfaces, and/or to some specific source TCP port. It takes a 2-tuple @@ -279,9 +279,10 @@ An :class:`SMTP` instance has the following methods: response for ESMTP option and store them for use by :meth:`has_extn`. Also sets several informational attributes: the message returned by the server is stored as the :attr:`ehlo_resp` attribute, :attr:`does_esmtp` - is set to true or false depending on whether the server supports ESMTP, and - :attr:`esmtp_features` will be a dictionary containing the names of the - SMTP service extensions this server supports, and their parameters (if any). + is set to ``True`` or ``False`` depending on whether the server supports + ESMTP, and :attr:`esmtp_features` will be a dictionary containing the names + of the SMTP service extensions this server supports, and their parameters + (if any). Unless you wish to use :meth:`has_extn` before sending mail, it should not be necessary to call this method explicitly. It will be implicitly called by diff --git a/Doc/library/sndhdr.rst b/Doc/library/sndhdr.rst index 3ca36f27..6bfa9a9f 100644 --- a/Doc/library/sndhdr.rst +++ b/Doc/library/sndhdr.rst @@ -3,7 +3,6 @@ .. module:: sndhdr :synopsis: Determine type of a sound file. - :deprecated: .. sectionauthor:: Fred L. Drake, Jr. .. Based on comments in the module source file. @@ -14,10 +13,6 @@ single: A-LAW single: u-LAW -.. deprecated:: 3.11 - The :mod:`sndhdr` module is deprecated - (see :pep:`PEP 594 <594#sndhdr>` for details and alternatives). - -------------- The :mod:`sndhdr` provides utility functions which attempt to determine the type diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index f0a1338e..3c818588 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -66,7 +66,7 @@ created. Socket addresses are represented as follows: .. _host_port: - A pair ``(host, port)`` is used for the :const:`AF_INET` address family, - where *host* is a string representing either a hostname in Internet domain + where *host* is a string representing either a hostname in internet domain notation like ``'daring.cwi.nl'`` or an IPv4 address like ``'100.50.200.5'``, and *port* is an integer. @@ -197,15 +197,11 @@ created. Socket addresses are represented as follows: - *addr* - Optional bytes-like object specifying the hardware physical address, whose interpretation depends on the device. - .. availability:: Linux >= 2.2. - - :const:`AF_QIPCRTR` is a Linux-only socket based interface for communicating with services running on co-processors in Qualcomm platforms. The address family is represented as a ``(node, port)`` tuple where the *node* and *port* are non-negative integers. - .. availability:: Linux >= 4.7. - .. versionadded:: 3.8 - :const:`IPPROTO_UDPLITE` is a variant of UDP which allows you to specify @@ -287,6 +283,8 @@ Exceptions .. exception:: timeout + A deprecated alias of :exc:`TimeoutError`. + A subclass of :exc:`OSError`, this exception is raised when a timeout occurs on a socket which has had timeouts enabled via a prior call to :meth:`~socket.settimeout` (or implicitly through @@ -296,6 +294,9 @@ Exceptions .. versionchanged:: 3.3 This class was made a subclass of :exc:`OSError`. + .. versionchanged:: 3.10 + This class was made an alias of :exc:`TimeoutError`. + Constants ^^^^^^^^^ @@ -378,6 +379,11 @@ Constants On Windows, ``TCP_KEEPIDLE``, ``TCP_KEEPINTVL`` appear if run-time Windows supports. + .. versionchanged:: 3.10 + ``IP_RECVTOS`` was added. + Added ``TCP_KEEPALIVE``. On MacOS this constant can be used in the same + way that ``TCP_KEEPIDLE`` is used on Linux. + .. data:: AF_CAN PF_CAN SOL_CAN_* @@ -552,7 +558,7 @@ Creating sockets The following functions all create :ref:`socket objects `. -.. class:: socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) +.. function:: socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) Create a new socket using the given address family, socket type and protocol number. The address family should be :const:`AF_INET` (the default), @@ -609,6 +615,9 @@ The following functions all create :ref:`socket objects `. .. versionchanged:: 3.9 The CAN_J1939 protocol was added. + .. versionchanged:: 3.10 + The IPPROTO_MPTCP protocol was added. + .. function:: socketpair([family[, type[, proto]]]) Build a pair of connected socket objects using the given address family, socket @@ -631,7 +640,7 @@ The following functions all create :ref:`socket objects `. .. function:: create_connection(address[, timeout[, source_address]]) - Connect to a TCP service listening on the Internet *address* (a 2-tuple + Connect to a TCP service listening on the internet *address* (a 2-tuple ``(host, port)``), and return the socket object. This is a higher-level function than :meth:`socket.connect`: if *host* is a non-numeric hostname, it will try to resolve it for both :data:`AF_INET` and :data:`AF_INET6`, @@ -781,9 +790,9 @@ The :mod:`socket` module also offers various network-related services: system if IPv6 isn't enabled):: >>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) - [(, , + [(, , 6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)), - (, , + (, , 6, '', ('93.184.216.34', 80))] .. versionchanged:: 3.2 @@ -818,8 +827,8 @@ The :mod:`socket` module also offers various network-related services: .. function:: gethostbyname_ex(hostname) Translate a host name to IPv4 address format, extended interface. Return a - triple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the host's - primary host name, *aliaslist* is a (possibly + triple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the primary + host name responding to the given *ip_address*, *aliaslist* is a (possibly empty) list of alternative host names for the same address, and *ipaddrlist* is a list of IPv4 addresses for the same interface on the same host (often but not always a single address). :func:`gethostbyname_ex` does not support IPv6 name @@ -869,7 +878,7 @@ The :mod:`socket` module also offers various network-related services: .. function:: getprotobyname(protocolname) - Translate an Internet protocol name (for example, ``'icmp'``) to a constant + Translate an internet protocol name (for example, ``'icmp'``) to a constant suitable for passing as the (optional) third argument to the :func:`.socket` function. This is usually only needed for sockets opened in "raw" mode (:const:`SOCK_RAW`); for the normal socket modes, the correct protocol is chosen @@ -878,7 +887,7 @@ The :mod:`socket` module also offers various network-related services: .. function:: getservbyname(servicename[, protocolname]) - Translate an Internet service name and protocol name to a port number for that + Translate an internet service name and protocol name to a port number for that service. The optional protocol name, if given, should be ``'tcp'`` or ``'udp'``, otherwise any protocol will match. @@ -887,7 +896,7 @@ The :mod:`socket` module also offers various network-related services: .. function:: getservbyport(port[, protocolname]) - Translate an Internet port number and protocol name to a service name for that + Translate an internet port number and protocol name to a service name for that service. The optional protocol name, if given, should be ``'tcp'`` or ``'udp'``, otherwise any protocol will match. @@ -907,11 +916,9 @@ The :mod:`socket` module also offers various network-related services: where the host byte order is the same as network byte order, this is a no-op; otherwise, it performs a 2-byte swap operation. - .. deprecated:: 3.7 - In case *x* does not fit in 16-bit unsigned integer, but does fit in a - positive C int, it is silently truncated to 16-bit unsigned integer. - This silent truncation feature is deprecated, and will raise an - exception in future versions of Python. + .. versionchanged:: 3.10 + Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned + integer. .. function:: htonl(x) @@ -927,11 +934,9 @@ The :mod:`socket` module also offers various network-related services: where the host byte order is the same as network byte order, this is a no-op; otherwise, it performs a 2-byte swap operation. - .. deprecated:: 3.7 - In case *x* does not fit in 16-bit unsigned integer, but does fit in a - positive C int, it is silently truncated to 16-bit unsigned integer. - This silent truncation feature is deprecated, and will raise an - exception in future versions of Python. + .. versionchanged:: 3.10 + Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned + integer. .. function:: inet_aton(ip_string) @@ -1239,7 +1244,7 @@ to sockets. address family --- see above.) If the connection is interrupted by a signal, the method waits until the - connection completes, or raise a :exc:`socket.timeout` on timeout, if the + connection completes, or raise a :exc:`TimeoutError` on timeout, if the signal handler doesn't raise an exception and the socket is blocking or has a timeout. For non-blocking sockets, the method raises an :exc:`InterruptedError` exception if the connection is interrupted by a diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst index 232c0616..b65a3e8f 100644 --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -15,7 +15,7 @@ There are four basic concrete server classes: .. class:: TCPServer(server_address, RequestHandlerClass, bind_and_activate=True) - This uses the Internet TCP protocol, which provides for + This uses the internet TCP protocol, which provides for continuous streams of data between the client and server. If *bind_and_activate* is true, the constructor automatically attempts to invoke :meth:`~BaseServer.server_bind` and @@ -263,7 +263,7 @@ Server Objects The address on which the server is listening. The format of addresses varies depending on the protocol family; see the documentation for the :mod:`socket` module - for details. For Internet protocols, this is a tuple containing a string giving + for details. For internet protocols, this is a tuple containing a string giving the address, and an integer port number: ``('127.0.0.1', 80)``, for example. diff --git a/Doc/library/spwd.rst b/Doc/library/spwd.rst index 40f50de0..c6cad2a3 100644 --- a/Doc/library/spwd.rst +++ b/Doc/library/spwd.rst @@ -4,11 +4,6 @@ .. module:: spwd :platform: Unix :synopsis: The shadow password database (getspnam() and friends). - :deprecated: - -.. deprecated:: 3.11 - The :mod:`spwd` module is deprecated - (see :pep:`PEP 594 <594#spwd>` for details and alternatives). -------------- diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index d4ba3e26..d29e425c 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -17,20 +17,20 @@ SQLite for internal data storage. It's also possible to prototype an application using SQLite and then port the code to a larger database such as PostgreSQL or Oracle. -The sqlite3 module was written by Gerhard Häring. It provides an SQL interface -compliant with the DB-API 2.0 specification described by :pep:`249`. +The sqlite3 module was written by Gerhard Häring. It provides a SQL interface +compliant with the DB-API 2.0 specification described by :pep:`249`, and +requires SQLite 3.7.15 or newer. -To use the module, start by creating a :class:`Connection` object that +To use the module, you must first create a :class:`Connection` object that represents the database. Here the data will be stored in the :file:`example.db` file:: import sqlite3 con = sqlite3.connect('example.db') -The special path name ``:memory:`` can be provided to create a temporary -database in RAM. +You can also supply the special name ``:memory:`` to create a database in RAM. -Once a :class:`Connection` has been established, create a :class:`Cursor` object +Once you have a :class:`Connection`, you can create a :class:`Cursor` object and call its :meth:`~Cursor.execute` method to perform SQL commands:: cur = con.cursor() @@ -49,17 +49,16 @@ and call its :meth:`~Cursor.execute` method to perform SQL commands:: # Just be sure any changes have been committed or they will be lost. con.close() -The saved data is persistent: it can be reloaded in a subsequent session even -after restarting the Python interpreter:: +The data you've saved is persistent and is available in subsequent sessions:: import sqlite3 con = sqlite3.connect('example.db') cur = con.cursor() -To retrieve data after executing a SELECT statement, either treat the cursor as -an :term:`iterator`, call the cursor's :meth:`~Cursor.fetchone` method to -retrieve a single matching row, or call :meth:`~Cursor.fetchall` to get a list -of the matching rows. +To retrieve data after executing a SELECT statement, you can either treat the +cursor as an :term:`iterator`, call the cursor's :meth:`~Cursor.fetchone` method to +retrieve a single matching row, or call :meth:`~Cursor.fetchall` to get a list of the +matching rows. This example uses the iterator form:: @@ -74,27 +73,27 @@ This example uses the iterator form:: .. _sqlite3-placeholders: -SQL operations usually need to use values from Python variables. However, -beware of using Python's string operations to assemble queries, as they -are vulnerable to SQL injection attacks (see the `xkcd webcomic -`_ for a humorous example of what can go wrong):: +Usually your SQL operations will need to use values from Python variables. You +shouldn't assemble your query using Python's string operations because doing so +is insecure; it makes your program vulnerable to an SQL injection attack +(see the `xkcd webcomic `_ for a humorous example of +what can go wrong):: # Never do this -- insecure! symbol = 'RHAT' cur.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) -Instead, use the DB-API's parameter substitution. To insert a variable into a -query string, use a placeholder in the string, and substitute the actual values -into the query by providing them as a :class:`tuple` of values to the second -argument of the cursor's :meth:`~Cursor.execute` method. An SQL statement may +Instead, use the DB-API's parameter substitution. Put a placeholder wherever +you want to use a value, and then provide a tuple of values as the second +argument to the cursor's :meth:`~Cursor.execute` method. An SQL statement may use one of two kinds of placeholders: question marks (qmark style) or named placeholders (named style). For the qmark style, ``parameters`` must be a :term:`sequence `. For the named style, it can be either a :term:`sequence ` or :class:`dict` instance. The length of the :term:`sequence ` must match the number of placeholders, or a :exc:`ProgrammingError` is raised. If a :class:`dict` is given, it must contain -keys for all named parameters. Any extra items are ignored. Here's an example of -both styles: +keys for all named parameters. Any extra items are ignored. Here's an example +of both styles: .. literalinclude:: ../includes/sqlite3/execute_1.py @@ -118,24 +117,6 @@ Module functions and constants ------------------------------ -.. data:: apilevel - - String constant stating the supported DB-API level. Required by the DB-API. - Hard-coded to ``"2.0"``. - -.. data:: paramstyle - - String constant stating the type of parameter marker formatting expected by - the :mod:`sqlite3` module. Required by the DB-API. Hard-coded to - ``"qmark"``. - - .. note:: - - The :mod:`sqlite3` module supports both ``qmark`` and ``numeric`` DB-API - parameter styles, because that is what the underlying SQLite library - supports. However, the DB-API does not allow multiple values for - the ``paramstyle`` attribute. - .. data:: version The version number of this module, as a string. This is not the version of @@ -158,26 +139,6 @@ Module functions and constants The version number of the run-time SQLite library, as a tuple of integers. -.. data:: threadsafety - - Integer constant required by the DB-API, stating the level of thread safety - the :mod:`sqlite3` module supports. Currently hard-coded to ``1``, meaning - *"Threads may share the module, but not connections."* However, this may not - always be true. You can check the underlying SQLite library's compile-time - threaded mode using the following query:: - - import sqlite3 - con = sqlite3.connect(":memory:") - con.execute(""" - select * from pragma_compile_options - where compile_options like 'THREADSAFE=%' - """).fetchall() - - Note that the `SQLITE_THREADSAFE levels - `_ do not match the DB-API 2.0 - ``threadsafety`` levels. - - .. data:: PARSE_DECLTYPES This constant is meant to be used with the *detect_types* parameter of the @@ -254,30 +215,17 @@ Module functions and constants for the connection, you can set the *cached_statements* parameter. The currently implemented default is to cache 100 statements. - If *uri* is :const:`True`, *database* is interpreted as a - :abbr:`URI (Uniform Resource Identifier)` with a file path and an optional - query string. The scheme part *must* be ``"file:"``. The path can be a - relative or absolute file path. The query string allows us to pass - parameters to SQLite. Some useful URI tricks include:: + If *uri* is true, *database* is interpreted as a URI. This allows you + to specify options. For example, to open a database in read-only mode + you can use:: - # Open a database in read-only mode. - con = sqlite3.connect("file:template.db?mode=ro", uri=True) + db = sqlite3.connect('file:path/to/database?mode=ro', uri=True) - # Don't implicitly create a new database file if it does not already exist. - # Will raise sqlite3.OperationalError if unable to open a database file. - con = sqlite3.connect("file:nosuchdb.db?mode=rw", uri=True) - - # Create a shared named in-memory database. - con1 = sqlite3.connect("file:mem1?mode=memory&cache=shared", uri=True) - con2 = sqlite3.connect("file:mem1?mode=memory&cache=shared", uri=True) - con1.executescript("create table t(t); insert into t values(28);") - rows = con2.execute("select * from t").fetchall() - - More information about this feature, including a list of recognized - parameters, can be found in the - `SQLite URI documentation `_. + More information about this feature, including a list of recognized options, can + be found in the `SQLite URI documentation `_. .. audit-event:: sqlite3.connect database sqlite3.connect + .. audit-event:: sqlite3.connect/handle connection_handle sqlite3.connect .. versionchanged:: 3.4 Added the *uri* parameter. @@ -285,6 +233,9 @@ Module functions and constants .. versionchanged:: 3.7 *database* can now also be a :term:`path-like object`, not only a string. + .. versionchanged:: 3.10 + Added the ``sqlite3.connect/handle`` auditing event. + .. function:: register_converter(typename, callable) @@ -332,7 +283,7 @@ Connection Objects .. class:: Connection - An SQLite database connection has the following attributes and methods: + A SQLite database connection has the following attributes and methods: .. attribute:: isolation_level @@ -373,21 +324,24 @@ Connection Objects .. method:: execute(sql[, parameters]) - Create a new :class:`Cursor` object and call - :meth:`~Cursor.execute` on it with the given *sql* and *parameters*. - Return the new cursor object. + This is a nonstandard shortcut that creates a cursor object by calling + the :meth:`~Connection.cursor` method, calls the cursor's + :meth:`~Cursor.execute` method with the *parameters* given, and returns + the cursor. .. method:: executemany(sql[, parameters]) - Create a new :class:`Cursor` object and call - :meth:`~Cursor.executemany` on it with the given *sql* and *parameters*. - Return the new cursor object. + This is a nonstandard shortcut that creates a cursor object by + calling the :meth:`~Connection.cursor` method, calls the cursor's + :meth:`~Cursor.executemany` method with the *parameters* given, and + returns the cursor. .. method:: executescript(sql_script) - Create a new :class:`Cursor` object and call - :meth:`~Cursor.executescript` on it with the given *sql_script*. - Return the new cursor object. + This is a nonstandard shortcut that creates a cursor object by + calling the :meth:`~Connection.cursor` method, calls the cursor's + :meth:`~Cursor.executescript` method with the given *sql_script*, and + returns the cursor. .. method:: create_function(name, num_params, func, *, deterministic=False) @@ -525,20 +479,30 @@ Connection Objects Loadable extensions are disabled by default. See [#f1]_. + .. audit-event:: sqlite3.enable_load_extension connection,enabled sqlite3.enable_load_extension + .. versionadded:: 3.2 + .. versionchanged:: 3.10 + Added the ``sqlite3.enable_load_extension`` auditing event. + .. literalinclude:: ../includes/sqlite3/load_extension.py .. method:: load_extension(path) - This routine loads an SQLite extension from a shared library. You have to + This routine loads a SQLite extension from a shared library. You have to enable extension loading with :meth:`enable_load_extension` before you can use this routine. Loadable extensions are disabled by default. See [#f1]_. + .. audit-event:: sqlite3.load_extension connection,path sqlite3.load_extension + .. versionadded:: 3.2 + .. versionchanged:: 3.10 + Added the ``sqlite3.load_extension`` auditing event. + .. attribute:: row_factory You can change this attribute to a callable that accepts the cursor and the @@ -564,8 +528,8 @@ Connection Objects Using this attribute you can control what objects are returned for the ``TEXT`` data type. By default, this attribute is set to :class:`str` and the - :mod:`sqlite3` module will return :class:`str` objects for ``TEXT``. - If you want to return :class:`bytes` instead, you can set it to :class:`bytes`. + :mod:`sqlite3` module will return Unicode objects for ``TEXT``. If you want to + return bytestrings instead, you can set it to :class:`bytes`. You can also set it to any other callable that accepts a single bytestring parameter and returns the resulting object. @@ -602,7 +566,7 @@ Connection Objects .. method:: backup(target, *, pages=-1, progress=None, name="main", sleep=0.250) - This method makes a backup of an SQLite database even while it's being accessed + This method makes a backup of a SQLite database even while it's being accessed by other clients, or concurrently by the same connection. The copy will be written into the mandatory argument *target*, that must be another :class:`Connection` instance. @@ -648,8 +612,6 @@ Connection Objects dest = sqlite3.connect(':memory:') source.backup(dest) - Availability: SQLite 3.6.11 or higher - .. versionadded:: 3.7 @@ -739,14 +701,6 @@ Cursor Objects The cursor will be unusable from this point forward; a :exc:`ProgrammingError` exception will be raised if any operation is attempted with the cursor. - .. method:: setinputsizes(sizes) - - Required by the DB-API. Does nothing in :mod:`sqlite3`. - - .. method:: setoutputsize(size [, column]) - - Required by the DB-API. Does nothing in :mod:`sqlite3`. - .. attribute:: rowcount Although the :class:`Cursor` class of the :mod:`sqlite3` module implements this @@ -762,20 +716,16 @@ Cursor Objects statements because we cannot determine the number of rows a query produced until all rows were fetched. - With SQLite versions before 3.6.5, :attr:`rowcount` is set to 0 if - you make a ``DELETE FROM table`` without any condition. - .. attribute:: lastrowid - This read-only attribute provides the row id of the last inserted row. It - is only updated after successful ``INSERT`` or ``REPLACE`` statements - using the :meth:`execute` method. For other statements, after - :meth:`executemany` or :meth:`executescript`, or if the insertion failed, - the value of ``lastrowid`` is left unchanged. The initial value of - ``lastrowid`` is :const:`None`. + This read-only attribute provides the rowid of the last modified row. It is + only set if you issued an ``INSERT`` or a ``REPLACE`` statement using the + :meth:`execute` method. For operations other than ``INSERT`` or + ``REPLACE`` or when :meth:`executemany` is called, :attr:`lastrowid` is + set to :const:`None`. - .. note:: - Inserts into ``WITHOUT ROWID`` tables are not recorded. + If the ``INSERT`` or ``REPLACE`` statement failed to insert the previous + successful rowid is returned. .. versionchanged:: 3.6 Added support for the ``REPLACE`` statement. @@ -962,7 +912,7 @@ This is how SQLite types are converted to Python types by default: +-------------+----------------------------------------------+ The type system of the :mod:`sqlite3` module is extensible in two ways: you can -store additional Python types in an SQLite database via object adaptation, and +store additional Python types in a SQLite database via object adaptation, and you can let the :mod:`sqlite3` module convert SQLite types to different Python types via converters. @@ -1076,12 +1026,6 @@ If a timestamp stored in SQLite has a fractional part longer than 6 numbers, its value will be truncated to microsecond precision by the timestamp converter. -.. note:: - - The default "timestamp" converter ignores UTC offsets in the database and - always returns a naive :class:`datetime.datetime` object. To preserve UTC - offsets in timestamps, either leave converters disabled, or register an - offset-aware converter with :func:`register_converter`. .. _sqlite3-controlling-transactions: @@ -1167,5 +1111,5 @@ committed: .. [#f1] The sqlite3 module is not built with loadable extension support by default, because some platforms (notably macOS) have SQLite libraries which are compiled without this feature. To get loadable - extension support, you must pass ``--enable-loadable-sqlite-extensions`` to - configure. + extension support, you must pass the + :option:`--enable-loadable-sqlite-extensions` option to configure. diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index af9bf798..4d756164 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -25,8 +25,8 @@ probably additional platforms, as long as OpenSSL is installed on that platform. Some behavior may be platform dependent, since calls are made to the operating system socket APIs. The installed version of OpenSSL may also - cause variations in behavior. For example, TLSv1.1 and TLSv1.2 come with - openssl version 1.0.1. + cause variations in behavior. For example, TLSv1.3 with OpenSSL version + 1.1.1. .. warning:: Don't use this module without reading the :ref:`ssl-security`. Doing so @@ -58,6 +58,13 @@ by SSL sockets created through the :meth:`SSLContext.wrap_socket` method. In the future the ssl module will require at least OpenSSL 1.0.2 or 1.1.0. +.. versionchanged:: 3.10 + + :pep:`644` has been implemented. The ssl module requires OpenSSL 1.1.1 + or newer. + + Use of deprecated constants and functions result in deprecation warnings. + Functions, Constants, and Exceptions ------------------------------------ @@ -131,8 +138,9 @@ purposes. :const:`None`, this function can choose to trust the system's default CA certificates instead. - The settings are: :data:`PROTOCOL_TLS`, :data:`OP_NO_SSLv2`, and - :data:`OP_NO_SSLv3` with high encryption cipher suites without RC4 and + The settings are: :data:`PROTOCOL_TLS_CLIENT` or + :data:`PROTOCOL_TLS_SERVER`, :data:`OP_NO_SSLv2`, and :data:`OP_NO_SSLv3` + with high encryption cipher suites without RC4 and without unauthenticated cipher suites. Passing :data:`~Purpose.SERVER_AUTH` as *purpose* sets :data:`~SSLContext.verify_mode` to :data:`CERT_REQUIRED` and either loads CA certificates (when at least one of *cafile*, *capath* or @@ -180,6 +188,12 @@ purposes. Support for key logging to :envvar:`SSLKEYLOGFILE` was added. + .. versionchanged:: 3.10 + + The context now uses :data:`PROTOCOL_TLS_CLIENT` or + :data:`PROTOCOL_TLS_SERVER` protocol instead of generic + :data:`PROTOCOL_TLS`. + Exceptions ^^^^^^^^^^ @@ -325,19 +339,6 @@ Random generation :func:`ssl.RAND_egd` and :func:`ssl.RAND_add` to increase the randomness of the pseudo-random number generator. -.. function:: RAND_egd(path) - - If you are running an entropy-gathering daemon (EGD) somewhere, and *path* - is the pathname of a socket connection open to it, this will read 256 bytes - of randomness from the socket, and add it to the SSL pseudo-random number - generator to increase the security of generated secret keys. This is - typically only necessary on systems without better sources of randomness. - - See http://egd.sourceforge.net/ or http://prngd.sourceforge.net/ for sources - of entropy-gathering daemons. - - .. availability:: not available with LibreSSL and OpenSSL > 1.1.0. - .. function:: RAND_add(bytes, entropy) Mix the given *bytes* into the SSL pseudo-random number generator. The @@ -425,7 +426,8 @@ Certificate handling previously. Return an integer (no fractions of a second in the input format) -.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS, ca_certs=None) +.. function:: get_server_certificate(addr, ssl_version=PROTOCOL_TLS_CLIENT, \ + ca_certs=None[, timeout]) Given the address ``addr`` of an SSL-protected server, as a (*hostname*, *port-number*) pair, fetches the server's certificate, and returns it as a @@ -435,7 +437,8 @@ Certificate handling same format as used for the same parameter in :meth:`SSLContext.wrap_socket`. The call will attempt to validate the server certificate against that set of root certificates, and will fail - if the validation attempt fails. + if the validation attempt fails. A timeout can be specified with the + ``timeout`` parameter. .. versionchanged:: 3.3 This function is now IPv6-compatible. @@ -444,6 +447,9 @@ Certificate handling The default *ssl_version* is changed from :data:`PROTOCOL_SSLv3` to :data:`PROTOCOL_TLS` for maximum compatibility with modern servers. + .. versionchanged:: 3.10 + The *timeout* parameter was added. + .. function:: DER_cert_to_PEM_cert(DER_cert_bytes) Given a certificate as a DER-encoded blob of bytes, returns a PEM-encoded @@ -634,6 +640,13 @@ Constants .. versionadded:: 3.4 +.. data:: VERIFY_ALLOW_PROXY_CERTS + + Possible value for :attr:`SSLContext.verify_flags` to enables proxy + certificate verification. + + .. versionadded:: 3.10 + .. data:: VERIFY_X509_TRUSTED_FIRST Possible value for :attr:`SSLContext.verify_flags`. It instructs OpenSSL to @@ -642,6 +655,17 @@ Constants .. versionadded:: 3.4.4 +.. data:: VERIFY_X509_PARTIAL_CHAIN + + Possible value for :attr:`SSLContext.verify_flags`. It instructs OpenSSL to + accept intermediate CAs in the trust store to be treated as trust-anchors, + in the same way as the self-signed root CA certificates. This makes it + possible to trust certificates issued by an intermediate CA without having + to trust its ancestor root CA. + + .. versionadded:: 3.10 + + .. class:: VerifyFlags :class:`enum.IntFlag` collection of VERIFY_* constants. @@ -655,19 +679,25 @@ Constants .. versionadded:: 3.6 + .. deprecated:: 3.10 + + TLS clients and servers require different default settings for secure + communication. The generic TLS protocol constant is deprecated in + favor of :data:`PROTOCOL_TLS_CLIENT` and :data:`PROTOCOL_TLS_SERVER`. + .. data:: PROTOCOL_TLS_CLIENT - Auto-negotiate the highest protocol version like :data:`PROTOCOL_TLS`, - but only support client-side :class:`SSLSocket` connections. The protocol - enables :data:`CERT_REQUIRED` and :attr:`~SSLContext.check_hostname` by - default. + Auto-negotiate the highest protocol version that both the client and + server support, and configure the context client-side connections. The + protocol enables :data:`CERT_REQUIRED` and + :attr:`~SSLContext.check_hostname` by default. .. versionadded:: 3.6 .. data:: PROTOCOL_TLS_SERVER - Auto-negotiate the highest protocol version like :data:`PROTOCOL_TLS`, - but only support server-side :class:`SSLSocket` connections. + Auto-negotiate the highest protocol version that both the client and + server support, and configure the context server-side connections. .. versionadded:: 3.6 @@ -708,7 +738,10 @@ Constants .. deprecated:: 3.6 OpenSSL has deprecated all version specific protocols. Use the default - protocol :data:`PROTOCOL_TLS` with flags like :data:`OP_NO_SSLv3` instead. + protocol :data:`PROTOCOL_TLS_SERVER` or :data:`PROTOCOL_TLS_CLIENT` + with :attr:`SSLContext.minimum_version` and + :attr:`SSLContext.maximum_version` instead. + .. data:: PROTOCOL_TLSv1 @@ -716,8 +749,7 @@ Constants .. deprecated:: 3.6 - OpenSSL has deprecated all version specific protocols. Use the default - protocol :data:`PROTOCOL_TLS` with flags like :data:`OP_NO_SSLv3` instead. + OpenSSL has deprecated all version specific protocols. .. data:: PROTOCOL_TLSv1_1 @@ -728,21 +760,18 @@ Constants .. deprecated:: 3.6 - OpenSSL has deprecated all version specific protocols. Use the default - protocol :data:`PROTOCOL_TLS` with flags like :data:`OP_NO_SSLv3` instead. + OpenSSL has deprecated all version specific protocols. .. data:: PROTOCOL_TLSv1_2 - Selects TLS version 1.2 as the channel encryption protocol. This is the - most modern version, and probably the best choice for maximum protection, - if both sides can speak it. Available only with openssl version 1.0.1+. + Selects TLS version 1.2 as the channel encryption protocol. + Available only with openssl version 1.0.1+. .. versionadded:: 3.4 .. deprecated:: 3.6 - OpenSSL has deprecated all version specific protocols. Use the default - protocol :data:`PROTOCOL_TLS` with flags like :data:`OP_NO_SSLv3` instead. + OpenSSL has deprecated all version specific protocols. .. data:: OP_ALL @@ -764,7 +793,6 @@ Constants SSLv2 is deprecated - .. data:: OP_NO_SSLv3 Prevents an SSLv3 connection. This option is only applicable in @@ -872,8 +900,6 @@ Constants Disable compression on the SSL channel. This is useful if the application protocol supports its own compression scheme. - This option is only available with OpenSSL 1.0.0 and later. - .. versionadded:: 3.3 .. class:: Options @@ -1030,7 +1056,7 @@ Constants Option for :func:`create_default_context` and :meth:`SSLContext.load_default_certs`. This value indicates that the - context may be used to authenticate Web servers (therefore, it will + context may be used to authenticate web servers (therefore, it will be used to create client-side sockets). .. versionadded:: 3.4 @@ -1039,7 +1065,7 @@ Constants Option for :func:`create_default_context` and :meth:`SSLContext.load_default_certs`. This value indicates that the - context may be used to authenticate Web clients (therefore, it will + context may be used to authenticate web clients (therefore, it will be used to create server-side sockets). .. versionadded:: 3.4 @@ -1072,6 +1098,11 @@ Constants SSL 3.0 to TLS 1.3. + .. deprecated:: 3.10 + + All :class:`TLSVersion` members except :attr:`TLSVersion.TLSv1_2` and + :attr:`TLSVersion.TLSv1_3` are deprecated. + SSL Sockets ----------- @@ -1126,6 +1157,11 @@ SSL Sockets to create instances directly. This was never documented or officially supported. + .. versionchanged:: 3.10 + Python now uses ``SSL_read_ex`` and ``SSL_write_ex`` internally. The + functions support reading and writing of data larger than 2 GB. Writing + zero-length data no longer fails with a protocol violation error. + SSL sockets also have the following additional methods and attributes: .. method:: SSLSocket.read(len=1024, buffer=None) @@ -1326,6 +1362,10 @@ SSL sockets also have the following additional methods and attributes: .. versionadded:: 3.3 + .. deprecated:: 3.10 + + NPN has been superseded by ALPN + .. method:: SSLSocket.unwrap() Performs the SSL shutdown handshake, which removes the TLS layer from the @@ -1357,7 +1397,7 @@ SSL sockets also have the following additional methods and attributes: .. method:: SSLSocket.version() Return the actual SSL protocol version negotiated by the connection - as a string, or ``None`` if no secure connection is established. + as a string, or ``None`` is no secure connection is established. As of this writing, possible return values include ``"SSLv2"``, ``"SSLv3"``, ``"TLSv1"``, ``"TLSv1.1"`` and ``"TLSv1.2"``. Recent OpenSSL versions may define more return values. @@ -1422,7 +1462,7 @@ such as SSL configuration options, certificate(s) and private key(s). It also manages a cache of SSL sessions for server-side sockets, in order to speed up repeated connections from the same clients. -.. class:: SSLContext(protocol=PROTOCOL_TLS) +.. class:: SSLContext(protocol=None) Create a new SSL context. You may pass *protocol* which must be one of the ``PROTOCOL_*`` constants defined in this module. The parameter @@ -1471,6 +1511,20 @@ to speed up repeated connections from the same clients. ciphers, no ``NULL`` ciphers and no ``MD5`` ciphers (except for :data:`PROTOCOL_SSLv2`). + .. deprecated:: 3.10 + + :class:`SSLContext` without protocol argument is deprecated. The + context class will either require :data:`PROTOCOL_TLS_CLIENT` or + :data:`PROTOCOL_TLS_SERVER` protocol in the future. + + .. versionchanged:: 3.10 + + The default cipher suites now include only secure AES and ChaCha20 + ciphers with forward secrecy and security level 2. RSA and DH keys with + less than 2048 bits and ECC keys with less than 224 bits are prohibited. + :data:`PROTOCOL_TLS`, :data:`PROTOCOL_TLS_CLIENT`, and + :data:`PROTOCOL_TLS_SERVER` use TLS 1.2 as minimum TLS version. + :class:`SSLContext` objects have the following methods and attributes: @@ -1494,7 +1548,7 @@ to speed up repeated connections from the same clients. string must be the path to a single file in PEM format containing the certificate as well as any number of CA certificates needed to establish the certificate's authenticity. The *keyfile* string, if present, must - point to a file containing the private key. Otherwise the private + point to a file containing the private key in. Otherwise the private key will be taken from *certfile* as well. See the discussion of :ref:`ssl-certificates` for more information on how the certificate is stored in the *certfile*. @@ -1522,7 +1576,7 @@ to speed up repeated connections from the same clients. Load a set of default "certification authority" (CA) certificates from default locations. On Windows it loads CA certs from the ``CA`` and - ``ROOT`` system stores. On all systems it calls + ``ROOT`` system stores. On other systems it calls :meth:`SSLContext.set_default_verify_paths`. In the future the method may load CA certificates from other locations, too. @@ -1586,25 +1640,7 @@ to speed up repeated connections from the same clients. >>> ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) >>> ctx.set_ciphers('ECDHE+AESGCM:!ECDSA') - >>> ctx.get_ciphers() # OpenSSL 1.0.x - [{'alg_bits': 256, - 'description': 'ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA ' - 'Enc=AESGCM(256) Mac=AEAD', - 'id': 50380848, - 'name': 'ECDHE-RSA-AES256-GCM-SHA384', - 'protocol': 'TLSv1/SSLv3', - 'strength_bits': 256}, - {'alg_bits': 128, - 'description': 'ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA ' - 'Enc=AESGCM(128) Mac=AEAD', - 'id': 50380847, - 'name': 'ECDHE-RSA-AES128-GCM-SHA256', - 'protocol': 'TLSv1/SSLv3', - 'strength_bits': 128}] - - On OpenSSL 1.1 and newer the cipher dict contains additional fields:: - - >>> ctx.get_ciphers() # OpenSSL 1.1+ + >>> ctx.get_ciphers() [{'aead': True, 'alg_bits': 256, 'auth': 'auth-rsa', @@ -1630,8 +1666,6 @@ to speed up repeated connections from the same clients. 'strength_bits': 128, 'symmetric': 'aes-128-gcm'}] - .. availability:: OpenSSL 1.0.2+. - .. versionadded:: 3.6 .. method:: SSLContext.set_default_verify_paths() @@ -1656,8 +1690,8 @@ to speed up repeated connections from the same clients. when connected, the :meth:`SSLSocket.cipher` method of SSL sockets will give the currently selected cipher. - OpenSSL 1.1.1 has TLS 1.3 cipher suites enabled by default. The suites - cannot be disabled with :meth:`~SSLContext.set_ciphers`. + TLS 1.3 cipher suites cannot be disabled with + :meth:`~SSLContext.set_ciphers`. .. method:: SSLContext.set_alpn_protocols(protocols) @@ -1671,10 +1705,6 @@ to speed up repeated connections from the same clients. This method will raise :exc:`NotImplementedError` if :data:`HAS_ALPN` is ``False``. - OpenSSL 1.1.0 to 1.1.0e will abort the handshake and raise :exc:`SSLError` - when both sides support ALPN but cannot agree on a protocol. 1.1.0f+ - behaves like 1.0.2, :meth:`SSLSocket.selected_alpn_protocol` returns None. - .. versionadded:: 3.5 .. method:: SSLContext.set_npn_protocols(protocols) @@ -1692,6 +1722,10 @@ to speed up repeated connections from the same clients. .. versionadded:: 3.3 + .. deprecated:: 3.10 + + NPN has been superseded by ALPN + .. attribute:: SSLContext.sni_callback Register a callback function that will be called after the TLS Client Hello @@ -1719,10 +1753,10 @@ to speed up repeated connections from the same clients. Due to the early negotiation phase of the TLS connection, only limited methods and attributes are usable like :meth:`SSLSocket.selected_alpn_protocol` and :attr:`SSLSocket.context`. - The :meth:`SSLSocket.getpeercert`, - :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compression` methods require that + :meth:`SSLSocket.getpeercert`, :meth:`SSLSocket.getpeercert`, + :meth:`SSLSocket.cipher` and :meth:`SSLSocket.compress` methods require that the TLS connection has progressed beyond the TLS Client Hello and therefore - will not return meaningful values nor can they be called safely. + will not contain return meaningful values nor can they be called safely. The *sni_callback* function must return ``None`` to allow the TLS negotiation to continue. If a TLS failure is required, a constant @@ -1876,7 +1910,7 @@ to speed up repeated connections from the same clients. .. method:: SSLContext.session_stats() Get statistics about the SSL sessions created or managed by this context. - A dictionary is returned which maps the names of each `piece of information `_ to their + A dictionary is returned which maps the names of each `piece of information `_ to their numeric values. For example, here is the total number of hits and misses in the session cache since the context was created:: @@ -1919,10 +1953,6 @@ to speed up repeated connections from the same clients. :attr:`~SSLContext.verify_mode` is :data:`CERT_NONE`. Previously the same operation would have failed with a :exc:`ValueError`. - .. note:: - - This features requires OpenSSL 0.9.8f or newer. - .. attribute:: SSLContext.keylog_filename Write TLS keys to a keylog file, whenever key material is generated or @@ -1933,10 +1963,6 @@ to speed up repeated connections from the same clients. .. versionadded:: 3.8 - .. note:: - - This features requires OpenSSL 1.1.1 or newer. - .. attribute:: SSLContext.maximum_version A :class:`TLSVersion` enum member representing the highest supported @@ -1953,11 +1979,6 @@ to speed up repeated connections from the same clients. :attr:`~SSLContext.maximum_version` set to :attr:`TLSVersion.TLSv1_2` will not be able to establish a TLS 1.2 connection. - .. note:: - - This attribute is not available unless the ssl module is compiled - with OpenSSL 1.1.0g or newer. - .. versionadded:: 3.7 .. attribute:: SSLContext.minimum_version @@ -1965,24 +1986,14 @@ to speed up repeated connections from the same clients. Like :attr:`SSLContext.maximum_version` except it is the lowest supported version or :attr:`TLSVersion.MINIMUM_SUPPORTED`. - .. note:: - - This attribute is not available unless the ssl module is compiled - with OpenSSL 1.1.0g or newer. - .. versionadded:: 3.7 .. attribute:: SSLContext.num_tickets Control the number of TLS 1.3 session tickets of a - :attr:`TLS_PROTOCOL_SERVER` context. The setting has no impact on TLS + :attr:`PROTOCOL_TLS_SERVER` context. The setting has no impact on TLS 1.0 to 1.2 connections. - .. note:: - - This attribute is not available unless the ssl module is compiled - with OpenSSL 1.1.1 or newer. - .. versionadded:: 3.8 .. attribute:: SSLContext.options @@ -1991,17 +2002,18 @@ to speed up repeated connections from the same clients. The default value is :data:`OP_ALL`, but you can specify other options such as :data:`OP_NO_SSLv2` by ORing them together. - .. note:: - With versions of OpenSSL older than 0.9.8m, it is only possible - to set options, not to clear them. Attempting to clear an option - (by resetting the corresponding bits) will raise a :exc:`ValueError`. - .. versionchanged:: 3.6 :attr:`SSLContext.options` returns :class:`Options` flags: >>> ssl.create_default_context().options # doctest: +SKIP + .. deprecated:: 3.7 + + All ``OP_NO_SSL*`` and ``OP_NO_TLS*`` options have been deprecated since + Python 3.7. Use :attr:`SSLContext.minimum_version` and + :attr:`SSLContext.maximum_version` instead. + .. attribute:: SSLContext.post_handshake_auth Enable TLS 1.3 post-handshake client authentication. Post-handshake auth @@ -2018,10 +2030,6 @@ to speed up repeated connections from the same clients. :meth:`SSLSocket.verify_client_post_handshake` is called and some I/O is performed. - .. note:: - Only available with OpenSSL 1.1.1 and TLS 1.3 enabled. Without TLS 1.3 - support, the property value is None and can't be modified - .. versionadded:: 3.8 .. attribute:: SSLContext.protocol @@ -2035,22 +2043,26 @@ to speed up repeated connections from the same clients. subject common name in the absence of a subject alternative name extension (default: true). - .. note:: - Only writeable with OpenSSL 1.1.0 or higher. - .. versionadded:: 3.7 - .. versionchanged:: 3.9.3 + .. versionchanged:: 3.10 The flag had no effect with OpenSSL before version 1.1.1k. Python 3.8.9, 3.9.3, and 3.10 include workarounds for previous versions. +.. attribute:: SSLContext.security_level + + An integer representing the `security level + `_ + for the context. This attribute is read-only. + + .. versionadded:: 3.10 + .. attribute:: SSLContext.verify_flags The flags for certificate verification operations. You can set flags like :data:`VERIFY_CRL_CHECK_LEAF` by ORing them together. By default OpenSSL does neither require nor verify certificate revocation lists (CRLs). - Available only with openssl version 0.9.8+. .. versionadded:: 3.4 @@ -2345,7 +2357,7 @@ waiting for clients to connect:: context.load_cert_chain(certfile="mycertfile", keyfile="mykeyfile") bindsocket = socket.socket() - bindsocket.bind(('myaddr.example.com', 10023)) + bindsocket.bind(('myaddr.mydomain.com', 10023)) bindsocket.listen(5) When a client connects, you'll call :meth:`accept` on the socket to get the @@ -2674,8 +2686,8 @@ disabled by default. :: >>> client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - >>> client_context.options |= ssl.OP_NO_TLSv1 - >>> client_context.options |= ssl.OP_NO_TLSv1_1 + >>> client_context.minimum_version = ssl.TLSVersion.TLSv1_3 + >>> client_context.maximum_version = ssl.TLSVersion.TLSv1_3 The SSL context created above will only allow TLSv1.2 and later (if @@ -2716,9 +2728,8 @@ TLS 1.3 .. versionadded:: 3.7 -Python has provisional and experimental support for TLS 1.3 with OpenSSL -1.1.1. The new protocol behaves slightly differently than previous version -of TLS/SSL. Some new TLS 1.3 features are not yet available. +The TLS 1.3 protocol behaves slightly differently than previous version +of TLS/SSL. Some new TLS 1.3 features are not yet available. - TLS 1.3 uses a disjunct set of cipher suites. All AES-GCM and ChaCha20 cipher suites are enabled by default. The method @@ -2735,23 +2746,6 @@ of TLS/SSL. Some new TLS 1.3 features are not yet available. signature algorithm configuration, and rekeying are not supported yet. -.. _ssl-libressl: - -LibreSSL support ----------------- - -LibreSSL is a fork of OpenSSL 1.0.1. The ssl module has limited support for -LibreSSL. Some features are not available when the ssl module is compiled -with LibreSSL. - -* LibreSSL >= 2.6.1 no longer supports NPN. The methods - :meth:`SSLContext.set_npn_protocols` and - :meth:`SSLSocket.selected_npn_protocol` are not available. -* :meth:`SSLContext.set_default_verify_paths` ignores the env vars - :envvar:`SSL_CERT_FILE` and :envvar:`SSL_CERT_PATH` although - :func:`get_default_verify_paths` still reports them. - - .. seealso:: Class :class:`socket.socket` diff --git a/Doc/library/stat.rst b/Doc/library/stat.rst index 083dc5e3..98219eae 100644 --- a/Doc/library/stat.rst +++ b/Doc/library/stat.rst @@ -109,7 +109,7 @@ Example:: for f in os.listdir(top): pathname = os.path.join(top, f) - mode = os.lstat(pathname).st_mode + mode = os.stat(pathname).st_mode if S_ISDIR(mode): # It's a directory, recurse into it walktree(pathname, callback) diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index a6cbdd76..3c3f9d2d 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -51,7 +51,7 @@ or sample. :func:`median_high` High median of data. :func:`median_grouped` Median, or 50th percentile, of grouped data. :func:`mode` Single mode (most common value) of discrete or nominal data. -:func:`multimode` List of modes (most common values) of discrete or nomimal data. +:func:`multimode` List of modes (most common values) of discrete or nominal data. :func:`quantiles` Divide data into intervals with equal probability. ======================= =============================================================== @@ -68,6 +68,17 @@ tends to deviate from the typical or average values. :func:`variance` Sample variance of data. ======================= ============================================= +Statistics for relations between two inputs +------------------------------------------- + +These functions calculate statistics regarding relations between two inputs. + +========================= ===================================================== +:func:`covariance` Sample covariance for two variables. +:func:`correlation` Pearson's correlation coefficient for two variables. +:func:`linear_regression` Slope and intercept for simple linear regression. +========================= ===================================================== + Function details ---------------- @@ -105,11 +116,10 @@ However, for reading convenience, most of the examples show sorted sequences. .. note:: - The mean is strongly affected by `outliers - `_ and is not necessarily a - typical example of the data points. For a more robust, although less - efficient, measure of `central tendency - `_, see :func:`median`. + The mean is strongly affected by outliers and is not a robust estimator + for central location: the mean is not necessarily a typical example of + the data points. For more robust measures of central location, see + :func:`median` and :func:`mode`. The sample mean gives an unbiased estimate of the true population mean, so that when taken on average over all the possible samples, @@ -157,20 +167,20 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionadded:: 3.8 -.. function:: harmonic_mean(data) +.. function:: harmonic_mean(data, weights=None) Return the harmonic mean of *data*, a sequence or iterable of - real-valued numbers. + real-valued numbers. If *weights* is omitted or *None*, then + equal weighting is assumed. - The harmonic mean, sometimes called the subcontrary mean, is the - reciprocal of the arithmetic :func:`mean` of the reciprocals of the - data. For example, the harmonic mean of three values *a*, *b* and *c* - will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the values - is zero, the result will be zero. + The harmonic mean is the reciprocal of the arithmetic :func:`mean` of the + reciprocals of the data. For example, the harmonic mean of three values *a*, + *b* and *c* will be equivalent to ``3/(1/a + 1/b + 1/c)``. If one of the + values is zero, the result will be zero. The harmonic mean is a type of average, a measure of the central location of the data. It is often appropriate when averaging - rates or ratios, for example speeds. + ratios or rates, for example speeds. Suppose a car travels 10 km at 40 km/hr, then another 10 km at 60 km/hr. What is the average speed? @@ -180,17 +190,17 @@ However, for reading convenience, most of the examples show sorted sequences. >>> harmonic_mean([40, 60]) 48.0 - Suppose an investor purchases an equal value of shares in each of - three companies, with P/E (price/earning) ratios of 2.5, 3 and 10. - What is the average P/E ratio for the investor's portfolio? + Suppose a car travels 40 km/hr for 5 km, and when traffic clears, + speeds-up to 60 km/hr for the remaining 30 km of the journey. What + is the average speed? .. doctest:: - >>> harmonic_mean([2.5, 3, 10]) # For an equal investment portfolio. - 3.6 + >>> harmonic_mean([40, 60], weights=[5, 30]) + 56.0 - :exc:`StatisticsError` is raised if *data* is empty, or any element - is less than zero. + :exc:`StatisticsError` is raised if *data* is empty, any element + is less than zero, or if the weighted sum isn't positive. The current algorithm has an early-out when it encounters a zero in the input. This means that the subsequent inputs are not tested @@ -198,6 +208,8 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionadded:: 3.6 + .. versionchanged:: 3.10 + Added support for *weights*. .. function:: median(data) @@ -565,6 +577,91 @@ However, for reading convenience, most of the examples show sorted sequences. .. versionadded:: 3.8 +.. function:: covariance(x, y, /) + + Return the sample covariance of two inputs *x* and *y*. Covariance + is a measure of the joint variability of two inputs. + + Both inputs must be of the same length (no less than two), otherwise + :exc:`StatisticsError` is raised. + + Examples: + + .. doctest:: + + >>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9] + >>> y = [1, 2, 3, 1, 2, 3, 1, 2, 3] + >>> covariance(x, y) + 0.75 + >>> z = [9, 8, 7, 6, 5, 4, 3, 2, 1] + >>> covariance(x, z) + -7.5 + >>> covariance(z, x) + -7.5 + + .. versionadded:: 3.10 + +.. function:: correlation(x, y, /) + + Return the `Pearson's correlation coefficient + `_ + for two inputs. Pearson's correlation coefficient *r* takes values + between -1 and +1. It measures the strength and direction of the linear + relationship, where +1 means very strong, positive linear relationship, + -1 very strong, negative linear relationship, and 0 no linear relationship. + + Both inputs must be of the same length (no less than two), and need + not to be constant, otherwise :exc:`StatisticsError` is raised. + + Examples: + + .. doctest:: + + >>> x = [1, 2, 3, 4, 5, 6, 7, 8, 9] + >>> y = [9, 8, 7, 6, 5, 4, 3, 2, 1] + >>> correlation(x, x) + 1.0 + >>> correlation(x, y) + -1.0 + + .. versionadded:: 3.10 + +.. function:: linear_regression(x, y, /) + + Return the slope and intercept of `simple linear regression + `_ + parameters estimated using ordinary least squares. Simple linear + regression describes the relationship between an independent variable *x* and + a dependent variable *y* in terms of this linear function: + + *y = slope \* x + intercept + noise* + + where ``slope`` and ``intercept`` are the regression parameters that are + estimated, and ``noise`` represents the + variability of the data that was not explained by the linear regression + (it is equal to the difference between predicted and actual values + of the dependent variable). + + Both inputs must be of the same length (no less than two), and + the independent variable *x* cannot be constant; + otherwise a :exc:`StatisticsError` is raised. + + For example, we can use the `release dates of the Monty + Python films `_ + to predict the cumulative number of Monty Python films + that would have been produced by 2019 + assuming that they had kept the pace. + + .. doctest:: + + >>> year = [1971, 1975, 1979, 1982, 1983] + >>> films_total = [1, 2, 3, 4, 5] + >>> slope, intercept = linear_regression(year, films_total) + >>> round(slope * 2019 + intercept) + 16 + + .. versionadded:: 3.10 + Exceptions ---------- diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index d6b270d1..d6eff144 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -178,14 +178,13 @@ operators are only defined where they make sense; for example, they raise a single: __ge__() (instance method) Non-identical instances of a class normally compare as non-equal unless the -class defines the :meth:`~object.__eq__` method. +class defines the :meth:`__eq__` method. Instances of a class cannot be ordered with respect to other instances of the same class, or other types of object, unless the class defines enough of the -methods :meth:`~object.__lt__`, :meth:`~object.__le__`, :meth:`~object.__gt__`, and -:meth:`~object.__ge__` (in general, :meth:`~object.__lt__` and -:meth:`~object.__eq__` are sufficient, if you want the conventional meanings of the -comparison operators). +methods :meth:`__lt__`, :meth:`__le__`, :meth:`__gt__`, and :meth:`__ge__` (in +general, :meth:`__lt__` and :meth:`__eq__` are sufficient, if you want the +conventional meanings of the comparison operators). The behavior of the :keyword:`is` and :keyword:`is not` operators cannot be customized; also they can be applied to any two objects and never raise an @@ -479,6 +478,27 @@ class`. In addition, it provides a few more methods: .. versionadded:: 3.1 +.. method:: int.bit_count() + + Return the number of ones in the binary representation of the absolute + value of the integer. This is also known as the population count. + Example:: + + >>> n = 19 + >>> bin(n) + '0b10011' + >>> n.bit_count() + 3 + >>> (-n).bit_count() + 3 + + Equivalent to:: + + def bit_count(self): + return bin(self).count("1") + + .. versionadded:: 3.10 + .. method:: int.to_bytes(length, byteorder, *, signed=False) Return an array of bytes representing an integer. @@ -640,7 +660,7 @@ Hashing of numeric types ------------------------ For numbers ``x`` and ``y``, possibly of different types, it's a requirement -that ``hash(x) == hash(y)`` whenever ``x == y`` (see the :meth:`~object.__hash__` +that ``hash(x) == hash(y)`` whenever ``x == y`` (see the :meth:`__hash__` method documentation for more details). For ease of implementation and efficiency across a variety of numeric types (including :class:`int`, :class:`float`, :class:`decimal.Decimal` and :class:`fractions.Fraction`) @@ -672,10 +692,9 @@ Here are the rules in detail: as ``-hash(-x)``. If the resulting hash is ``-1``, replace it with ``-2``. -- The particular values ``sys.hash_info.inf``, ``-sys.hash_info.inf`` - and ``sys.hash_info.nan`` are used as hash values for positive - infinity, negative infinity, or nans (respectively). (All hashable - nans have the same hash value.) +- The particular values ``sys.hash_info.inf`` and ``-sys.hash_info.inf`` + are used as hash values for positive + infinity or negative infinity (respectively). - For a :class:`complex` number ``z``, the hash values of the real and imaginary parts are combined by computing ``hash(z.real) + @@ -720,7 +739,7 @@ number, :class:`float`, or :class:`complex`:: """Compute the hash of a float x.""" if math.isnan(x): - return sys.hash_info.nan + return object.__hash__(x) elif math.isinf(x): return sys.hash_info.inf if x > 0 else -sys.hash_info.inf else: @@ -1276,7 +1295,7 @@ loops. range(start, stop[, step]) The arguments to the range constructor must be integers (either built-in - :class:`int` or any object that implements the :meth:`~object.__index__` special + :class:`int` or any object that implements the ``__index__`` special method). If the *step* argument is omitted, it defaults to ``1``. If the *start* argument is omitted, it defaults to ``0``. If *step* is zero, :exc:`ValueError` is raised. @@ -1404,7 +1423,7 @@ Strings are immutable written in a variety of ways: * Single quotes: ``'allows embedded "double" quotes'`` -* Double quotes: ``"allows embedded 'single' quotes"`` +* Double quotes: ``"allows embedded 'single' quotes"``. * Triple quoted: ``'''Three single quotes'''``, ``"""Three double quotes"""`` Triple quoted strings may span multiple lines - all associated whitespace will @@ -1448,8 +1467,7 @@ multiple fragments. depends on whether *encoding* or *errors* is given, as follows. If neither *encoding* nor *errors* is given, ``str(object)`` returns - :meth:`type(object).__str__(object) `, - which is the "informal" or nicely + :meth:`object.__str__() `, which is the "informal" or nicely printable string representation of *object*. For string objects, this is the string itself. If *object* does not have a :meth:`~object.__str__` method, then :func:`str` falls back to returning @@ -1562,13 +1580,15 @@ expression support in the :mod:`re` module). By default, the *errors* argument is not checked for best performances, but only used at the first encoding error. Enable the :ref:`Python Development - Mode `, or use a debug build to check *errors*. + Mode `, or use a :ref:`debug build ` to check + *errors*. .. versionchanged:: 3.1 Support for keyword arguments added. .. versionchanged:: 3.9 - The *errors* is now checked in development mode and in debug mode. + The *errors* is now checked in development mode and + in :ref:`debug mode `. .. method:: str.endswith(suffix[, start[, end]]) @@ -1729,9 +1749,9 @@ expression support in the :mod:`re` module). >>> from keyword import iskeyword >>> 'hello'.isidentifier(), iskeyword('hello') - (True, False) + True, False >>> 'def'.isidentifier(), iskeyword('def') - (True, True) + True, True .. method:: str.islower() @@ -1998,7 +2018,7 @@ expression support in the :mod:`re` module). .. index:: single: universal newlines; str.splitlines method -.. method:: str.splitlines(keepends=False) +.. method:: str.splitlines([keepends]) Return a list of the lines in the string, breaking at line boundaries. Line breaks are not included in the resulting list unless *keepends* is given and @@ -2118,11 +2138,7 @@ expression support in the :mod:`re` module). >>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk" - The :func:`string.capwords` function does not have this problem, as it - splits words on spaces only. - - Alternatively, a workaround for apostrophes can be constructed using regular - expressions:: + A workaround for apostrophes can be constructed using regular expressions:: >>> import re >>> def titlecase(s): @@ -2415,7 +2431,7 @@ data and are closely related to string objects in a variety of other ways. literals, except that a ``b`` prefix is added: * Single quotes: ``b'still allows embedded "double" quotes'`` - * Double quotes: ``b"still allows embedded 'single' quotes"`` + * Double quotes: ``b"still allows embedded 'single' quotes"``. * Triple quoted: ``b'''3 single quotes'''``, ``b"""3 double quotes"""`` Only ASCII characters are permitted in bytes literals (regardless of the @@ -2502,6 +2518,16 @@ The representation of bytes objects uses the literal format (``b'...'``) since it is often more useful than e.g. ``bytes([46, 46, 46])``. You can always convert a bytes object into a list of integers using ``list(b)``. +.. note:: + For Python 2.x users: In the Python 2.x series, a variety of implicit + conversions between 8-bit strings (the closest thing 2.x offers to a + built-in binary data type) and Unicode strings were permitted. This was a + backwards compatibility workaround to account for the fact that Python + originally only supported 8-bit text, and Unicode text was a later + addition. In Python 3.x, those implicit conversions are gone - conversions + between 8-bit binary data and Unicode text must be explicit, and bytes and + string objects will always compare unequal. + .. _typebytearray: @@ -2685,7 +2711,7 @@ arbitrary binary data. By default, the *errors* argument is not checked for best performances, but only used at the first decoding error. Enable the :ref:`Python Development - Mode `, or use a debug build to check *errors*. + Mode `, or use a :ref:`debug build ` to check *errors*. .. note:: @@ -2697,7 +2723,8 @@ arbitrary binary data. Added support for keyword arguments. .. versionchanged:: 3.9 - The *errors* is now checked in development mode and in debug mode. + The *errors* is now checked in development mode and + in :ref:`debug mode `. .. method:: bytes.endswith(suffix[, start[, end]]) @@ -3540,7 +3567,7 @@ The conversion types are: | | be used for Python2/3 code bases. | | +------------+-----------------------------------------------------+-------+ | ``'a'`` | Bytes (converts any Python object using | \(5) | -| | ``repr(obj).encode('ascii', 'backslashreplace')``). | | +| | ``repr(obj).encode('ascii','backslashreplace)``). | | +------------+-----------------------------------------------------+-------+ | ``'r'`` | ``'r'`` is an alias for ``'a'`` and should only | \(7) | | | be used for Python2/3 code bases. | | @@ -4186,7 +4213,7 @@ The constructors for both classes work the same: Note, the non-operator versions of :meth:`union`, :meth:`intersection`, - :meth:`difference`, and :meth:`symmetric_difference`, :meth:`issubset`, and + :meth:`difference`, :meth:`symmetric_difference`, :meth:`issubset`, and :meth:`issuperset` methods will accept any iterable as an argument. In contrast, their operator based counterparts require their arguments to be sets. This precludes error-prone constructions like ``set('abc') & 'cbs'`` @@ -4301,9 +4328,13 @@ then they can be used interchangeably to index the same dictionary entry. (Note however, that since computers store floating-point numbers as approximations it is usually unwise to use them as dictionary keys.) -.. class:: dict(**kwargs) - dict(mapping, **kwargs) - dict(iterable, **kwargs) +Dictionaries can be created by placing a comma-separated list of ``key: value`` +pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: +'jack', 4127: 'sjoerd'}``, or by the :class:`dict` constructor. + +.. class:: dict(**kwarg) + dict(mapping, **kwarg) + dict(iterable, **kwarg) Return a new dictionary initialized from an optional positional argument and a possibly empty set of keyword arguments. @@ -4607,6 +4638,12 @@ support membership tests: .. versionchanged:: 3.8 Dictionary views are now reversible. +.. describe:: dictview.mapping + + Return a :class:`types.MappingProxyType` that wraps the original + dictionary to which the view refers. + + .. versionadded:: 3.10 Keys views are set-like since their entries are unique and hashable. If all values are hashable, so that ``(key, value)`` pairs are unique and hashable, @@ -4646,6 +4683,12 @@ An example of dictionary view usage:: >>> keys ^ {'sausage', 'juice'} {'juice', 'sausage', 'bacon', 'spam'} + >>> # get back a read-only proxy for the original dictionary + >>> values.mapping + mappingproxy({'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500}) + >>> values.mapping['spam'] + 500 + .. _typecontextmanager: @@ -4711,9 +4754,9 @@ their implementation of the context management protocol. See the Python's :term:`generator`\s and the :class:`contextlib.contextmanager` decorator provide a convenient way to implement these protocols. If a generator function is decorated with the :class:`contextlib.contextmanager` decorator, it will return a -context manager implementing the necessary :meth:`~contextmanager.__enter__` and -:meth:`~contextmanager.__exit__` methods, rather than the iterator produced by an -undecorated generator function. +context manager implementing the necessary :meth:`__enter__` and +:meth:`__exit__` methods, rather than the iterator produced by an undecorated +generator function. Note that there is no specific slot for any of these methods in the type structure for Python objects in the Python/C API. Extension types wanting to @@ -4722,63 +4765,52 @@ Compared to the overhead of setting up the runtime context, the overhead of a single class dictionary lookup is negligible. +Type Annotation Types --- :ref:`Generic Alias `, :ref:`Union ` +=============================================================================================== + +.. index:: + single: annotation; type annotation; type hint + +The core built-in types for :term:`type annotations ` are +:ref:`Generic Alias ` and :ref:`Union `. + + .. _types-genericalias: Generic Alias Type -================== +------------------ .. index:: object: GenericAlias pair: Generic; Alias -``GenericAlias`` objects are generally created by -:ref:`subscripting ` a class. They are most often used with -:ref:`container classes `, such as :class:`list` or -:class:`dict`. For example, ``list[int]`` is a ``GenericAlias`` object created -by subscripting the ``list`` class with the argument :class:`int`. -``GenericAlias`` objects are intended primarily for use with +``GenericAlias`` objects are created by subscripting a class (usually a +container), such as ``list[int]``. They are intended primarily for :term:`type annotations `. -.. note:: - - It is generally only possible to subscript a class if the class implements - the special method :meth:`~object.__class_getitem__`. +Usually, the :ref:`subscription ` of container objects calls the +method :meth:`__getitem__` of the object. However, the subscription of some +containers' classes may call the classmethod :meth:`__class_getitem__` of the +class instead. The classmethod :meth:`__class_getitem__` should return a +``GenericAlias`` object. -A ``GenericAlias`` object acts as a proxy for a :term:`generic type`, -implementing *parameterized generics*. - -For a container class, the -argument(s) supplied to a :ref:`subscription ` of the class may -indicate the type(s) of the elements an object contains. For example, -``set[bytes]`` can be used in type annotations to signify a :class:`set` in -which all the elements are of type :class:`bytes`. - -For a class which defines :meth:`~object.__class_getitem__` but is not a -container, the argument(s) supplied to a subscription of the class will often -indicate the return type(s) of one or more methods defined on an object. For -example, :mod:`regular expressions ` can be used on both the :class:`str` data -type and the :class:`bytes` data type: - -* If ``x = re.search('foo', 'foo')``, ``x`` will be a - :ref:`re.Match ` object where the return values of - ``x.group(0)`` and ``x[0]`` will both be of type :class:`str`. We can - represent this kind of object in type annotations with the ``GenericAlias`` - ``re.Match[str]``. +.. note:: + If the :meth:`__getitem__` of the class' metaclass is present, it will take + precedence over the :meth:`__class_getitem__` defined in the class (see + :pep:`560` for more details). -* If ``y = re.search(b'bar', b'bar')``, (note the ``b`` for :class:`bytes`), - ``y`` will also be an instance of ``re.Match``, but the return - values of ``y.group(0)`` and ``y[0]`` will both be of type - :class:`bytes`. In type annotations, we would represent this - variety of :ref:`re.Match ` objects with ``re.Match[bytes]``. +The ``GenericAlias`` object acts as a proxy for :term:`generic types +`, implementing *parameterized generics* - a specific instance +of a generic which provides the types for container elements. -``GenericAlias`` objects are instances of the class -:class:`types.GenericAlias`, which can also be used to create ``GenericAlias`` -objects directly. +The user-exposed type for the ``GenericAlias`` object can be accessed from +:class:`types.GenericAlias` and used for :func:`isinstance` checks. It can +also be used to create ``GenericAlias`` objects directly. .. describe:: T[X, Y, ...] - Creates a ``GenericAlias`` representing a type ``T`` parameterized by types - *X*, *Y*, and more depending on the ``T`` used. + Creates a ``GenericAlias`` representing a type ``T`` containing elements + of types *X*, *Y*, and more depending on the ``T`` used. For example, a function expecting a :class:`list` containing :class:`float` elements:: @@ -4803,7 +4835,7 @@ The builtin functions :func:`isinstance` and :func:`issubclass` do not accept The Python runtime does not enforce :term:`type annotations `. This extends to generic types and their type parameters. When creating -a container object from a ``GenericAlias``, the elements in the container are not checked +an object from a ``GenericAlias``, container elements are not checked against their type. For example, the following code is discouraged, but will run without errors:: @@ -4830,8 +4862,8 @@ Calling :func:`repr` or :func:`str` on a generic shows the parameterized type:: >>> str(list[int]) 'list[int]' -The :meth:`~object.__getitem__` method of generic containers will raise an -exception to disallow mistakes like ``dict[str][str]``:: +The :meth:`__getitem__` method of generics will raise an exception to disallow +mistakes like ``dict[str][str]``:: >>> dict[str][str] Traceback (most recent call last): @@ -4840,7 +4872,7 @@ exception to disallow mistakes like ``dict[str][str]``:: However, such expressions are valid when :ref:`type variables ` are used. The index must have as many elements as there are type variable items -in the ``GenericAlias`` object's :attr:`~genericalias.__args__`. :: +in the ``GenericAlias`` object's :attr:`__args__ `. :: >>> from typing import TypeVar >>> Y = TypeVar('Y') @@ -4848,11 +4880,10 @@ in the ``GenericAlias`` object's :attr:`~genericalias.__args__`. :: dict[str, int] -Standard Generic Classes ------------------------- +Standard Generic Collections +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The following standard library classes support parameterized generics. This -list is non-exhaustive. +These standard library collections support parameterized generics. * :class:`tuple` * :class:`list` @@ -4890,29 +4921,12 @@ list is non-exhaustive. * :class:`collections.abc.ValuesView` * :class:`contextlib.AbstractContextManager` * :class:`contextlib.AbstractAsyncContextManager` -* :class:`dataclasses.Field` -* :class:`functools.cached_property` -* :class:`functools.partialmethod` -* :class:`os.PathLike` -* :class:`queue.LifoQueue` -* :class:`queue.Queue` -* :class:`queue.PriorityQueue` -* :class:`queue.SimpleQueue` * :ref:`re.Pattern ` * :ref:`re.Match ` -* :class:`shelve.BsdDbShelf` -* :class:`shelve.DbfilenameShelf` -* :class:`shelve.Shelf` -* :class:`types.MappingProxyType` -* :class:`weakref.WeakKeyDictionary` -* :class:`weakref.WeakMethod` -* :class:`weakref.WeakSet` -* :class:`weakref.WeakValueDictionary` - -Special Attributes of ``GenericAlias`` objects ----------------------------------------------- +Special Attributes of Generic Alias +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ All parameterized generics implement special read-only attributes. @@ -4927,8 +4941,8 @@ All parameterized generics implement special read-only attributes. .. attribute:: genericalias.__args__ This attribute is a :class:`tuple` (possibly of length 1) of generic - types passed to the original :meth:`~object.__class_getitem__` of the - generic class:: + types passed to the original :meth:`__class_getitem__` + of the generic container:: >>> dict[str, list[int]].__args__ (, list[int]) @@ -4946,21 +4960,119 @@ All parameterized generics implement special read-only attributes. (~T,) + .. note:: + A ``GenericAlias`` object with :class:`typing.ParamSpec` parameters may not + have correct ``__parameters__`` after substitution because + :class:`typing.ParamSpec` is intended primarily for static type checking. + .. seealso:: - :pep:`484` - Type Hints - Introducing Python's framework for type annotations. + * :pep:`585` -- "Type Hinting Generics In Standard Collections" + * :meth:`__class_getitem__` -- Used to implement parameterized generics. + * :ref:`generics` -- Generics in the :mod:`typing` module. + +.. versionadded:: 3.9 - :pep:`585` - Type Hinting Generics In Standard Collections - Introducing the ability to natively parameterize standard-library - classes, provided they implement the special class method - :meth:`~object.__class_getitem__`. - :ref:`Generics`, :ref:`user-defined generics ` and :class:`typing.Generic` - Documentation on how to implement generic classes that can be - parameterized at runtime and understood by static type-checkers. +.. _types-union: -.. versionadded:: 3.9 +Union Type +---------- + +.. index:: + object: Union + pair: union; type + +A union object holds the value of the ``|`` (bitwise or) operation on +multiple :ref:`type objects `. These types are intended +primarily for :term:`type annotations `. The union type expression +enables cleaner type hinting syntax compared to :data:`typing.Union`. + +.. describe:: X | Y | ... + + Defines a union object which holds types *X*, *Y*, and so forth. ``X | Y`` + means either X or Y. It is equivalent to ``typing.Union[X, Y]``. + For example, the following function expects an argument of type + :class:`int` or :class:`float`:: + + def square(number: int | float) -> int | float: + return number ** 2 + +.. describe:: union_object == other + + Union objects can be tested for equality with other union objects. Details: + + * Unions of unions are flattened:: + + (int | str) | float == int | str | float + + * Redundant types are removed:: + + int | str | int == int | str + + * When comparing unions, the order is ignored:: + + int | str == str | int + + * It is compatible with :data:`typing.Union`:: + + int | str == typing.Union[int, str] + + * Optional types can be spelled as a union with ``None``:: + + str | None == typing.Optional[str] + +.. describe:: isinstance(obj, union_object) +.. describe:: issubclass(obj, union_object) + + Calls to :func:`isinstance` and :func:`issubclass` are also supported with a + union object:: + + >>> isinstance("", int | str) + True + + However, union objects containing :ref:`parameterized generics + ` cannot be used:: + + >>> isinstance(1, int | list[int]) + Traceback (most recent call last): + File "", line 1, in + TypeError: isinstance() argument 2 cannot contain a parameterized generic + +The user-exposed type for the union object can be accessed from +:data:`types.UnionType` and used for :func:`isinstance` checks. An object cannot be +instantiated from the type:: + + >>> import types + >>> isinstance(int | str, types.UnionType) + True + >>> types.UnionType() + Traceback (most recent call last): + File "", line 1, in + TypeError: cannot create 'types.UnionType' instances + +.. note:: + The :meth:`__or__` method for type objects was added to support the syntax + ``X | Y``. If a metaclass implements :meth:`__or__`, the Union may + override it:: + + >>> class M(type): + ... def __or__(self, other): + ... return "Hello" + ... + >>> class C(metaclass=M): + ... pass + ... + >>> C | int + 'Hello' + >>> int | C + int | __main__.C + +.. seealso:: + + :pep:`604` -- PEP proposing the ``X | Y`` syntax and the Union type. + +.. versionadded:: 3.10 .. _typesother: @@ -5244,165 +5356,6 @@ types, where they are relevant. Some of these are not reported by the [] -.. _int_max_str_digits: - -Integer string conversion length limitation -=========================================== - -CPython has a global limit for converting between :class:`int` and :class:`str` -to mitigate denial of service attacks. This limit *only* applies to decimal or -other non-power-of-two number bases. Hexadecimal, octal, and binary conversions -are unlimited. The limit can be configured. - -The :class:`int` type in CPython is an abitrary length number stored in binary -form (commonly known as a "bignum"). There exists no algorithm that can convert -a string to a binary integer or a binary integer to a string in linear time, -*unless* the base is a power of 2. Even the best known algorithms for base 10 -have sub-quadratic complexity. Converting a large value such as ``int('1' * -500_000)`` can take over a second on a fast CPU. - -Limiting conversion size offers a practical way to avoid `CVE-2020-10735 -`_. - -The limit is applied to the number of digit characters in the input or output -string when a non-linear conversion algorithm would be involved. Underscores -and the sign are not counted towards the limit. - -When an operation would exceed the limit, a :exc:`ValueError` is raised: - -.. doctest:: - - >>> import sys - >>> sys.set_int_max_str_digits(4300) # Illustrative, this is the default. - >>> _ = int('2' * 5432) - Traceback (most recent call last): - ... - ValueError: Exceeds the limit (4300) for integer string conversion: value has 5432 digits; use sys.set_int_max_str_digits() to increase the limit. - >>> i = int('2' * 4300) - >>> len(str(i)) - 4300 - >>> i_squared = i*i - >>> len(str(i_squared)) - Traceback (most recent call last): - ... - ValueError: Exceeds the limit (4300) for integer string conversion: value has 8599 digits; use sys.set_int_max_str_digits() to increase the limit. - >>> len(hex(i_squared)) - 7144 - >>> assert int(hex(i_squared), base=16) == i*i # Hexadecimal is unlimited. - -The default limit is 4300 digits as provided in -:data:`sys.int_info.default_max_str_digits `. -The lowest limit that can be configured is 640 digits as provided in -:data:`sys.int_info.str_digits_check_threshold `. - -Verification: - -.. doctest:: - - >>> import sys - >>> assert sys.int_info.default_max_str_digits == 4300, sys.int_info - >>> assert sys.int_info.str_digits_check_threshold == 640, sys.int_info - >>> msg = int('578966293710682886880994035146873798396722250538762761564' - ... '9252925514383915483333812743580549779436104706260696366600' - ... '571186405732').to_bytes(53, 'big') - ... - -.. versionadded:: 3.9.14 - -Affected APIs -------------- - -The limitation only applies to potentially slow conversions between :class:`int` -and :class:`str` or :class:`bytes`: - -* ``int(string)`` with default base 10. -* ``int(string, base)`` for all bases that are not a power of 2. -* ``str(integer)``. -* ``repr(integer)`` -* any other string conversion to base 10, for example ``f"{integer}"``, - ``"{}".format(integer)``, or ``b"%d" % integer``. - -The limitations do not apply to functions with a linear algorithm: - -* ``int(string, base)`` with base 2, 4, 8, 16, or 32. -* :func:`int.from_bytes` and :func:`int.to_bytes`. -* :func:`hex`, :func:`oct`, :func:`bin`. -* :ref:`formatspec` for hex, octal, and binary numbers. -* :class:`str` to :class:`float`. -* :class:`str` to :class:`decimal.Decimal`. - -Configuring the limit ---------------------- - -Before Python starts up you can use an environment variable or an interpreter -command line flag to configure the limit: - -* :envvar:`PYTHONINTMAXSTRDIGITS`, e.g. - ``PYTHONINTMAXSTRDIGITS=640 python3`` to set the limit to 640 or - ``PYTHONINTMAXSTRDIGITS=0 python3`` to disable the limitation. -* :option:`-X int_max_str_digits <-X>`, e.g. - ``python3 -X int_max_str_digits=640`` -* :data:`sys.flags.int_max_str_digits` contains the value of - :envvar:`PYTHONINTMAXSTRDIGITS` or :option:`-X int_max_str_digits <-X>`. - If both the env var and the ``-X`` option are set, the ``-X`` option takes - precedence. A value of *-1* indicates that both were unset, thus a value of - :data:`sys.int_info.default_max_str_digits` was used during initilization. - -From code, you can inspect the current limit and set a new one using these -:mod:`sys` APIs: - -* :func:`sys.get_int_max_str_digits` and :func:`sys.set_int_max_str_digits` are - a getter and setter for the interpreter-wide limit. Subinterpreters have - their own limit. - -Information about the default and minimum can be found in :attr:`sys.int_info`: - -* :data:`sys.int_info.default_max_str_digits ` is the compiled-in - default limit. -* :data:`sys.int_info.str_digits_check_threshold ` is the lowest - accepted value for the limit (other than 0 which disables it). - -.. versionadded:: 3.9.14 - -.. caution:: - - Setting a low limit *can* lead to problems. While rare, code exists that - contains integer constants in decimal in their source that exceed the - minimum threshold. A consequence of setting the limit is that Python source - code containing decimal integer literals longer than the limit will - encounter an error during parsing, usually at startup time or import time or - even at installation time - anytime an up to date ``.pyc`` does not already - exist for the code. A workaround for source that contains such large - constants is to convert them to ``0x`` hexadecimal form as it has no limit. - - Test your application thoroughly if you use a low limit. Ensure your tests - run with the limit set early via the environment or flag so that it applies - during startup and even during any installation step that may invoke Python - to precompile ``.py`` sources to ``.pyc`` files. - -Recommended configuration -------------------------- - -The default :data:`sys.int_info.default_max_str_digits` is expected to be -reasonable for most applications. If your application requires a different -limit, set it from your main entry point using Python version agnostic code as -these APIs were added in security patch releases in versions before 3.11. - -Example:: - - >>> import sys - >>> if hasattr(sys, "set_int_max_str_digits"): - ... upper_bound = 68000 - ... lower_bound = 4004 - ... current_limit = sys.get_int_max_str_digits() - ... if current_limit == 0 or current_limit > upper_bound: - ... sys.set_int_max_str_digits(upper_bound) - ... elif current_limit < lower_bound: - ... sys.set_int_max_str_digits(lower_bound) - -If you need to disable it entirely, set it to ``0``. - - .. rubric:: Footnotes .. [1] Additional information on these special methods may be found in the Python diff --git a/Doc/library/string.rst b/Doc/library/string.rst index 3ecae27b..b27782f8 100644 --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -347,8 +347,8 @@ The meaning of the various alignment options is as follows: | ``'='`` | Forces the padding to be placed after the sign (if any) | | | but before the digits. This is used for printing fields | | | in the form '+000000120'. This alignment option is only | - | | valid for numeric types. It becomes the default when '0'| - | | immediately precedes the field width. | + | | valid for numeric types. It becomes the default for | + | | numbers when '0' immediately precedes the field width. | +---------+----------------------------------------------------------+ | ``'^'`` | Forces the field to be centered within the available | | | space. | @@ -424,13 +424,16 @@ When no explicit alignment is given, preceding the *width* field by a zero sign-aware zero-padding for numeric types. This is equivalent to a *fill* character of ``'0'`` with an *alignment* type of ``'='``. -The *precision* is a decimal integer indicating how many digits should be -displayed after the decimal point for presentation types -``'f'`` and ``'F'``, or before and after the decimal point for presentation -types ``'g'`` or ``'G'``. For string presentation types the field +.. versionchanged:: 3.10 + Preceding the *width* field by ``'0'`` no longer affects the default + alignment for strings. + +The *precision* is a decimal number indicating how many digits should be +displayed after the decimal point for a floating point value formatted with +``'f'`` and ``'F'``, or before and after the decimal point for a floating point +value formatted with ``'g'`` or ``'G'``. For non-number types the field indicates the maximum field size - in other words, how many characters will be -used from the field content. The *precision* is not allowed for integer -presentation types. +used from the field content. The *precision* is not allowed for integer values. Finally, the *type* determines how the data should be presented. diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst index 10e40635..21a96a4b 100644 --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -195,10 +195,7 @@ compatibility with older versions, see the :ref:`call-function-trio` section. .. attribute:: output Output of the child process if it was captured by :func:`run` or - :func:`check_output`. Otherwise, ``None``. This is always - :class:`bytes` when any output was captured regardless of the - ``text=True`` setting. It may remain ``None`` instead of ``b''`` - when no output was observed. + :func:`check_output`. Otherwise, ``None``. .. attribute:: stdout @@ -207,9 +204,7 @@ compatibility with older versions, see the :ref:`call-function-trio` section. .. attribute:: stderr Stderr output of the child process if it was captured by :func:`run`. - Otherwise, ``None``. This is always :class:`bytes` when stderr output - was captured regardless of the ``text=True`` setting. It may remain - ``None`` instead of ``b''`` when no stderr output was observed. + Otherwise, ``None``. .. versionadded:: 3.3 @@ -219,9 +214,7 @@ compatibility with older versions, see the :ref:`call-function-trio` section. .. exception:: CalledProcessError Subclass of :exc:`SubprocessError`, raised when a process run by - :func:`check_call`, :func:`check_output`, or :func:`run` (with ``check=True``) - returns a non-zero exit status. - + :func:`check_call` or :func:`check_output` returns a non-zero exit status. .. attribute:: returncode @@ -271,14 +264,13 @@ default values. The arguments that are most commonly needed are: *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive - integer), an existing file object with a valid file descriptor, and ``None``. - :data:`PIPE` indicates that a new pipe to the child should be created. - :data:`DEVNULL` indicates that the special file :data:`os.devnull` will - be used. With the default settings of ``None``, no redirection will occur; - the child's file handles will be inherited from the parent. - Additionally, *stderr* can be :data:`STDOUT`, which indicates that the - stderr data from the child process should be captured into the same file - handle as for *stdout*. + integer), an existing file object, and ``None``. :data:`PIPE` indicates + that a new pipe to the child should be created. :data:`DEVNULL` indicates + that the special file :data:`os.devnull` will be used. With the default + settings of ``None``, no redirection will occur; the child's file handles + will be inherited from the parent. Additionally, *stderr* can be + :data:`STDOUT`, which indicates that the stderr data from the child + process should be captured into the same file handle as for *stdout*. .. index:: single: universal newlines; subprocess module @@ -349,10 +341,10 @@ functions. startupinfo=None, creationflags=0, restore_signals=True, \ start_new_session=False, pass_fds=(), *, group=None, \ extra_groups=None, user=None, umask=-1, \ - encoding=None, errors=None, text=None) + encoding=None, errors=None, text=None, pipesize=-1) Execute a child program in a new process. On POSIX, the class uses - :meth:`os.execvp`-like behavior to execute the child program. On Windows, + :meth:`os.execvpe`-like behavior to execute the child program. On Windows, the class uses the Windows ``CreateProcess()`` function. The arguments to :class:`Popen` are as follows. @@ -364,6 +356,25 @@ functions. arguments for additional differences from the default behavior. Unless otherwise stated, it is recommended to pass *args* as a sequence. + .. warning:: + + For maximum reliability, use a fully-qualified path for the executable. + To search for an unqualified name on :envvar:`PATH`, use + :meth:`shutil.which`. On all platforms, passing :data:`sys.executable` + is the recommended way to launch the current Python interpreter again, + and use the ``-m`` command-line format to launch an installed module. + + Resolving the path of *executable* (or the first item of *args*) is + platform dependent. For POSIX, see :meth:`os.execvpe`, and note that + when resolving or searching for the executable path, *cwd* overrides the + current working directory and *env* can override the ``PATH`` + environment variable. For Windows, see the documentation of the + ``lpApplicationName`` and ``lpCommandLine`` parameters of WinAPI + ``CreateProcess``, and note that when resolving or searching for the + executable path with ``shell=False``, *cwd* does not override the + current working directory and *env* cannot override the ``PATH`` + environment variable. Using a full path avoids all of these variations. + An example of passing some arguments to an external program as a sequence is:: @@ -471,14 +482,13 @@ functions. *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values are :data:`PIPE`, :data:`DEVNULL`, an existing file descriptor (a positive - integer), an existing :term:`file object` with a valid file descriptor, - and ``None``. :data:`PIPE` indicates that a new pipe to the child should - be created. :data:`DEVNULL` indicates that the special file - :data:`os.devnull` will be used. With the default settings of ``None``, - no redirection will occur; the child's file handles will be inherited from - the parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates - that the stderr data from the applications should be captured into the same - file handle as for stdout. + integer), an existing :term:`file object`, and ``None``. :data:`PIPE` + indicates that a new pipe to the child should be created. :data:`DEVNULL` + indicates that the special file :data:`os.devnull` will be used. With the + default settings of ``None``, no redirection will occur; the child's file + handles will be inherited from the parent. Additionally, *stderr* can be + :data:`STDOUT`, which indicates that the stderr data from the applications + should be captured into the same file handle as for stdout. If *preexec_fn* is set to a callable object, this object will be called in the child process just before the child is executed. @@ -533,7 +543,7 @@ functions. If *cwd* is not ``None``, the function changes the working directory to *cwd* before executing the child. *cwd* can be a string, bytes or - :term:`path-like ` object. In particular, the function + :term:`path-like ` object. On POSIX, the function looks for *executable* (or for the first item in *args*) relative to *cwd* if the executable path is a relative path. @@ -634,6 +644,14 @@ functions. * :data:`CREATE_DEFAULT_ERROR_MODE` * :data:`CREATE_BREAKAWAY_FROM_JOB` + *pipesize* can be used to change the size of the pipe when + :data:`PIPE` is used for *stdin*, *stdout* or *stderr*. The size of the pipe + is only changed on platforms that support this (only Linux at this time of + writing). Other platforms will ignore this parameter. + + .. versionadded:: 3.10 + The ``pipesize`` parameter was added. + Popen objects are supported as context managers via the :keyword:`with` statement: on exit, standard file descriptors are closed, and the process is waited for. :: @@ -704,11 +722,8 @@ If the shell is invoked explicitly, via ``shell=True``, it is the application's responsibility to ensure that all whitespace and metacharacters are quoted appropriately to avoid `shell injection `_ -vulnerabilities. - -When using ``shell=True``, the :func:`shlex.quote` function can be -used to properly escape whitespace and shell metacharacters in strings -that are going to be used to construct shell commands. +vulnerabilities. On :ref:`some platforms `, it is possible +to use :func:`shlex.quote` for this escaping. Popen Objects @@ -1273,7 +1288,7 @@ be used directly: becomes:: - output=check_output("dmesg | grep hda", shell=True) + output = check_output("dmesg | grep hda", shell=True) Replacing :func:`os.system` diff --git a/Doc/library/sunau.rst b/Doc/library/sunau.rst index b4d996e6..aad6f93b 100644 --- a/Doc/library/sunau.rst +++ b/Doc/library/sunau.rst @@ -3,16 +3,11 @@ .. module:: sunau :synopsis: Provide an interface to the Sun AU sound format. - :deprecated: .. sectionauthor:: Moshe Zadka **Source code:** :source:`Lib/sunau.py` -.. deprecated:: 3.11 - The :mod:`sunau` module is deprecated - (see :pep:`PEP 594 <594#sunau>` for details). - -------------- The :mod:`sunau` module provides a convenient interface to the Sun AU sound diff --git a/Doc/library/superseded.rst b/Doc/library/superseded.rst index b38f1669..50a59832 100644 --- a/Doc/library/superseded.rst +++ b/Doc/library/superseded.rst @@ -10,27 +10,5 @@ backwards compatibility. They have been superseded by other modules. .. toctree:: - aifc.rst - asynchat.rst - asyncore.rst - audioop.rst - cgi.rst - cgitb.rst - chunk.rst - crypt.rst - imghdr.rst - imp.rst - mailcap.rst - msilib.rst - nis.rst - nntplib.rst optparse.rst - ossaudiodev.rst - pipes.rst - smtpd.rst - sndhdr.rst - spwd.rst - sunau.rst - telnetlib.rst - uu.rst - xdrlib.rst + imp.rst diff --git a/Doc/library/symbol.rst b/Doc/library/symbol.rst deleted file mode 100644 index d56600af..00000000 --- a/Doc/library/symbol.rst +++ /dev/null @@ -1,32 +0,0 @@ -:mod:`symbol` --- Constants used with Python parse trees -======================================================== - -.. module:: symbol - :synopsis: Constants representing internal nodes of the parse tree. - -.. sectionauthor:: Fred L. Drake, Jr. - -**Source code:** :source:`Lib/symbol.py` - --------------- - -This module provides constants which represent the numeric values of internal -nodes of the parse tree. Unlike most Python constants, these use lower-case -names. Refer to the file :file:`Grammar/Grammar` in the Python distribution for -the definitions of the names in the context of the language grammar. The -specific numeric values which the names map to may change between Python -versions. - -.. warning:: - - The symbol module is deprecated and will be removed in future versions of - Python. - -This module also provides one additional data object: - - -.. data:: sym_name - - Dictionary mapping the numeric values of the constants defined in this module - back to name strings, allowing more human-readable representation of parse trees - to be generated. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 97c450e7..ec12e02f 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -72,6 +72,8 @@ always available. To loop over the standard input, or the list of files given on the command line, see the :mod:`fileinput` module. + See also :data:`sys.orig_argv`. + .. note:: On Unix, command line arguments are passed by bytes from OS. Python decodes them with filesystem encoding and "surrogateescape" error handler. @@ -151,10 +153,12 @@ always available. .. data:: builtin_module_names - A tuple of strings giving the names of all modules that are compiled into this + A tuple of strings containing the names of all modules that are compiled into this Python interpreter. (This information is not available in any other way --- ``modules.keys()`` only lists the imported modules.) + See also the :attr:`sys.stdlib_module_names` list. + .. function:: call_tracing(func, args) @@ -194,6 +198,18 @@ always available. .. audit-event:: sys._current_frames "" sys._current_frames +.. function:: _current_exceptions() + + Return a dictionary mapping each thread's identifier to the topmost exception + currently active in that thread at the time the function is called. + If a thread is not currently handling an exception, it is not included in + the result dictionary. + + This is most useful for statistical profiling. + + This function should be used for internal and specialized purposes only. + + .. audit-event:: sys._current_exceptions "" sys._current_exceptions .. function:: breakpointhook() @@ -234,7 +250,8 @@ always available. Print low-level information to stderr about the state of CPython's memory allocator. - If Python is configured --with-pydebug, it also performs some expensive + If Python is `built in debug mode ` (:option:`configure + --with-pydebug option <--with-pydebug>`), it also performs some expensive internal consistency checks. .. versionadded:: 3.3 @@ -412,7 +429,10 @@ always available. .. function:: exit([arg]) - Raise a :exc:`SystemExit` exception, signaling an intention to exit the interpreter. + Exit from Python. This is implemented by raising the :exc:`SystemExit` + exception, so cleanup actions specified by finally clauses of :keyword:`try` + statements are honored, and it is possible to intercept the exit attempt at + an outer level. The optional argument *arg* can be an integer giving the exit status (defaulting to zero), or another type of object. If it is an integer, zero @@ -429,8 +449,7 @@ always available. Since :func:`exit` ultimately "only" raises an exception, it will only exit the process when called from the main thread, and the exception is not - intercepted. Cleanup actions specified by finally clauses of :keyword:`try` statements - are honored, and it is possible to intercept the exit attempt at an outer level. + intercepted. .. versionchanged:: 3.6 If an error occurs in the cleanup after the Python interpreter @@ -443,9 +462,9 @@ always available. The :term:`named tuple` *flags* exposes the status of command line flags. The attributes are read only. - ============================= ============================================================================================================== + ============================= ================================================================ attribute flag - ============================= ============================================================================================================== + ============================= ================================================================ :const:`debug` :option:`-d` :const:`inspect` :option:`-i` :const:`interactive` :option:`-i` @@ -461,8 +480,7 @@ always available. :const:`hash_randomization` :option:`-R` :const:`dev_mode` :option:`-X dev <-X>` (:ref:`Python Development Mode `) :const:`utf8_mode` :option:`-X utf8 <-X>` - :const:`int_max_str_digits` :option:`-X int_max_str_digits <-X>` (:ref:`integer string conversion length limitation `) - ============================= ============================================================================================================== + ============================= ================================================================ .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. @@ -481,9 +499,6 @@ always available. Mode ` and the ``utf8_mode`` attribute for the new :option:`-X` ``utf8`` flag. - .. versionchanged:: 3.9.14 - Added the ``int_max_str_digits`` attribute. - .. data:: float_info @@ -615,30 +630,24 @@ always available. .. function:: getfilesystemencoding() - Return the name of the encoding used to convert between Unicode - filenames and bytes filenames. For best compatibility, str should be - used for filenames in all cases, although representing filenames as bytes - is also supported. Functions accepting or returning filenames should support - either str or bytes and internally convert to the system's preferred - representation. + Get the :term:`filesystem encoding `: + the encoding used with the :term:`filesystem error handler ` to convert between Unicode filenames and bytes + filenames. The filesystem error handler is returned from + :func:`getfilesystemencoding`. - This encoding is always ASCII-compatible. + For best compatibility, str should be used for filenames in all cases, + although representing filenames as bytes is also supported. Functions + accepting or returning filenames should support either str or bytes and + internally convert to the system's preferred representation. :func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that the correct encoding and errors mode are used. - * In the UTF-8 mode, the encoding is ``utf-8`` on any platform. - - * On macOS, the encoding is ``'utf-8'``. - - * On Unix, the encoding is the locale encoding. - - * On Windows, the encoding may be ``'utf-8'`` or ``'mbcs'``, depending - on user configuration. - - * On Android, the encoding is ``'utf-8'``. - - * On VxWorks, the encoding is ``'utf-8'``. + The :term:`filesystem encoding and error handler` are configured at Python + startup by the :c:func:`PyConfig_Read` function: see + :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. .. versionchanged:: 3.2 :func:`getfilesystemencoding` result cannot be ``None`` anymore. @@ -648,28 +657,27 @@ always available. and :func:`_enablelegacywindowsfsencoding` for more information. .. versionchanged:: 3.7 - Return 'utf-8' in the UTF-8 mode. + Return ``'utf-8'`` if the :ref:`Python UTF-8 Mode ` is + enabled. .. function:: getfilesystemencodeerrors() - Return the name of the error mode used to convert between Unicode filenames - and bytes filenames. The encoding name is returned from + Get the :term:`filesystem error handler `: the error handler used with the :term:`filesystem encoding + ` to convert between Unicode + filenames and bytes filenames. The filesystem encoding is returned from :func:`getfilesystemencoding`. :func:`os.fsencode` and :func:`os.fsdecode` should be used to ensure that the correct encoding and errors mode are used. - .. versionadded:: 3.6 - - -.. function:: get_int_max_str_digits() - - Returns the current value for the :ref:`integer string conversion length - limitation `. See also :func:`set_int_max_str_digits`. - - .. versionadded:: 3.9.14 + The :term:`filesystem encoding and error handler` are configured at Python + startup by the :c:func:`PyConfig_Read` function: see + :c:member:`~PyConfig.filesystem_encoding` and + :c:member:`~PyConfig.filesystem_errors` members of :c:type:`PyConfig`. + .. versionadded:: 3.6 .. function:: getrefcount(object) @@ -852,7 +860,7 @@ always available. +---------------------+--------------------------------------------------+ | :const:`inf` | hash value returned for a positive infinity | +---------------------+--------------------------------------------------+ - | :const:`nan` | hash value returned for a nan | + | :const:`nan` | (this attribute is no longer used) | +---------------------+--------------------------------------------------+ | :const:`imag` | multiplier used for the imaginary part of a | | | complex number | @@ -944,31 +952,19 @@ always available. .. tabularcolumns:: |l|L| - +----------------------------------------+-----------------------------------------------+ - | Attribute | Explanation | - +========================================+===============================================+ - | :const:`bits_per_digit` | number of bits held in each digit. Python | - | | integers are stored internally in base | - | | ``2**int_info.bits_per_digit`` | - +----------------------------------------+-----------------------------------------------+ - | :const:`sizeof_digit` | size in bytes of the C type used to | - | | represent a digit | - +----------------------------------------+-----------------------------------------------+ - | :const:`default_max_str_digits` | default value for | - | | :func:`sys.get_int_max_str_digits` when it | - | | is not otherwise explicitly configured. | - +----------------------------------------+-----------------------------------------------+ - | :const:`str_digits_check_threshold` | minimum non-zero value for | - | | :func:`sys.set_int_max_str_digits`, | - | | :envvar:`PYTHONINTMAXSTRDIGITS`, or | - | | :option:`-X int_max_str_digits <-X>`. | - +----------------------------------------+-----------------------------------------------+ + +-------------------------+----------------------------------------------+ + | Attribute | Explanation | + +=========================+==============================================+ + | :const:`bits_per_digit` | number of bits held in each digit. Python | + | | integers are stored internally in base | + | | ``2**int_info.bits_per_digit`` | + +-------------------------+----------------------------------------------+ + | :const:`sizeof_digit` | size in bytes of the C type used to | + | | represent a digit | + +-------------------------+----------------------------------------------+ .. versionadded:: 3.1 - .. versionchanged:: 3.9.14 - Added ``default_max_str_digits`` and ``str_digits_check_threshold``. - .. data:: __interactivehook__ @@ -1080,6 +1076,16 @@ always available. deleting essential items from the dictionary may cause Python to fail. +.. data:: orig_argv + + The list of the original command line arguments passed to the Python + executable. + + See also :data:`sys.argv`. + + .. versionadded:: 3.10 + + .. data:: path .. index:: triple: module; search; path @@ -1206,10 +1212,13 @@ always available. .. data:: prefix A string giving the site-specific directory prefix where the platform - independent Python files are installed; on Unix, the default is + independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` - argument to the :program:`configure` script. See - :ref:`installation_paths` for derived paths. + argument to the :program:`configure` script. The main collection of Python + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}` + while the platform independent header files (all except :file:`pyconfig.h`) are + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version + number of Python, for example ``3.2``. .. note:: If a :ref:`virtual environment ` is in effect, this value will be changed in ``site.py`` to point to the virtual @@ -1246,14 +1255,6 @@ always available. .. availability:: Unix. -.. function:: set_int_max_str_digits(n) - - Set the :ref:`integer string conversion length limitation - ` used by this interpreter. See also - :func:`get_int_max_str_digits`. - - .. versionadded:: 3.9.14 - .. function:: setprofile(profilefunc) .. index:: @@ -1472,12 +1473,16 @@ always available. .. function:: _enablelegacywindowsfsencoding() - Changes the default filesystem encoding and errors mode to 'mbcs' and - 'replace' respectively, for consistency with versions of Python prior to 3.6. + Changes the :term:`filesystem encoding and error handler` to 'mbcs' and + 'replace' respectively, for consistency with versions of Python prior to + 3.6. This is equivalent to defining the :envvar:`PYTHONLEGACYWINDOWSFSENCODING` environment variable before launching Python. + See also :func:`sys.getfilesystemencoding` and + :func:`sys.getfilesystemencodeerrors`. + .. availability:: Windows. .. versionadded:: 3.6 @@ -1500,9 +1505,8 @@ always available. returned by the :func:`open` function. Their parameters are chosen as follows: - * The character encoding is platform-dependent. Non-Windows - platforms use the locale encoding (see - :meth:`locale.getpreferredencoding()`). + * The encoding and error handling are is initialized from + :c:member:`PyConfig.stdio_encoding` and :c:member:`PyConfig.stdio_errors`. On Windows, UTF-8 is used for the console device. Non-character devices such as disk files and pipes use the system locale @@ -1510,7 +1514,7 @@ always available. devices such as NUL (i.e. where ``isatty()`` returns ``True``) use the value of the console input and output codepages at startup, respectively for stdin and stdout/stderr. This defaults to the - system locale encoding if the process is not initially attached + system :term:`locale encoding` if the process is not initially attached to a console. The special behaviour of the console can be overridden @@ -1568,6 +1572,25 @@ always available. to a console and Python apps started with :program:`pythonw`. +.. data:: stdlib_module_names + + A frozenset of strings containing the names of standard library modules. + + It is the same on all platforms. Modules which are not available on + some platforms and modules disabled at Python build are also listed. + All module kinds are listed: pure Python, built-in, frozen and extension + modules. Test modules are excluded. + + For packages, only the main package is listed: sub-packages and sub-modules + are not listed. For example, the ``email`` package is listed, but the + ``email.mime`` sub-package and the ``email.message`` sub-module are not + listed. + + See also the :attr:`sys.builtin_module_names` list. + + .. versionadded:: 3.10 + + .. data:: thread_info A :term:`named tuple` holding information about the thread diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst index e2ee6db3..6327318e 100644 --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -60,7 +60,6 @@ Example of usage:: >>> sysconfig.get_config_vars('AR', 'CXX') ['ar', 'g++'] -.. _installation_paths: Installation paths ------------------ @@ -73,7 +72,7 @@ Every new component that is installed using :mod:`distutils` or a Distutils-based system will follow the same scheme to copy its file in the right places. -Python currently supports six schemes: +Python currently supports seven schemes: - *posix_prefix*: scheme for POSIX platforms like Linux or macOS. This is the default scheme used when Python or a component is installed. @@ -85,7 +84,6 @@ Python currently supports six schemes: located under the user home directory. - *nt*: scheme for NT platforms like Windows. - *nt_user*: scheme for NT platforms, when the *user* option is used. -- *osx_framework_user*: scheme for macOS, when the *user* option is used. Each scheme is itself composed of a series of paths and each path has a unique identifier. Python currently uses eight paths: @@ -109,6 +107,43 @@ identifier. Python currently uses eight paths: :mod:`sysconfig`. +.. function:: get_default_scheme() + + Return the default scheme name for the current platform. + + .. versionchanged:: 3.10 + This function was previously named ``_get_default_scheme()`` and + considered an implementation detail. + + +.. function:: get_preferred_scheme(key) + + Return a preferred scheme name for an installation layout specified by *key*. + + *key* must be either ``"prefix"``, ``"home"``, or ``"user"``. + + The return value is a scheme name listed in :func:`get_scheme_names`. It + can be passed to :mod:`sysconfig` functions that take a *scheme* argument, + such as :func:`get_paths`. + + .. versionadded:: 3.10 + + +.. function:: _get_preferred_schemes() + + Return a dict containing preferred scheme names on the current platform. + Python implementers and redistributors may add their preferred schemes to + the ``_INSTALL_SCHEMES`` module-level global value, and modify this function + to return those scheme names, to e.g. provide different schemes for system + and language package managers to use, so packages installed by either do not + mix with those by the other. + + End users should not use this function, but :func:`get_default_scheme` and + :func:`get_preferred_scheme()` instead. + + .. versionadded:: 3.10 + + .. function:: get_path_names() Return a tuple containing all path names currently supported in @@ -226,6 +261,7 @@ Other functions Return the path of :file:`Makefile`. + Using :mod:`sysconfig` as a script ---------------------------------- diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst index 48a927c8..48a9aea5 100644 --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -3,7 +3,6 @@ .. module:: telnetlib :synopsis: Telnet client class. - :deprecated: .. sectionauthor:: Skip Montanaro @@ -11,10 +10,6 @@ .. index:: single: protocol; Telnet -.. deprecated:: 3.11 - The :mod:`telnetlib` module is deprecated - (see :pep:`PEP 594 <594#telnetlib>` for details and alternatives). - -------------- The :mod:`telnetlib` module provides a :class:`Telnet` class that implements the diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index fe47a4f0..b8a5fa00 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -62,9 +62,6 @@ The module defines the following user-callable items: The :py:data:`os.O_TMPFILE` flag is used if it is available and works (Linux-specific, requires Linux kernel 3.11 or later). - On platforms that are neither Posix nor Cygwin, TemporaryFile is an alias - for NamedTemporaryFile. - .. audit-event:: tempfile.mkstemp fullpath tempfile.TemporaryFile .. versionchanged:: 3.5 @@ -84,7 +81,7 @@ The module defines the following user-callable items: file-like object. Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot - on Windows). If *delete* is true (the default), the file is + on Windows NT or later). If *delete* is true (the default), the file is deleted as soon as it is closed. The returned object is always a file-like object whose :attr:`!file` attribute is the underlying true file object. This file-like object can @@ -121,12 +118,12 @@ The module defines the following user-callable items: Added *errors* parameter. -.. function:: TemporaryDirectory(suffix=None, prefix=None, dir=None) +.. function:: TemporaryDirectory(suffix=None, prefix=None, dir=None, ignore_cleanup_errors=False) This function securely creates a temporary directory using the same rules as :func:`mkdtemp`. The resulting object can be used as a context manager (see :ref:`tempfile-examples`). On completion of the context or destruction - of the temporary directory object the newly created temporary directory + of the temporary directory object, the newly created temporary directory and all its contents are removed from the filesystem. The directory name can be retrieved from the :attr:`name` attribute of the @@ -135,12 +132,21 @@ The module defines the following user-callable items: the :keyword:`with` statement, if there is one. The directory can be explicitly cleaned up by calling the - :func:`cleanup` method. + :func:`cleanup` method. If *ignore_cleanup_errors* is true, any unhandled + exceptions during explicit or implicit cleanup (such as a + :exc:`PermissionError` removing open files on Windows) will be ignored, + and the remaining removable items deleted on a "best-effort" basis. + Otherwise, errors will be raised in whatever context cleanup occurs + (the :func:`cleanup` call, exiting the context manager, when the object + is garbage-collected or during interpreter shutdown). .. audit-event:: tempfile.mkdtemp fullpath tempfile.TemporaryDirectory .. versionadded:: 3.2 + .. versionchanged:: 3.10 + Added *ignore_cleanup_errors* parameter. + .. function:: mkstemp(suffix=None, prefix=None, dir=None, text=False) @@ -251,6 +257,11 @@ The module defines the following user-callable items: The result of this search is cached, see the description of :data:`tempdir` below. + .. versionchanged:: 3.10 + + Always returns a str. Previously it would return any :data:`tempdir` + value regardless of type so long as it was not ``None``. + .. function:: gettempdirb() Same as :func:`gettempdir` but the return value is in bytes. @@ -272,18 +283,30 @@ The module uses a global variable to store the name of the directory used for temporary files returned by :func:`gettempdir`. It can be set directly to override the selection process, but this is discouraged. All functions in this module take a *dir* argument which can be used -to specify the directory and this is the recommended approach. +to specify the directory. This is the recommended approach that does +not surprise other unsuspecting code by changing global API behavior. .. data:: tempdir When set to a value other than ``None``, this variable defines the default value for the *dir* argument to the functions defined in this - module. + module, including its type, bytes or str. It cannot be a + :term:`path-like object`. If ``tempdir`` is ``None`` (the default) at any call to any of the above functions except :func:`gettempprefix` it is initialized following the algorithm described in :func:`gettempdir`. + .. note:: + + Beware that if you set ``tempdir`` to a bytes value, there is a + nasty side effect: The global default return type of + :func:`mkstemp` and :func:`mkdtemp` changes to bytes when no + explicit ``prefix``, ``suffix``, or ``dir`` arguments of type + str are supplied. Please do not write code expecting or + depending on this. This awkward behavior is maintained for + compatibility with the historical implementation. + .. _tempfile-examples: Examples diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 563197f8..a6cc2be4 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -247,46 +247,6 @@ The :mod:`test.support` module defines the following constants: Path for shell if not on Windows; otherwise ``None``. -.. data:: FS_NONASCII - - A non-ASCII character encodable by :func:`os.fsencode`. - - -.. data:: TESTFN - - Set to a name that is safe to use as the name of a temporary file. Any - temporary file that is created should be closed and unlinked (removed). - - -.. data:: TESTFN_UNICODE - - Set to a non-ASCII name for a temporary file. - - -.. data:: TESTFN_ENCODING - - Set to :func:`sys.getfilesystemencoding`. - - -.. data:: TESTFN_UNENCODABLE - - Set to a filename (str type) that should not be able to be encoded by file - system encoding in strict mode. It may be ``None`` if it's not possible to - generate such a filename. - - -.. data:: TESTFN_UNDECODABLE - - Set to a filename (bytes type) that should not be able to be decoded by - file system encoding in strict mode. It may be ``None`` if it's not - possible to generate such a filename. - - -.. data:: TESTFN_NONASCII - - Set to a filename containing the :data:`FS_NONASCII` character. - - .. data:: LOOPBACK_TIMEOUT Timeout in seconds for tests using a network server listening on the network @@ -307,10 +267,10 @@ The :mod:`test.support` module defines the following constants: .. data:: INTERNET_TIMEOUT - Timeout in seconds for network requests going to the Internet. + Timeout in seconds for network requests going to the internet. The timeout is short enough to prevent a test to wait for too long if the - Internet request is blocked for whatever reason. + internet request is blocked for whatever reason. Usually, a timeout using :data:`INTERNET_TIMEOUT` should not mark a test as failed, but skip the test instead: see @@ -348,11 +308,6 @@ The :mod:`test.support` module defines the following constants: :data:`SHORT_TIMEOUT`. -.. data:: SAVEDCWD - - Set to :func:`os.getcwd`. - - .. data:: PGO Set when tests can be skipped when they are not useful for PGO. @@ -443,44 +398,6 @@ The :mod:`test.support` module defines the following constants: The :mod:`test.support` module defines the following functions: -.. function:: forget(module_name) - - Remove the module named *module_name* from ``sys.modules`` and delete any - byte-compiled files of the module. - - -.. function:: unload(name) - - Delete *name* from ``sys.modules``. - - -.. function:: unlink(filename) - - Call :func:`os.unlink` on *filename*. On Windows platforms, this is - wrapped with a wait loop that checks for the existence of the file. - - -.. function:: rmdir(filename) - - Call :func:`os.rmdir` on *filename*. On Windows platforms, this is - wrapped with a wait loop that checks for the existence of the file. - - -.. function:: rmtree(path) - - Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and - :func:`os.rmdir` to remove a path and its contents. On Windows platforms, - this is wrapped with a wait loop that checks for the existence of the files. - - -.. function:: make_legacy_pyc(source) - - Move a :pep:`3147`/:pep:`488` pyc file to its legacy pyc location and return the file - system path to the legacy pyc file. The *source* value is the file system - path to the source file. It does not need to exist, however the PEP - 3147/488 pyc file must exist. - - .. function:: is_resource_enabled(resource) Return ``True`` if *resource* is enabled and available. The list of @@ -526,16 +443,6 @@ The :mod:`test.support` module defines the following functions: rather than looking directly in the path directories. -.. function:: create_empty_file(filename) - - Create an empty file with *filename*. If it already exists, truncate it. - - -.. function:: fd_count() - - Count the number of open file descriptors. - - .. function:: match_test(test) Match *test* to patterns set in :func:`set_match_tests`. @@ -590,79 +497,6 @@ The :mod:`test.support` module defines the following functions: check_impl_detail(cpython=False) # Everywhere except CPython. -.. function:: check_warnings(\*filters, quiet=True) - - A convenience wrapper for :func:`warnings.catch_warnings()` that makes it - easier to test that a warning was correctly raised. It is approximately - equivalent to calling ``warnings.catch_warnings(record=True)`` with - :meth:`warnings.simplefilter` set to ``always`` and with the option to - automatically validate the results that are recorded. - - ``check_warnings`` accepts 2-tuples of the form ``("message regexp", - WarningCategory)`` as positional arguments. If one or more *filters* are - provided, or if the optional keyword argument *quiet* is ``False``, - it checks to make sure the warnings are as expected: each specified filter - must match at least one of the warnings raised by the enclosed code or the - test fails, and if any warnings are raised that do not match any of the - specified filters the test fails. To disable the first of these checks, - set *quiet* to ``True``. - - If no arguments are specified, it defaults to:: - - check_warnings(("", Warning), quiet=True) - - In this case all warnings are caught and no errors are raised. - - On entry to the context manager, a :class:`WarningRecorder` instance is - returned. The underlying warnings list from - :func:`~warnings.catch_warnings` is available via the recorder object's - :attr:`warnings` attribute. As a convenience, the attributes of the object - representing the most recent warning can also be accessed directly through - the recorder object (see example below). If no warning has been raised, - then any of the attributes that would otherwise be expected on an object - representing a warning will return ``None``. - - The recorder object also has a :meth:`reset` method, which clears the - warnings list. - - The context manager is designed to be used like this:: - - with check_warnings(("assertion is always true", SyntaxWarning), - ("", UserWarning)): - exec('assert(False, "Hey!")') - warnings.warn(UserWarning("Hide me!")) - - In this case if either warning was not raised, or some other warning was - raised, :func:`check_warnings` would raise an error. - - When a test needs to look more deeply into the warnings, rather than - just checking whether or not they occurred, code like this can be used:: - - with check_warnings(quiet=True) as w: - warnings.warn("foo") - assert str(w.args[0]) == "foo" - warnings.warn("bar") - assert str(w.args[0]) == "bar" - assert str(w.warnings[0].args[0]) == "foo" - assert str(w.warnings[1].args[0]) == "bar" - w.reset() - assert len(w.warnings) == 0 - - - Here all warnings will be caught, and the test code tests the captured - warnings directly. - - .. versionchanged:: 3.2 - New optional arguments *filters* and *quiet*. - - -.. function:: check_no_resource_warning(testcase) - - Context manager to check that no :exc:`ResourceWarning` was raised. You - must remove the object which may emit :exc:`ResourceWarning` before the - end of the context manager. - - .. function:: set_memlimit(limit) Set the values for :data:`max_memuse` and :data:`real_max_memuse` for big @@ -718,47 +552,6 @@ The :mod:`test.support` module defines the following functions: self.assertEqual(captured, "hello") -.. function:: temp_dir(path=None, quiet=False) - - A context manager that creates a temporary directory at *path* and - yields the directory. - - If *path* is ``None``, the temporary directory is created using - :func:`tempfile.mkdtemp`. If *quiet* is ``False``, the context manager - raises an exception on error. Otherwise, if *path* is specified and - cannot be created, only a warning is issued. - - -.. function:: change_cwd(path, quiet=False) - - A context manager that temporarily changes the current working - directory to *path* and yields the directory. - - If *quiet* is ``False``, the context manager raises an exception - on error. Otherwise, it issues only a warning and keeps the current - working directory the same. - - -.. function:: temp_cwd(name='tempcwd', quiet=False) - - A context manager that temporarily creates a new directory and - changes the current working directory (CWD). - - The context manager creates a temporary directory in the current - directory with name *name* before temporarily changing the current - working directory. If *name* is ``None``, the temporary directory is - created using :func:`tempfile.mkdtemp`. - - If *quiet* is ``False`` and it is not possible to create or change - the CWD, an error is raised. Otherwise, only a warning is raised - and the original CWD is used. - - -.. function:: temp_umask(umask) - - A context manager that temporarily sets the process umask. - - .. function:: disable_faulthandler() A context manager that replaces ``sys.stderr`` with ``sys.__stderr__``. @@ -838,18 +631,6 @@ The :mod:`test.support` module defines the following functions: .. versionadded:: 3.9 -.. function:: wait_threads_exit(timeout=60.0) - - Context manager to wait until all threads created in the ``with`` statement - exit. - - -.. function:: start_threads(threads, unlock=None) - - Context manager to start *threads*. It attempts to join the threads upon - exit. - - .. function:: calcobjsize(fmt) Return :func:`struct.calcsize` for ``nP{fmt}0n`` or, if ``gettotalrefcount`` @@ -868,28 +649,6 @@ The :mod:`test.support` module defines the following functions: header size equals *size*. -.. function:: can_symlink() - - Return ``True`` if the OS supports symbolic links, ``False`` - otherwise. - - -.. function:: can_xattr() - - Return ``True`` if the OS supports xattr, ``False`` - otherwise. - - -.. decorator:: skip_unless_symlink - - A decorator for running tests that require support for symbolic links. - - -.. decorator:: skip_unless_xattr - - A decorator for running tests that require support for xattr. - - .. decorator:: anticipate_failure(condition) A decorator to conditionally mark tests with @@ -988,11 +747,6 @@ The :mod:`test.support` module defines the following functions: the trace function. -.. decorator:: reap_threads(func) - - Decorator to ensure the threads are cleaned up even if the test fails. - - .. decorator:: bigmemtest(size, memuse, dry_run=True) Decorator for bigmem tests. @@ -1014,12 +768,6 @@ The :mod:`test.support` module defines the following functions: wrap. -.. function:: make_bad_fd() - - Create an invalid file descriptor by opening and closing a temporary file, - and returning its descriptor. - - .. function:: check_syntax_error(testcase, statement, errtext='', *, lineno=None, offset=None) Test for syntax errors in *statement* by attempting to compile *statement*. @@ -1030,103 +778,11 @@ The :mod:`test.support` module defines the following functions: the offset of the exception. -.. function:: check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None) - - Test for syntax warning in *statement* by attempting to compile *statement*. - Test also that the :exc:`SyntaxWarning` is emitted only once, and that it - will be converted to a :exc:`SyntaxError` when turned into error. - *testcase* is the :mod:`unittest` instance for the test. *errtext* is the - regular expression which should match the string representation of the - emitted :exc:`SyntaxWarning` and raised :exc:`SyntaxError`. If *lineno* - is not ``None``, compares to the line of the warning and exception. - If *offset* is not ``None``, compares to the offset of the exception. - - .. versionadded:: 3.8 - - -.. function:: open_urlresource(url, *args, **kw) +.. function:: open_urlresource(url, *args, **kw) Open *url*. If open fails, raises :exc:`TestFailed`. -.. function:: import_module(name, deprecated=False, *, required_on()) - - This function imports and returns the named module. Unlike a normal - import, this function raises :exc:`unittest.SkipTest` if the module - cannot be imported. - - Module and package deprecation messages are suppressed during this import - if *deprecated* is ``True``. If a module is required on a platform but - optional for others, set *required_on* to an iterable of platform prefixes - which will be compared against :data:`sys.platform`. - - .. versionadded:: 3.1 - - -.. function:: import_fresh_module(name, fresh=(), blocked=(), deprecated=False) - - This function imports and returns a fresh copy of the named Python module - by removing the named module from ``sys.modules`` before doing the import. - Note that unlike :func:`reload`, the original module is not affected by - this operation. - - *fresh* is an iterable of additional module names that are also removed - from the ``sys.modules`` cache before doing the import. - - *blocked* is an iterable of module names that are replaced with ``None`` - in the module cache during the import to ensure that attempts to import - them raise :exc:`ImportError`. - - The named module and any modules named in the *fresh* and *blocked* - parameters are saved before starting the import and then reinserted into - ``sys.modules`` when the fresh import is complete. - - Module and package deprecation messages are suppressed during this import - if *deprecated* is ``True``. - - This function will raise :exc:`ImportError` if the named module cannot be - imported. - - Example use:: - - # Get copies of the warnings module for testing without affecting the - # version being used by the rest of the test suite. One copy uses the - # C implementation, the other is forced to use the pure Python fallback - # implementation - py_warnings = import_fresh_module('warnings', blocked=['_warnings']) - c_warnings = import_fresh_module('warnings', fresh=['_warnings']) - - .. versionadded:: 3.1 - - -.. function:: modules_setup() - - Return a copy of :data:`sys.modules`. - - -.. function:: modules_cleanup(oldmodules) - - Remove modules except for *oldmodules* and ``encodings`` in order to - preserve internal cache. - - -.. function:: threading_setup() - - Return current thread count and copy of dangling threads. - - -.. function:: threading_cleanup(*original_values) - - Cleanup up threads not specified in *original_values*. Designed to emit - a warning if a test leaves running threads in the background. - - -.. function:: join_thread(thread, timeout=30.0) - - Join a *thread* within *timeout*. Raise an :exc:`AssertionError` if thread - is still alive after *timeout* seconds. - - .. function:: reap_children() Use this at the end of ``test_main`` whenever sub-processes are started. @@ -1140,39 +796,6 @@ The :mod:`test.support` module defines the following functions: is raised. -.. function:: catch_threading_exception() - - Context manager catching :class:`threading.Thread` exception using - :func:`threading.excepthook`. - - Attributes set when an exception is caught: - - * ``exc_type`` - * ``exc_value`` - * ``exc_traceback`` - * ``thread`` - - See :func:`threading.excepthook` documentation. - - These attributes are deleted at the context manager exit. - - Usage:: - - with support.catch_threading_exception() as cm: - # code spawning a thread which raises an exception - ... - - # check the thread exception, use cm attributes: - # exc_type, exc_value, exc_traceback, thread - ... - - # exc_type, exc_value, exc_traceback, thread attributes of cm no longer - # exists at this point - # (to avoid reference cycles) - - .. versionadded:: 3.8 - - .. function:: catch_unraisable_exception() Context manager catching unraisable exception using @@ -1216,11 +839,6 @@ The :mod:`test.support` module defines the following functions: return load_package_tests(os.path.dirname(__file__), *args) -.. function:: fs_is_case_insensitive(directory) - - Return ``True`` if the file system for *directory* is case-insensitive. - - .. function:: detect_api_mismatch(ref_api, other_api, *, ignore=()) Returns the set of attributes, functions or methods of *ref_api* not @@ -1260,7 +878,7 @@ The :mod:`test.support` module defines the following functions: missing. -.. function:: check__all__(test_case, module, name_of_module=None, extra=(), blacklist=()) +.. function:: check__all__(test_case, module, name_of_module=None, extra=(), not_exported=()) Assert that the ``__all__`` variable of *module* contains all public names. @@ -1277,8 +895,8 @@ The :mod:`test.support` module defines the following functions: detected as "public", like objects without a proper ``__module__`` attribute. If provided, it will be added to the automatically detected ones. - The *blacklist* argument can be a set of names that must not be treated as part of - the public API even though their names indicate otherwise. + The *not_exported* argument can be a set of names that must not be treated + as part of the public API even though their names indicate otherwise. Example use:: @@ -1294,55 +912,30 @@ The :mod:`test.support` module defines the following functions: class OtherTestCase(unittest.TestCase): def test__all__(self): extra = {'BAR_CONST', 'FOO_CONST'} - blacklist = {'baz'} # Undocumented name. + not_exported = {'baz'} # Undocumented name. # bar imports part of its API from _bar. support.check__all__(self, bar, ('bar', '_bar'), - extra=extra, blacklist=blacklist) + extra=extra, not_exported=not_exported) .. versionadded:: 3.6 +.. function:: skip_if_broken_multiprocessing_synchronize() -.. function:: adjust_int_max_str_digits(max_digits) - - This function returns a context manager that will change the global - :func:`sys.set_int_max_str_digits` setting for the duration of the - context to allow execution of test code that needs a different limit - on the number of digits when converting between an integer and string. - - .. versionadded:: 3.9.14 - - -The :mod:`test.support` module defines the following classes: - -.. class:: TransientResource(exc, **kwargs) - - Instances are a context manager that raises :exc:`ResourceDenied` if the - specified exception type is raised. Any keyword arguments are treated as - attribute/value pairs to be compared against any exception raised within the - :keyword:`with` statement. Only if all pairs match properly against - attributes on the exception is :exc:`ResourceDenied` raised. + Skip tests if the :mod:`multiprocessing.synchronize` module is missing, if + there is no available semaphore implementation, or if creating a lock raises + an :exc:`OSError`. + .. versionadded:: 3.10 -.. class:: EnvironmentVarGuard() - - Class used to temporarily set or unset environment variables. Instances can - be used as a context manager and have a complete dictionary interface for - querying/modifying the underlying ``os.environ``. After exit from the - context manager all changes to environment variables done through this - instance will be rolled back. - - .. versionchanged:: 3.1 - Added dictionary interface. -.. method:: EnvironmentVarGuard.set(envvar, value) +.. function:: check_disallow_instantiation(test_case, tp, *args, **kwds) - Temporarily set the environment variable ``envvar`` to the value of - ``value``. + Assert that type *tp* cannot be instantiated using *args* and *kwds*. + .. versionadded:: 3.10 -.. method:: EnvironmentVarGuard.unset(envvar) - Temporarily unset the environment variable ``envvar``. +The :mod:`test.support` module defines the following classes: .. class:: SuppressCrashReport() @@ -1360,29 +953,6 @@ The :mod:`test.support` module defines the following classes: On both platforms, the old value is restored by :meth:`__exit__`. -.. class:: CleanImport(*module_names) - - A context manager to force import to return a new module reference. This - is useful for testing module-level behaviors, such as the emission of a - DeprecationWarning on import. Example usage:: - - with CleanImport('foo'): - importlib.import_module('foo') # New reference. - - -.. class:: DirsOnSysPath(*paths) - - A context manager to temporarily add directories to sys.path. - - This makes a copy of :data:`sys.path`, appends any directories given - as positional arguments, then reverts :data:`sys.path` to the copied - settings when the context ends. - - Note that *all* :data:`sys.path` modifications in the body of the - context manager, including replacement of the object, - will be reverted at the end of the block. - - .. class:: SaveSignals() Class to save and restore signal handlers registered by the Python signal @@ -1401,12 +971,6 @@ The :mod:`test.support` module defines the following classes: Try to match a single stored value (*dv*) with a supplied value (*v*). -.. class:: WarningsRecorder() - - Class used to record warnings for unit tests. See documentation of - :func:`check_warnings` above for more details. - - .. class:: BasicTestRunner() .. method:: run(test) @@ -1414,13 +978,6 @@ The :mod:`test.support` module defines the following classes: Run *test* and return the result. -.. class:: FakePath(path) - - Simple :term:`path-like object`. It implements the :meth:`__fspath__` - method which just returns the *path* argument. If *path* is an exception, - it will be raised in :meth:`!__fspath__`. - - :mod:`test.support.socket_helper` --- Utilities for socket tests ================================================================ @@ -1640,3 +1197,483 @@ The module defines the following class: .. method:: BytecodeTestCase.assertNotInBytecode(x, opname, argval=_UNSPECIFIED) Throws :exc:`AssertionError` if *opname* is found. + + +:mod:`test.support.threading_helper` --- Utilities for threading tests +====================================================================== + +.. module:: test.support.threading_helper + :synopsis: Support for threading tests. + +The :mod:`test.support.threading_helper` module provides support for threading tests. + +.. versionadded:: 3.10 + + +.. function:: join_thread(thread, timeout=None) + + Join a *thread* within *timeout*. Raise an :exc:`AssertionError` if thread + is still alive after *timeout* seconds. + + +.. decorator:: reap_threads(func) + + Decorator to ensure the threads are cleaned up even if the test fails. + + +.. function:: start_threads(threads, unlock=None) + + Context manager to start *threads*. It attempts to join the threads upon + exit. + + +.. function:: threading_cleanup(*original_values) + + Cleanup up threads not specified in *original_values*. Designed to emit + a warning if a test leaves running threads in the background. + + +.. function:: threading_setup() + + Return current thread count and copy of dangling threads. + + +.. function:: wait_threads_exit(timeout=None) + + Context manager to wait until all threads created in the ``with`` statement + exit. + + +.. function:: catch_threading_exception() + + Context manager catching :class:`threading.Thread` exception using + :func:`threading.excepthook`. + + Attributes set when an exception is catched: + + * ``exc_type`` + * ``exc_value`` + * ``exc_traceback`` + * ``thread`` + + See :func:`threading.excepthook` documentation. + + These attributes are deleted at the context manager exit. + + Usage:: + + with threading_helper.catch_threading_exception() as cm: + # code spawning a thread which raises an exception + ... + + # check the thread exception, use cm attributes: + # exc_type, exc_value, exc_traceback, thread + ... + + # exc_type, exc_value, exc_traceback, thread attributes of cm no longer + # exists at this point + # (to avoid reference cycles) + + .. versionadded:: 3.8 + + +:mod:`test.support.os_helper` --- Utilities for os tests +======================================================================== + +.. module:: test.support.os_helper + :synopsis: Support for os tests. + +The :mod:`test.support.os_helper` module provides support for os tests. + +.. versionadded:: 3.10 + + +.. data:: FS_NONASCII + + A non-ASCII character encodable by :func:`os.fsencode`. + + +.. data:: SAVEDCWD + + Set to :func:`os.getcwd`. + + +.. data:: TESTFN + + Set to a name that is safe to use as the name of a temporary file. Any + temporary file that is created should be closed and unlinked (removed). + + +.. data:: TESTFN_NONASCII + + Set to a filename containing the :data:`FS_NONASCII` character. + + +.. data:: TESTFN_UNENCODABLE + + Set to a filename (str type) that should not be able to be encoded by file + system encoding in strict mode. It may be ``None`` if it's not possible to + generate such a filename. + + +.. data:: TESTFN_UNDECODABLE + + Set to a filename (bytes type) that should not be able to be decoded by + file system encoding in strict mode. It may be ``None`` if it's not + possible to generate such a filename. + + +.. data:: TESTFN_UNICODE + + Set to a non-ASCII name for a temporary file. + + +.. class:: EnvironmentVarGuard() + + Class used to temporarily set or unset environment variables. Instances can + be used as a context manager and have a complete dictionary interface for + querying/modifying the underlying ``os.environ``. After exit from the + context manager all changes to environment variables done through this + instance will be rolled back. + + .. versionchanged:: 3.1 + Added dictionary interface. + + +.. class:: FakePath(path) + + Simple :term:`path-like object`. It implements the :meth:`__fspath__` + method which just returns the *path* argument. If *path* is an exception, + it will be raised in :meth:`!__fspath__`. + + +.. method:: EnvironmentVarGuard.set(envvar, value) + + Temporarily set the environment variable ``envvar`` to the value of + ``value``. + + +.. method:: EnvironmentVarGuard.unset(envvar) + + Temporarily unset the environment variable ``envvar``. + + +.. function:: can_symlink() + + Return ``True`` if the OS supports symbolic links, ``False`` + otherwise. + + +.. function:: can_xattr() + + Return ``True`` if the OS supports xattr, ``False`` + otherwise. + + +.. function:: change_cwd(path, quiet=False) + + A context manager that temporarily changes the current working + directory to *path* and yields the directory. + + If *quiet* is ``False``, the context manager raises an exception + on error. Otherwise, it issues only a warning and keeps the current + working directory the same. + + +.. function:: create_empty_file(filename) + + Create an empty file with *filename*. If it already exists, truncate it. + + +.. function:: fd_count() + + Count the number of open file descriptors. + + +.. function:: fs_is_case_insensitive(directory) + + Return ``True`` if the file system for *directory* is case-insensitive. + + +.. function:: make_bad_fd() + + Create an invalid file descriptor by opening and closing a temporary file, + and returning its descriptor. + + +.. function:: rmdir(filename) + + Call :func:`os.rmdir` on *filename*. On Windows platforms, this is + wrapped with a wait loop that checks for the existence of the file. + + +.. function:: rmtree(path) + + Call :func:`shutil.rmtree` on *path* or call :func:`os.lstat` and + :func:`os.rmdir` to remove a path and its contents. On Windows platforms, + this is wrapped with a wait loop that checks for the existence of the files. + + +.. decorator:: skip_unless_symlink + + A decorator for running tests that require support for symbolic links. + + +.. decorator:: skip_unless_xattr + + A decorator for running tests that require support for xattr. + + +.. function:: temp_cwd(name='tempcwd', quiet=False) + + A context manager that temporarily creates a new directory and + changes the current working directory (CWD). + + The context manager creates a temporary directory in the current + directory with name *name* before temporarily changing the current + working directory. If *name* is ``None``, the temporary directory is + created using :func:`tempfile.mkdtemp`. + + If *quiet* is ``False`` and it is not possible to create or change + the CWD, an error is raised. Otherwise, only a warning is raised + and the original CWD is used. + + +.. function:: temp_dir(path=None, quiet=False) + + A context manager that creates a temporary directory at *path* and + yields the directory. + + If *path* is ``None``, the temporary directory is created using + :func:`tempfile.mkdtemp`. If *quiet* is ``False``, the context manager + raises an exception on error. Otherwise, if *path* is specified and + cannot be created, only a warning is issued. + + +.. function:: temp_umask(umask) + + A context manager that temporarily sets the process umask. + + +.. function:: unlink(filename) + + Call :func:`os.unlink` on *filename*. On Windows platforms, this is + wrapped with a wait loop that checks for the existence fo the file. + + +:mod:`test.support.import_helper` --- Utilities for import tests +================================================================ + +.. module:: test.support.import_helper + :synopsis: Support for import tests. + +The :mod:`test.support.import_helper` module provides support for import tests. + +.. versionadded:: 3.10 + + +.. function:: forget(module_name) + + Remove the module named *module_name* from ``sys.modules`` and delete any + byte-compiled files of the module. + + +.. function:: import_fresh_module(name, fresh=(), blocked=(), deprecated=False) + + This function imports and returns a fresh copy of the named Python module + by removing the named module from ``sys.modules`` before doing the import. + Note that unlike :func:`reload`, the original module is not affected by + this operation. + + *fresh* is an iterable of additional module names that are also removed + from the ``sys.modules`` cache before doing the import. + + *blocked* is an iterable of module names that are replaced with ``None`` + in the module cache during the import to ensure that attempts to import + them raise :exc:`ImportError`. + + The named module and any modules named in the *fresh* and *blocked* + parameters are saved before starting the import and then reinserted into + ``sys.modules`` when the fresh import is complete. + + Module and package deprecation messages are suppressed during this import + if *deprecated* is ``True``. + + This function will raise :exc:`ImportError` if the named module cannot be + imported. + + Example use:: + + # Get copies of the warnings module for testing without affecting the + # version being used by the rest of the test suite. One copy uses the + # C implementation, the other is forced to use the pure Python fallback + # implementation + py_warnings = import_fresh_module('warnings', blocked=['_warnings']) + c_warnings = import_fresh_module('warnings', fresh=['_warnings']) + + .. versionadded:: 3.1 + + +.. function:: import_module(name, deprecated=False, *, required_on()) + + This function imports and returns the named module. Unlike a normal + import, this function raises :exc:`unittest.SkipTest` if the module + cannot be imported. + + Module and package deprecation messages are suppressed during this import + if *deprecated* is ``True``. If a module is required on a platform but + optional for others, set *required_on* to an iterable of platform prefixes + which will be compared against :data:`sys.platform`. + + .. versionadded:: 3.1 + + +.. function:: modules_setup() + + Return a copy of :data:`sys.modules`. + + +.. function:: modules_cleanup(oldmodules) + + Remove modules except for *oldmodules* and ``encodings`` in order to + preserve internal cache. + + +.. function:: unload(name) + + Delete *name* from ``sys.modules``. + + +.. function:: make_legacy_pyc(source) + + Move a :pep:`3147`/:pep:`488` pyc file to its legacy pyc location and return the file + system path to the legacy pyc file. The *source* value is the file system + path to the source file. It does not need to exist, however the PEP + 3147/488 pyc file must exist. + + +.. class:: CleanImport(*module_names) + + A context manager to force import to return a new module reference. This + is useful for testing module-level behaviors, such as the emission of a + DeprecationWarning on import. Example usage:: + + with CleanImport('foo'): + importlib.import_module('foo') # New reference. + + +.. class:: DirsOnSysPath(*paths) + + A context manager to temporarily add directories to sys.path. + + This makes a copy of :data:`sys.path`, appends any directories given + as positional arguments, then reverts :data:`sys.path` to the copied + settings when the context ends. + + Note that *all* :data:`sys.path` modifications in the body of the + context manager, including replacement of the object, + will be reverted at the end of the block. + + +:mod:`test.support.warnings_helper` --- Utilities for warnings tests +==================================================================== + +.. module:: test.support.warnings_helper + :synopsis: Support for warnings tests. + +The :mod:`test.support.warnings_helper` module provides support for warnings tests. + +.. versionadded:: 3.10 + + +.. function:: check_no_resource_warning(testcase) + + Context manager to check that no :exc:`ResourceWarning` was raised. You + must remove the object which may emit :exc:`ResourceWarning` before the + end of the context manager. + + +.. function:: check_syntax_warning(testcase, statement, errtext='', *, lineno=1, offset=None) + + Test for syntax warning in *statement* by attempting to compile *statement*. + Test also that the :exc:`SyntaxWarning` is emitted only once, and that it + will be converted to a :exc:`SyntaxError` when turned into error. + *testcase* is the :mod:`unittest` instance for the test. *errtext* is the + regular expression which should match the string representation of the + emitted :exc:`SyntaxWarning` and raised :exc:`SyntaxError`. If *lineno* + is not ``None``, compares to the line of the warning and exception. + If *offset* is not ``None``, compares to the offset of the exception. + + .. versionadded:: 3.8 + + +.. function:: check_warnings(*filters, quiet=True) + + A convenience wrapper for :func:`warnings.catch_warnings()` that makes it + easier to test that a warning was correctly raised. It is approximately + equivalent to calling ``warnings.catch_warnings(record=True)`` with + :meth:`warnings.simplefilter` set to ``always`` and with the option to + automatically validate the results that are recorded. + + ``check_warnings`` accepts 2-tuples of the form ``("message regexp", + WarningCategory)`` as positional arguments. If one or more *filters* are + provided, or if the optional keyword argument *quiet* is ``False``, + it checks to make sure the warnings are as expected: each specified filter + must match at least one of the warnings raised by the enclosed code or the + test fails, and if any warnings are raised that do not match any of the + specified filters the test fails. To disable the first of these checks, + set *quiet* to ``True``. + + If no arguments are specified, it defaults to:: + + check_warnings(("", Warning), quiet=True) + + In this case all warnings are caught and no errors are raised. + + On entry to the context manager, a :class:`WarningRecorder` instance is + returned. The underlying warnings list from + :func:`~warnings.catch_warnings` is available via the recorder object's + :attr:`warnings` attribute. As a convenience, the attributes of the object + representing the most recent warning can also be accessed directly through + the recorder object (see example below). If no warning has been raised, + then any of the attributes that would otherwise be expected on an object + representing a warning will return ``None``. + + The recorder object also has a :meth:`reset` method, which clears the + warnings list. + + The context manager is designed to be used like this:: + + with check_warnings(("assertion is always true", SyntaxWarning), + ("", UserWarning)): + exec('assert(False, "Hey!")') + warnings.warn(UserWarning("Hide me!")) + + In this case if either warning was not raised, or some other warning was + raised, :func:`check_warnings` would raise an error. + + When a test needs to look more deeply into the warnings, rather than + just checking whether or not they occurred, code like this can be used:: + + with check_warnings(quiet=True) as w: + warnings.warn("foo") + assert str(w.args[0]) == "foo" + warnings.warn("bar") + assert str(w.args[0]) == "bar" + assert str(w.warnings[0].args[0]) == "foo" + assert str(w.warnings[1].args[0]) == "bar" + w.reset() + assert len(w.warnings) == 0 + + + Here all warnings will be caught, and the test code tests the captured + warnings directly. + + .. versionchanged:: 3.2 + New optional arguments *filters* and *quiet*. + + +.. class:: WarningsRecorder() + + Class used to record warnings for unit tests. See documentation of + :func:`check_warnings` above for more details. diff --git a/Doc/library/textwrap.rst b/Doc/library/textwrap.rst index 1a9d5f98..7780e241 100644 --- a/Doc/library/textwrap.rst +++ b/Doc/library/textwrap.rst @@ -21,8 +21,7 @@ functions should be good enough; otherwise, you should use an instance of subsequent_indent="", expand_tabs=True, \ replace_whitespace=True, fix_sentence_endings=False, \ break_long_words=True, drop_whitespace=True, \ - break_on_hyphens=True, tabsize=8, max_lines=None, \ - placeholder=' [...]') + break_on_hyphens=True, tabsize=8, max_lines=None) Wraps the single paragraph in *text* (a string) so every line is at most *width* characters long. Returns a list of output lines, without final @@ -40,7 +39,7 @@ functions should be good enough; otherwise, you should use an instance of replace_whitespace=True, fix_sentence_endings=False, \ break_long_words=True, drop_whitespace=True, \ break_on_hyphens=True, tabsize=8, \ - max_lines=None, placeholder=' [...]') + max_lines=None) Wraps the single paragraph in *text*, and returns a single string containing the wrapped paragraph. :func:`fill` is shorthand for :: diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 894bbb11..8c766432 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -16,9 +16,9 @@ level :mod:`_thread` module. See also the :mod:`queue` module. .. note:: - While they are not listed below, the ``camelCase`` names used for some - methods and functions in this module in the Python 2.x series are still - supported by this module. + In the Python 2.x series, this module contained ``camelCase`` names + for some methods and functions. These are deprecated as of Python 3.10, + but they are still supported for compatibility with Python 2.5 and lower. .. impl-detail:: @@ -42,6 +42,8 @@ This module defines the following functions: Return the number of :class:`Thread` objects currently alive. The returned count is equal to the length of the list returned by :func:`.enumerate`. + The function ``activeCount`` is a deprecated alias for this function. + .. function:: current_thread() @@ -50,6 +52,8 @@ This module defines the following functions: :mod:`threading` module, a dummy thread object with limited functionality is returned. + The function ``currentThread`` is a deprecated alias for this function. + .. function:: excepthook(args, /) @@ -84,6 +88,13 @@ This module defines the following functions: .. versionadded:: 3.8 +.. data:: __excepthook__ + + Holds the original value of :func:`threading.excepthook`. It is saved so that the + original value can be restored in case they happen to get replaced with + broken or alternative objects. + + .. versionadded:: 3.10 .. function:: get_ident() @@ -135,6 +146,17 @@ This module defines the following functions: :meth:`~Thread.run` method is called. +.. function:: gettrace() + + .. index:: + single: trace function + single: debugger + + Get the trace function as set by :func:`settrace`. + + .. versionadded:: 3.10 + + .. function:: setprofile(func) .. index:: single: profile function @@ -144,6 +166,15 @@ This module defines the following functions: :meth:`~Thread.run` method is called. +.. function:: getprofile() + + .. index:: single: profile function + + Get the profiler function as set by :func:`setprofile`. + + .. versionadded:: 3.10 + + .. function:: stack_size([size]) Return the thread stack size used when creating new threads. The optional @@ -278,8 +309,10 @@ since it is impossible to detect the termination of alien threads. *target* is the callable object to be invoked by the :meth:`run` method. Defaults to ``None``, meaning nothing is called. - *name* is the thread name. By default, a unique name is constructed of the - form "Thread-*N*" where *N* is a small decimal number. + *name* is the thread name. By default, a unique name is constructed + of the form "Thread-*N*" where *N* is a small decimal number, + or "Thread-*N* (target)" where "target" is ``target.__name__`` if the + *target* argument is specified. *args* is the argument tuple for the target invocation. Defaults to ``()``. @@ -294,6 +327,9 @@ since it is impossible to detect the termination of alien threads. base class constructor (``Thread.__init__()``) before doing anything else to the thread. + .. versionchanged:: 3.10 + Use the *target* name if *name* argument is omitted. + .. versionchanged:: 3.3 Added the *daemon* argument. @@ -350,9 +386,11 @@ since it is impossible to detect the termination of alien threads. .. method:: getName() setName() - Old getter/setter API for :attr:`~Thread.name`; use it directly as a + Deprecated getter/setter API for :attr:`~Thread.name`; use it directly as a property instead. + .. deprecated:: 3.10 + .. attribute:: ident The 'thread identifier' of this thread or ``None`` if the thread has not @@ -363,13 +401,12 @@ since it is impossible to detect the termination of alien threads. .. attribute:: native_id - The native integral thread ID of this thread. + The Thread ID (``TID``) of this thread, as assigned by the OS (kernel). This is a non-negative integer, or ``None`` if the thread has not been started. See the :func:`get_native_id` function. - This represents the Thread ID (``TID``) as assigned to the - thread by the OS (kernel). Its value may be used to uniquely identify - this particular thread system-wide (until the thread terminates, - after which the value may be recycled by the OS). + This value may be used to uniquely identify this particular thread + system-wide (until the thread terminates, after which the value + may be recycled by the OS). .. note:: @@ -403,9 +440,11 @@ since it is impossible to detect the termination of alien threads. .. method:: isDaemon() setDaemon() - Old getter/setter API for :attr:`~Thread.daemon`; use it directly as a + Deprecated getter/setter API for :attr:`~Thread.daemon`; use it directly as a property instead. + .. deprecated:: 3.10 + .. _lock-objects: @@ -741,6 +780,8 @@ item to the buffer only needs to wake up one consumer thread. calling thread has not acquired the lock when this method is called, a :exc:`RuntimeError` is raised. + The method ``notifyAll`` is a deprecated alias for this method. + .. _semaphore-objects: @@ -878,6 +919,8 @@ method. The :meth:`~Event.wait` method blocks until the flag is true. Return ``True`` if and only if the internal flag is true. + The method ``isSet`` is a deprecated alias for this method. + .. method:: set() Set the internal flag to true. All threads waiting for it to become true diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 45f2ef14..cfd67e87 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -166,6 +166,9 @@ Functions Return the time of the specified clock *clk_id*. Refer to :ref:`time-clock-id-constants` for a list of accepted values for *clk_id*. + Use :func:`clock_gettime_ns` to avoid the precision loss caused by the + :class:`float` type. + .. availability:: Unix. .. versionadded:: 3.3 @@ -185,6 +188,9 @@ Functions Set the time of the specified clock *clk_id*. Currently, :data:`CLOCK_REALTIME` is the only accepted value for *clk_id*. + Use :func:`clock_settime_ns` to avoid the precision loss caused by the + :class:`float` type. + .. availability:: Unix. .. versionadded:: 3.3 @@ -253,12 +259,6 @@ Functions :const:`None`, the current time as returned by :func:`.time` is used. The dst flag is set to ``1`` when DST applies to the given time. - :func:`localtime` may raise :exc:`OverflowError`, if the timestamp is - outside the range of values supported by the platform C :c:func:`localtime` - or :c:func:`gmtime` functions, and :exc:`OSError` on :c:func:`localtime` or - :c:func:`gmtime` failure. It's common for this to be restricted to years - between 1970 and 2038. - .. function:: mktime(t) @@ -279,10 +279,17 @@ Functions The reference point of the returned value is undefined, so that only the difference between the results of two calls is valid. + Use :func:`monotonic_ns` to avoid the precision loss caused by the + :class:`float` type. + .. versionadded:: 3.3 + .. versionchanged:: 3.5 The function is now always available and always system-wide. + .. versionchanged:: 3.10 + On macOS, the function is now system-wide. + .. function:: monotonic_ns() -> int @@ -301,8 +308,14 @@ Functions point of the returned value is undefined, so that only the difference between the results of two calls is valid. + Use :func:`perf_counter_ns` to avoid the precision loss caused by the + :class:`float` type. + .. versionadded:: 3.3 + .. versionchanged:: 3.10 + On Windows, the function is now system-wide. + .. function:: perf_counter_ns() -> int Similar to :func:`perf_counter`, but return time as nanoseconds. @@ -323,6 +336,9 @@ Functions returned value is undefined, so that only the difference between the results of two calls is valid. + Use :func:`process_time_ns` to avoid the precision loss caused by the + :class:`float` type. + .. versionadded:: 3.3 .. function:: process_time_ns() -> int @@ -440,10 +456,10 @@ Functions | | negative time difference from UTC/GMT of the | | | | form +HHMM or -HHMM, where H represents decimal| | | | hour digits and M represents decimal minute | | - | | digits [-23:59, +23:59]. [1]_ | | + | | digits [-23:59, +23:59]. | | +-----------+------------------------------------------------+-------+ | ``%Z`` | Time zone name (no characters if no time zone | | - | | exists). Deprecated. [1]_ | | + | | exists). | | +-----------+------------------------------------------------+-------+ | ``%%`` | A literal ``'%'`` character. | | +-----------+------------------------------------------------+-------+ @@ -464,7 +480,7 @@ Functions calculations when the day of the week and the year are specified. Here is an example, a format for dates compatible with that specified in the - :rfc:`2822` Internet email standard. [1]_ :: + :rfc:`2822` Internet email standard. [#]_ :: >>> from time import gmtime, strftime >>> strftime("%a, %d %b %Y %H:%M:%S +0000", gmtime()) @@ -587,6 +603,17 @@ Functions :class:`struct_time` object is returned, from which the components of the calendar date may be accessed as attributes. + Use :func:`time_ns` to avoid the precision loss caused by the :class:`float` + type. + + +.. function:: time_ns() -> int + + Similar to :func:`~time.time` but returns time as an integer number of nanoseconds + since the epoch_. + + .. versionadded:: 3.7 + .. function:: thread_time() -> float @@ -601,6 +628,9 @@ Functions returned value is undefined, so that only the difference between the results of two calls in the same thread is valid. + Use :func:`thread_time_ns` to avoid the precision loss caused by the + :class:`float` type. + .. availability:: Windows, Linux, Unix systems supporting ``CLOCK_THREAD_CPUTIME_ID``. @@ -614,13 +644,6 @@ Functions .. versionadded:: 3.7 -.. function:: time_ns() -> int - - Similar to :func:`~time.time` but returns time as an integer number of nanoseconds - since the epoch_. - - .. versionadded:: 3.7 - .. function:: tzset() Reset the time conversion rules used by the library routines. The environment @@ -885,9 +908,10 @@ Timezone Constants .. rubric:: Footnotes -.. [1] The use of ``%Z`` is now deprecated, but the ``%z`` escape that expands to the - preferred hour/minute offset is not supported by all ANSI C libraries. Also, a +.. [#] The use of ``%Z`` is now deprecated, but the ``%z`` escape that expands to the + preferred hour/minute offset is not supported by all ANSI C libraries. Also, a strict reading of the original 1982 :rfc:`822` standard calls for a two-digit - year (``%y`` rather than ``%Y``), but practice moved to 4-digit years long before the + year (%y rather than %Y), but practice moved to 4-digit years long before the year 2000. After that, :rfc:`822` became obsolete and the 4-digit year has been first recommended by :rfc:`1123` and then mandated by :rfc:`2822`. + diff --git a/Doc/library/timeit.rst b/Doc/library/timeit.rst index ca21fe62..d4e8b749 100644 --- a/Doc/library/timeit.rst +++ b/Doc/library/timeit.rst @@ -282,13 +282,6 @@ It is possible to provide a setup statement that is executed only once at the be $ python -m timeit -s 'text = "sample string"; char = "g"' 'text.find(char)' 1000000 loops, best of 5: 0.342 usec per loop -In the output, there are three fields. The loop count, which tells you how many -times the statement body was run per timing loop repetition. The repetition -count ('best of 5') which tells you how many times the timing loop was -repeated, and finally the time the statement body took on average within the -best repetition of the timing loop. That is, the time the fastest repetition -took divided by the loop count. - :: >>> import timeit diff --git a/Doc/library/tk_msg.png b/Doc/library/tk_msg.png index 6495e63e84650dd16cb50a6da3c51d5c9eca2c57..c122d8f8ae5ba94f876479caa175a16d8b482ca7 100644 GIT binary patch literal 19645 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 literal 14979 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 diff --git a/Doc/library/tkinter.font.rst b/Doc/library/tkinter.font.rst index b0f4505e..c7c2b7b5 100644 --- a/Doc/library/tkinter.font.rst +++ b/Doc/library/tkinter.font.rst @@ -91,6 +91,9 @@ The different font weights and slants are: Return the names of defined fonts. -.. function:: nametofont(name) +.. function:: nametofont(name, root=None) - Return a :class:`Font` representation of a tk named font. \ No newline at end of file + Return a :class:`Font` representation of a tk named font. + + .. versionchanged:: 3.10 + The *root* parameter was added. diff --git a/Doc/library/tkinter.rst b/Doc/library/tkinter.rst index 401887f2..a48bc13c 100644 --- a/Doc/library/tkinter.rst +++ b/Doc/library/tkinter.rst @@ -19,6 +19,23 @@ demonstrating a simple Tk interface, letting you know that :mod:`tkinter` is properly installed on your system, and also showing what version of Tcl/Tk is installed, so you can read the Tcl/Tk documentation specific to that version. +Tkinter supports a range of Tcl/Tk versions, built either with or +without thread support. The official Python binary release bundles Tcl/Tk 8.6 +threaded. See the source code for the :mod:`_tkinter` module +for more information about supported versions. + +Tkinter is not a thin wrapper, but adds a fair amount of its own logic to +make the experience more pythonic. This documentation will concentrate on these +additions and changes, and refer to the official Tcl/Tk documentation for +details that are unchanged. + +.. note:: + + Tcl/Tk 8.5 (2007) introduced a modern set of themed user interface components + along with a new API to use them. Both old and new APIs are still available. + Most documentation you will find online still uses the old API and + can be woefully outdated. + .. seealso:: * `TkDocs `_ @@ -51,6 +68,50 @@ installed, so you can read the Tcl/Tk documentation specific to that version. By John Ousterhout, inventor of Tcl/Tk, and Ken Jones; does not cover Tkinter. (ISBN 978-0321336330) +Architecture +------------ + +Tcl/Tk is not a single library but rather consists of a few distinct +modules, each with separate functionality and its own official +documentation. Python's binary releases also ship an add-on module +together with it. + +Tcl + Tcl is a dynamic interpreted programming language, just like Python. Though + it can be used on its own as a general-purpose programming language, it is + most commonly embedded into C applications as a scripting engine or an + interface to the Tk toolkit. The Tcl library has a C interface to + create and manage one or more instances of a Tcl interpreter, run Tcl + commands and scripts in those instances, and add custom commands + implemented in either Tcl or C. Each interpreter has an event queue, + and there are facilities to send events to it and process them. + Unlike Python, Tcl's execution model is designed around cooperative + multitasking, and Tkinter bridges this difference + (see `Threading model`_ for details). + +Tk + Tk is a `Tcl package `_ implemented in C + that adds custom commands to create and manipulate GUI widgets. Each + :class:`Tk` object embeds its own Tcl interpreter instance with Tk loaded into + it. Tk's widgets are very customizable, though at the cost of a dated appearance. + Tk uses Tcl's event queue to generate and process GUI events. + +Ttk + Themed Tk (Ttk) is a newer family of Tk widgets that provide a much better + appearance on different platforms than many of the classic Tk widgets. + Ttk is distributed as part of Tk, starting with Tk version 8.5. Python + bindings are provided in a separate module, :mod:`tkinter.ttk`. + +Internally, Tk and Ttk use facilities of the underlying operating system, +i.e., Xlib on Unix/X11, Cocoa on macOS, GDI on Windows. + +When your Python application uses a class in Tkinter, e.g., to create a widget, +the :mod:`tkinter` module first assembles a Tcl/Tk command string. It passes that +Tcl command string to an internal :mod:`_tkinter` binary module, which then +calls the Tcl interpreter to evaluate it. The Tcl interpreter will then call into the +Tk and/or Ttk packages, which will in turn make calls to Xlib, Cocoa, or GDI. + + Tkinter Modules --------------- @@ -63,72 +124,16 @@ the modern themed widget set and API:: from tkinter import ttk -.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None) - - Construct a toplevel Tk widget, which is usually the main window of an - application, and initialize a Tcl interpreter for this widget. Each - instance has its own associated Tcl interpreter. - - The :class:`Tk` class is typically instantiated using all default values. - However, the following keyword arguments are currently recognized: - - *screenName* - When given (as a string), sets the :envvar:`DISPLAY` environment - variable. (X11 only) - *baseName* - Name of the profile file. By default, *baseName* is derived from the - program name (``sys.argv[0]``). - *className* - Name of the widget class. Used as a profile file and also as the name - with which Tcl is invoked (*argv0* in *interp*). - *useTk* - If ``True``, initialize the Tk subsystem. The :func:`tkinter.Tcl() ` - function sets this to ``False``. - *sync* - If ``True``, execute all X server commands synchronously, so that errors - are reported immediately. Can be used for debugging. (X11 only) - *use* - Specifies the *id* of the window in which to embed the application, - instead of it being created as an independent toplevel window. *id* must - be specified in the same way as the value for the -use option for - toplevel widgets (that is, it has a form like that returned by - :meth:`winfo_id`). - - Note that on some platforms this will only work correctly if *id* refers - to a Tk frame or toplevel that has its -container option enabled. - - :class:`Tk` reads and interprets profile files, named - :file:`.{className}.tcl` and :file:`.{baseName}.tcl`, into the Tcl - interpreter and calls :func:`exec` on the contents of - :file:`.{className}.py` and :file:`.{baseName}.py`. The path for the - profile files is the :envvar:`HOME` environment variable or, if that - isn't defined, then :attr:`os.curdir`. - - .. attribute:: tk - - The Tk application object created by instantiating :class:`Tk`. This - provides access to the Tcl interpreter. Each widget that is attached - the same instance of :class:`Tk` has the same value for its :attr:`tk` - attribute. - - .. attribute:: master - - The widget object that contains this widget. For :class:`Tk`, the - *master* is :const:`None` because it is the main window. The terms - *master* and *parent* are similar and sometimes used interchangeably - as argument names; however, calling :meth:`winfo_parent` returns a - string of the widget name whereas :attr:`master` returns the object. - *parent*/*child* reflects the tree-like relationship while - *master*/*slave* reflects the container structure. - - .. attribute:: children - - The immediate descendants of this widget as a :class:`dict` with the - child widget names as the keys and the child instance objects as the - values. - - -.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=False) +.. class:: Tk(screenName=None, baseName=None, className='Tk', useTk=1) + + The :class:`Tk` class is instantiated without arguments. This creates a toplevel + widget of Tk which usually is the main window of an application. Each instance + has its own associated Tcl interpreter. + + .. FIXME: The following keyword arguments are currently recognized: + + +.. function:: Tcl(screenName=None, baseName=None, className='Tk', useTk=0) The :func:`Tcl` function is a factory function which creates an object much like that created by the :class:`Tk` class, except that it does not initialize the Tk @@ -202,243 +207,294 @@ Additional modules: Tkinter Life Preserver ---------------------- -.. sectionauthor:: Matt Conway +This section is not designed to be an exhaustive tutorial on either Tk or +Tkinter. For that, refer to one of the external resources noted earlier. +Instead, this section provides a very quick orientation to what a Tkinter +application looks like, identifies foundational Tk concepts, and +explains how the Tkinter wrapper is structured. +The remainder of this section will help you to identify the classes, +methods, and options you'll need in your Tkinter application, and where to +find more detailed documentation on them, including in the official Tcl/Tk +reference manual. -This section is not designed to be an exhaustive tutorial on either Tk or -Tkinter. Rather, it is intended as a stop gap, providing some introductory -orientation on the system. -Credits: +A Hello World Program +^^^^^^^^^^^^^^^^^^^^^ -* Tk was written by John Ousterhout while at Berkeley. +We'll start by walking through a "Hello World" application in Tkinter. This +isn't the smallest one we could write, but has enough to illustrate some +key concepts you'll need to know. -* Tkinter was written by Steen Lumholt and Guido van Rossum. +:: -* This Life Preserver was written by Matt Conway at the University of Virginia. + from tkinter import * + from tkinter import ttk + root = Tk() + frm = ttk.Frame(root, padding=10) + frm.grid() + ttk.Label(frm, text="Hello World!").grid(column=0, row=0) + ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=0) + root.mainloop() -* The HTML rendering, and some liberal editing, was produced from a FrameMaker - version by Ken Manheimer. -* Fredrik Lundh elaborated and revised the class interface descriptions, to get - them current with Tk 4.2. +After the imports, the next line creates an instance of the :class:`Tk` class, +which initializes Tk and creates its associated Tcl interpreter. It also +creates a toplevel window, known as the root window, which serves as the main +window of the application. -* Mike Clarkson converted the documentation to LaTeX, and compiled the User - Interface chapter of the reference manual. +The following line creates a frame widget, which in this case will contain +a label and a button we'll create next. The frame is fit inside the root +window. +The next line creates a label widget holding a static text string. The +:meth:`grid` method is used to specify the relative layout (position) of the +label within its containing frame widget, similar to how tables in HTML work. -How To Use This Section -^^^^^^^^^^^^^^^^^^^^^^^ +A button widget is then created, and placed to the right of the label. When +pressed, it will call the :meth:`destroy` method of the root window. -This section is designed in two parts: the first half (roughly) covers -background material, while the second half can be taken to the keyboard as a -handy reference. +Finally, the :meth:`mainloop` method puts everything on the display, and +responds to user input until the program terminates. -When trying to answer questions of the form "how do I do blah", it is often best -to find out how to do "blah" in straight Tk, and then convert this back into the -corresponding :mod:`tkinter` call. Python programmers can often guess at the -correct Python command by looking at the Tk documentation. This means that in -order to use Tkinter, you will have to know a little bit about Tk. This document -can't fulfill that role, so the best we can do is point you to the best -documentation that exists. Here are some hints: -* The authors strongly suggest getting a copy of the Tk man pages. - Specifically, the man pages in the ``manN`` directory are most useful. - The ``man3`` man pages describe the C interface to the Tk library and thus - are not especially helpful for script writers. -* Addison-Wesley publishes a book called Tcl and the Tk Toolkit by John - Ousterhout (ISBN 0-201-63337-X) which is a good introduction to Tcl and Tk for - the novice. The book is not exhaustive, and for many details it defers to the - man pages. +Important Tk Concepts +^^^^^^^^^^^^^^^^^^^^^ -* :file:`tkinter/__init__.py` is a last resort for most, but can be a good - place to go when nothing else makes sense. +Even this simple program illustrates the following key Tk concepts: +widgets + A Tkinter user interface is made up of individual *widgets*. Each widget is + represented as a Python object, instantiated from classes like + :class:`ttk.Frame`, :class:`ttk.Label`, and :class:`ttk.Button`. -A Simple Hello World Program -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +widget hierarchy + Widgets are arranged in a *hierarchy*. The label and button were contained + within a frame, which in turn was contained within the root window. When + creating each *child* widget, its *parent* widget is passed as the first + argument to the widget constructor. -:: +configuration options + Widgets have *configuration options*, which modify their appearance and + behavior, such as the text to display in a label or button. Different + classes of widgets will have different sets of options. - import tkinter as tk +geometry management + Widgets aren't automatically added to the user interface when they are + created. A *geometry manager* like ``grid`` controls where in the + user interface they are placed. - class Application(tk.Frame): - def __init__(self, master=None): - super().__init__(master) - self.master = master - self.pack() - self.create_widgets() +event loop + Tkinter reacts to user input, changes from your program, and even refreshes + the display only when actively running an *event loop*. If your program + isn't running the event loop, your user interface won't update. - def create_widgets(self): - self.hi_there = tk.Button(self) - self.hi_there["text"] = "Hello World\n(click me)" - self.hi_there["command"] = self.say_hi - self.hi_there.pack(side="top") - self.quit = tk.Button(self, text="QUIT", fg="red", - command=self.master.destroy) - self.quit.pack(side="bottom") +Understanding How Tkinter Wraps Tcl/Tk +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - def say_hi(self): - print("hi there, everyone!") +When your application uses Tkinter's classes and methods, internally Tkinter +is assembling strings representing Tcl/Tk commands, and executing those +commands in the Tcl interpreter attached to your applicaton's :class:`Tk` +instance. - root = tk.Tk() - app = Application(master=root) - app.mainloop() +Whether it's trying to navigate reference documentation, trying to find +the right method or option, adapting some existing code, or debugging your +Tkinter application, there are times that it will be useful to understand +what those underlying Tcl/Tk commands look like. +To illustrate, here is the Tcl/Tk equivalent of the main part of the Tkinter +script above. -A (Very) Quick Look at Tcl/Tk ------------------------------ +:: -The class hierarchy looks complicated, but in actual practice, application -programmers almost always refer to the classes at the very bottom of the -hierarchy. + ttk::frame .frm -padding 10 + grid .frm + grid [ttk::label .frm.lbl -text "Hello World!"] -column 0 -row 0 + grid [ttk::button .frm.btn -text "Quit" -command "destroy ."] -column 1 -row 0 -Notes: -* These classes are provided for the purposes of organizing certain functions - under one namespace. They aren't meant to be instantiated independently. +Tcl's syntax is similar to many shell languages, where the first word is the +command to be executed, with arguments to that command following it, separated +by spaces. Without getting into too many details, notice the following: -* The :class:`Tk` class is meant to be instantiated only once in an application. - Application programmers need not instantiate one explicitly, the system creates - one whenever any of the other classes are instantiated. +* The commands used to create widgets (like ``ttk::frame``) correspond to + widget classes in Tkinter. -* The :class:`Widget` class is not meant to be instantiated, it is meant only - for subclassing to make "real" widgets (in C++, this is called an 'abstract - class'). +* Tcl widget options (like ``-text``) correspond to keyword arguments in + Tkinter. -To make use of this reference material, there will be times when you will need -to know how to read short passages of Tk and how to identify the various parts -of a Tk command. (See section :ref:`tkinter-basic-mapping` for the -:mod:`tkinter` equivalents of what's below.) +* Widgets are referred to by a *pathname* in Tcl (like ``.frm.btn``), + whereas Tkinter doesn't use names but object references. -Tk scripts are Tcl programs. Like all Tcl programs, Tk scripts are just lists -of tokens separated by spaces. A Tk widget is just its *class*, the *options* -that help configure it, and the *actions* that make it do useful things. +* A widget's place in the widget hierarchy is encoded in its (hierarchical) + pathname, which uses a ``.`` (dot) as a path separator. The pathname for + the root window is just ``.`` (dot). In Tkinter, the hierarchy is defined + not by pathname but by specifying the parent widget when creating each + child widget. -To make a widget in Tk, the command is always of the form:: +* Operations which are implemented as separate *commands* in Tcl (like + ``grid`` or ``destroy``) are represented as *methods* on Tkinter widget + objects. As you'll see shortly, at other times Tcl uses what appear to be + method calls on widget objects, which more closely mirror what would is + used in Tkinter. - classCommand newPathname options -*classCommand* - denotes which kind of widget to make (a button, a label, a menu...) +How do I...? What option does...? +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. index:: single: . (dot); in Tkinter +If you're not sure how to do something in Tkinter, and you can't immediately +find it in the tutorial or reference documentation you're using, there are a +few strategies that can be helpful. -*newPathname* - is the new name for this widget. All names in Tk must be unique. To help - enforce this, widgets in Tk are named with *pathnames*, just like files in a - file system. The top level widget, the *root*, is called ``.`` (period) and - children are delimited by more periods. For example, - ``.myApp.controlPanel.okButton`` might be the name of a widget. +First, remember that the details of how individual widgets work may vary +across different versions of both Tkinter and Tcl/Tk. If you're searching +documentation, make sure it corresponds to the Python and Tcl/Tk versions +installed on your system. -*options* - configure the widget's appearance and in some cases, its behavior. The options - come in the form of a list of flags and values. Flags are preceded by a '-', - like Unix shell command flags, and values are put in quotes if they are more - than one word. +When searching for how to use an API, it helps to know the exact name of the +class, option, or method that you're using. Introspection, either in an +interactive Python shell or with :func:`print`, can help you identify what +you need. -For example:: +To find out what configuration options are available on any widget, call its +:meth:`configure` method, which returns a dictionary containing a variety of +information about each object, including its default and current values. Use +:meth:`keys` to get just the names of each option. + +:: + + btn = ttk.Button(frm, ...) + print(btn.configure().keys()) + +As most widgets have many configuration options in common, it can be useful +to find out which are specific to a particular widget class. Comparing the +list of options to that of a simpler widget, like a frame, is one way to +do that. + +:: - button .fred -fg red -text "hi there" - ^ ^ \______________________/ - | | | - class new options - command widget (-opt val -opt val ...) + print(set(btn.configure().keys()) - set(frm.configure().keys())) -Once created, the pathname to the widget becomes a new command. This new -*widget command* is the programmer's handle for getting the new widget to -perform some *action*. In C, you'd express this as someAction(fred, -someOptions), in C++, you would express this as fred.someAction(someOptions), -and in Tk, you say:: +Similarly, you can find the available methods for a widget object using the +standard :func:`dir` function. If you try it, you'll see there are over 200 +common widget methods, so again identifying those specific to a widget class +is helpful. - .fred someAction someOptions +:: -Note that the object name, ``.fred``, starts with a dot. + print(dir(btn)) + print(set(dir(btn)) - set(dir(frm))) -As you'd expect, the legal values for *someAction* will depend on the widget's -class: ``.fred disable`` works if fred is a button (fred gets greyed out), but -does not work if fred is a label (disabling of labels is not supported in Tk). -The legal values of *someOptions* is action dependent. Some actions, like -``disable``, require no arguments, others, like a text-entry box's ``delete`` -command, would need arguments to specify what range of text to delete. +Navigating the Tcl/Tk Reference Manual +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +As noted, the official `Tk commands `_ +reference manual (man pages) is often the most accurate description of what +specific operations on widgets do. Even when you know the name of the option +or method that you need, you may still have a few places to look. -.. _tkinter-basic-mapping: +While all operations in Tkinter are implemented as method calls on widget +objects, you've seen that many Tcl/Tk operations appear as commands that +take a widget pathname as its first parameter, followed by optional +parameters, e.g. -Mapping Basic Tk into Tkinter ------------------------------ +:: -Class commands in Tk correspond to class constructors in Tkinter. :: + destroy . + grid .frm.btn -column 0 -row 0 - button .fred =====> fred = Button() +Others, however, look more like methods called on a widget object (in fact, +when you create a widget in Tcl/Tk, it creates a Tcl command with the name +of the widget pathname, with the first parameter to that command being the +name of a method to call). -The master of an object is implicit in the new name given to it at creation -time. In Tkinter, masters are specified explicitly. :: +:: - button .panel.fred =====> fred = Button(panel) + .frm.btn invoke + .frm.lbl configure -text "Goodbye" -The configuration options in Tk are given in lists of hyphened tags followed by -values. In Tkinter, options are specified as keyword-arguments in the instance -constructor, and keyword-args for configure calls or as instance indices, in -dictionary style, for established instances. See section -:ref:`tkinter-setting-options` on setting options. :: - button .fred -fg red =====> fred = Button(panel, fg="red") - .fred configure -fg red =====> fred["fg"] = red - OR ==> fred.config(fg="red") +In the official Tcl/Tk reference documentation, you'll find most operations +that look like method calls on the man page for a specific widget (e.g., +you'll find the :meth:`invoke` method on the +`ttk::button `_ +man page), while functions that take a widget as a parameter often have +their own man page (e.g., +`grid `_). -In Tk, to perform an action on a widget, use the widget name as a command, and -follow it with an action name, possibly with arguments (options). In Tkinter, -you call methods on the class instance to invoke actions on the widget. The -actions (methods) that a given widget can perform are listed in -:file:`tkinter/__init__.py`. :: +You'll find many common options and methods in the +`options `_ or +`ttk::widget `_ man +pages, while others are found in the man page for a specific widget class. - .fred invoke =====> fred.invoke() +You'll also find that many Tkinter methods have compound names, e.g., +:func:`winfo_x`, :func:`winfo_height`, :func:`winfo_viewable`. You'd find +documentation for all of these in the +`winfo `_ man page. -To give a widget to the packer (geometry manager), you call pack with optional -arguments. In Tkinter, the Pack class holds all this functionality, and the -various forms of the pack command are implemented as methods. All widgets in -:mod:`tkinter` are subclassed from the Packer, and so inherit all the packing -methods. See the :mod:`tkinter.tix` module documentation for additional -information on the Form geometry manager. :: +.. note:: + Somewhat confusingly, there are also methods on all Tkinter widgets + that don't actually operate on the widget, but operate at a global + scope, independent of any widget. Examples are methods for accessing + the clipboard or the system bell. (They happen to be implemented as + methods in the base :class:`Widget` class that all Tkinter widgets + inherit from). + + +Threading model +--------------- - pack .fred -side left =====> fred.pack(side="left") +Python and Tcl/Tk have very different threading models, which :mod:`tkinter` +tries to bridge. If you use threads, you may need to be aware of this. +A Python interpreter may have many threads associated with it. In Tcl, multiple +threads can be created, but each thread has a separate Tcl interpreter instance +associated with it. Threads can also create more than one interpreter instance, +though each interpreter instance can be used only by the one thread that created it. -How Tk and Tkinter are Related ------------------------------- +Each :class:`Tk` object created by :mod:`tkinter` contains a Tcl interpreter. +It also keeps track of which thread created that interpreter. Calls to +:mod:`tkinter` can be made from any Python thread. Internally, if a call comes +from a thread other than the one that created the :class:`Tk` object, an event +is posted to the interpreter's event queue, and when executed, the result is +returned to the calling Python thread. -From the top down: +Tcl/Tk applications are normally event-driven, meaning that after initialization, +the interpreter runs an event loop (i.e. :func:`Tk.mainloop`) and responds to events. +Because it is single-threaded, event handlers must respond quickly, otherwise they +will block other events from being processed. To avoid this, any long-running +computations should not run in an event handler, but are either broken into smaller +pieces using timers, or run in another thread. This is different from many GUI +toolkits where the GUI runs in a completely separate thread from all application +code including event handlers. -Your App Here (Python) - A Python application makes a :mod:`tkinter` call. +If the Tcl interpreter is not running the event loop and processing events, any +:mod:`tkinter` calls made from threads other than the one running the Tcl +interpreter will fail. -tkinter (Python Package) - This call (say, for example, creating a button widget), is implemented in - the :mod:`tkinter` package, which is written in Python. This Python - function will parse the commands and the arguments and convert them into a - form that makes them look as if they had come from a Tk script instead of - a Python script. +A number of special cases exist: -_tkinter (C) - These commands and their arguments will be passed to a C function in the - :mod:`_tkinter` - note the underscore - extension module. + * Tcl/Tk libraries can be built so they are not thread-aware. In this case, + :mod:`tkinter` calls the library from the originating Python thread, even + if this is different than the thread that created the Tcl interpreter. A global + lock ensures only one call occurs at a time. -Tk Widgets (C and Tcl) - This C function is able to make calls into other C modules, including the C - functions that make up the Tk library. Tk is implemented in C and some Tcl. - The Tcl part of the Tk widgets is used to bind certain default behaviors to - widgets, and is executed once at the point where the Python :mod:`tkinter` - package is imported. (The user never sees this stage). + * While :mod:`tkinter` allows you to create more than one instance of a :class:`Tk` + object (with its own interpreter), all interpreters that are part of the same + thread share a common event queue, which gets ugly fast. In practice, don't create + more than one instance of :class:`Tk` at a time. Otherwise, it's best to create + them in separate threads and ensure you're running a thread-aware Tcl/Tk build. -Tk (C) - The Tk part of the Tk Widgets implement the final mapping to ... + * Blocking event handlers are not the only way to prevent the Tcl interpreter from + reentering the event loop. It is even possible to run multiple nested event loops + or abandon the event loop entirely. If you're doing anything tricky when it comes + to events or threads, be aware of these possibilities. -Xlib (C) - the Xlib library to draw graphics on the screen. + * There are a few select :mod:`tkinter` functions that presently work only when + called from the thread that created the Tcl interpreter. Handy Reference @@ -700,8 +756,8 @@ callback color Colors can be given as the names of X colors in the rgb.txt file, or as strings - representing RGB values in 4 bit: ``"#RGB"``, 8 bit: ``"#RRGGBB"``, 12 bit: - ``"#RRRGGGBBB"``, or 16 bit: ``"#RRRRGGGGBBBB"`` ranges, where R,G,B here + representing RGB values in 4 bit: ``"#RGB"``, 8 bit: ``"#RRGGBB"``, 12 bit" + ``"#RRRGGGBBB"``, or 16 bit ``"#RRRRGGGGBBBB"`` ranges, where R,G,B here represent any legal hex digit. See page 160 of Ousterhout's book for details. cursor diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc index 877d39a4..1a99f051 100644 --- a/Doc/library/token-list.inc +++ b/Doc/library/token-list.inc @@ -211,6 +211,8 @@ .. data:: TYPE_COMMENT +.. data:: SOFT_KEYWORD + .. data:: ERRORTOKEN .. data:: N_TOKENS diff --git a/Doc/library/token.rst b/Doc/library/token.rst index 7f598cd3..a1aceba9 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -11,7 +11,7 @@ -------------- This module provides constants which represent the numeric values of leaf nodes -of the parse tree (terminal tokens). Refer to the file :file:`Grammar/Grammar` +of the parse tree (terminal tokens). Refer to the file :file:`Grammar/Tokens` in the Python distribution for the definitions of the names in the context of the language grammar. The specific numeric values which the names map to may change between Python versions. diff --git a/Doc/library/traceback.rst b/Doc/library/traceback.rst index 462a6a55..e938dd58 100644 --- a/Doc/library/traceback.rst +++ b/Doc/library/traceback.rst @@ -36,7 +36,8 @@ The module defines the following functions: Added negative *limit* support. -.. function:: print_exception(etype, value, tb, limit=None, file=None, chain=True) +.. function:: print_exception(exc, /[, value, tb], limit=None, \ + file=None, chain=True) Print exception information and stack trace entries from traceback object *tb* to *file*. This differs from :func:`print_tb` in the following @@ -45,7 +46,7 @@ The module defines the following functions: * if *tb* is not ``None``, it prints a header ``Traceback (most recent call last):`` - * it prints the exception *etype* and *value* after the stack trace + * it prints the exception type and *value* after the stack trace .. index:: single: ^ (caret); marker @@ -53,6 +54,10 @@ The module defines the following functions: format, it prints the line where the syntax error occurred with a caret indicating the approximate position of the error. + Since Python 3.10, instead of passing *value* and *tb*, an exception object + can be passed as the first argument. If *value* and *tb* are provided, the + first argument is ignored in order to provide backwards compatibility. + The optional *limit* argument has the same meaning as for :func:`print_tb`. If *chain* is true (the default), then chained exceptions (the :attr:`__cause__` or :attr:`__context__` attributes of the exception) will be @@ -62,6 +67,10 @@ The module defines the following functions: .. versionchanged:: 3.5 The *etype* argument is ignored and inferred from the type of *value*. + .. versionchanged:: 3.10 + The *etype* parameter has been renamed to *exc* and is now + positional-only. + .. function:: print_exc(limit=None, file=None, chain=True) @@ -121,18 +130,26 @@ The module defines the following functions: text line is not ``None``. -.. function:: format_exception_only(etype, value) +.. function:: format_exception_only(exc, /[, value]) + + Format the exception part of a traceback using an exception value such as + given by ``sys.last_value``. The return value is a list of strings, each + ending in a newline. Normally, the list contains a single string; however, + for :exc:`SyntaxError` exceptions, it contains several lines that (when + printed) display detailed information about where the syntax error occurred. + The message indicating which exception occurred is the always last string in + the list. + + Since Python 3.10, instead of passing *value*, an exception object + can be passed as the first argument. If *value* is provided, the first + argument is ignored in order to provide backwards compatibility. - Format the exception part of a traceback. The arguments are the exception - type and value such as given by ``sys.last_type`` and ``sys.last_value``. - The return value is a list of strings, each ending in a newline. Normally, - the list contains a single string; however, for :exc:`SyntaxError` - exceptions, it contains several lines that (when printed) display detailed - information about where the syntax error occurred. The message indicating - which exception occurred is the always last string in the list. + .. versionchanged:: 3.10 + The *etype* parameter has been renamed to *exc* and is now + positional-only. -.. function:: format_exception(etype, value, tb, limit=None, chain=True) +.. function:: format_exception(exc, /[, value, tb], limit=None, chain=True) Format a stack trace and the exception information. The arguments have the same meaning as the corresponding arguments to :func:`print_exception`. The @@ -143,6 +160,10 @@ The module defines the following functions: .. versionchanged:: 3.5 The *etype* argument is ignored and inferred from the type of *value*. + .. versionchanged:: 3.10 + This function's behavior and signature were modified to match + :func:`print_exception`. + .. function:: format_exc(limit=None, chain=True) @@ -191,11 +212,16 @@ The module also defines the following classes: :class:`TracebackException` objects are created from actual exceptions to capture data for later printing in a lightweight fashion. -.. class:: TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False) +.. class:: TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False) Capture an exception for later rendering. *limit*, *lookup_lines* and *capture_locals* are as for the :class:`StackSummary` class. + If *compact* is true, only data that is required by :class:`TracebackException`'s + ``format`` method is saved in the class attributes. In particular, the + ``__context__`` field is calculated only if ``__cause__`` is ``None`` and + ``__suppress_context__`` is false. + Note that when locals are captured, they are also shown in the traceback. .. attribute:: __cause__ @@ -273,6 +299,9 @@ capture data for later printing in a lightweight fashion. The message indicating which exception occurred is always the last string in the output. + .. versionchanged:: 3.10 + Added the *compact* parameter. + :class:`StackSummary` Objects ----------------------------- diff --git a/Doc/library/types.rst b/Doc/library/types.rst index b6df3925..88fe47a8 100644 --- a/Doc/library/types.rst +++ b/Doc/library/types.rst @@ -103,6 +103,13 @@ If you instantiate any of these types, note that signatures may vary between Pyt Standard names are defined for the following types: +.. data:: NoneType + + The type of :data:`None`. + + .. versionadded:: 3.10 + + .. data:: FunctionType LambdaType @@ -192,6 +199,13 @@ Standard names are defined for the following types: .. versionadded:: 3.7 +.. data:: NotImplementedType + + The type of :data:`NotImplemented`. + + .. versionadded:: 3.10 + + .. data:: MethodDescriptorType The type of methods of some built-in data types such as :meth:`str.join`. @@ -229,7 +243,7 @@ Standard names are defined for the following types: .. note:: A future version of Python may stop setting this attribute by default. - To guard against this potential change, preferably read from the + To guard against this potential change, preferrably read from the :attr:`__spec__` attribute instead or use ``getattr(module, "__loader__", None)`` if you explicitly need to use this attribute. @@ -254,7 +268,7 @@ Standard names are defined for the following types: .. note:: A future version of Python may stop setting this attribute by default. - To guard against this potential change, preferably read from the + To guard against this potential change, preferrably read from the :attr:`__spec__` attribute instead or use ``getattr(module, "__package__", None)`` if you explicitly need to use this attribute. @@ -270,6 +284,12 @@ Standard names are defined for the following types: .. versionadded:: 3.4 +.. data:: EllipsisType + + The type of :data:`Ellipsis`. + + .. versionadded:: 3.10 + .. class:: GenericAlias(t_origin, t_args) The type of :ref:`parameterized generics ` such as @@ -292,6 +312,12 @@ Standard names are defined for the following types: This type can now be subclassed. +.. data:: UnionType + + The type of :ref:`union type expressions`. + + .. versionadded:: 3.10 + .. class:: TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno) The type of traceback objects such as found in ``sys.exc_info()[2]``. diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst index f3c6a2e0..13760c19 100644 --- a/Doc/library/typing.rst +++ b/Doc/library/typing.rst @@ -17,10 +17,13 @@ -------------- -This module provides runtime support for type hints. The most fundamental -support consists of the types :data:`Any`, :data:`Union`, :data:`Callable`, -:class:`TypeVar`, and :class:`Generic`. For a full specification, please see -:pep:`484`. For a simplified introduction to type hints, see :pep:`483`. +This module provides runtime support for type hints as specified by +:pep:`484`, :pep:`526`, :pep:`544`, :pep:`586`, :pep:`589`, :pep:`591`, +:pep:`612` and :pep:`613`. +The most fundamental support consists of the types :data:`Any`, :data:`Union`, +:data:`Tuple`, :data:`Callable`, :class:`TypeVar`, and +:class:`Generic`. For full specification please see :pep:`484`. For +a simplified introduction to type hints see :pep:`483`. The function below takes and returns a string and is annotated as follows:: @@ -32,36 +35,7 @@ In the function ``greeting``, the argument ``name`` is expected to be of type :class:`str` and the return type :class:`str`. Subtypes are accepted as arguments. -New features are frequently added to the ``typing`` module. -The `typing_extensions `_ package -provides backports of these new features to older versions of Python. - -.. _relevant-peps: - -Relevant PEPs -============= - -Since the initial introduction of type hints in :pep:`484` and :pep:`483`, a -number of PEPs have modified and enhanced Python's framework for type -annotations. These include: - -* :pep:`526`: Syntax for Variable Annotations - *Introducing* syntax for annotating variables outside of function - definitions, and :data:`ClassVar` -* :pep:`544`: Protocols: Structural subtyping (static duck typing) - *Introducing* :class:`Protocol` and the - :func:`@runtime_checkable` decorator -* :pep:`585`: Type Hinting Generics In Standard Collections - *Introducing* :class:`types.GenericAlias` and the ability to use standard - library classes as :ref:`generic types` -* :pep:`586`: Literal Types - *Introducing* :class:`Literal` -* :pep:`589`: TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys - *Introducing* :class:`TypedDict` -* :pep:`591`: Adding a final qualifier to typing - *Introducing* :data:`Final` and the :func:`@final` decorator -* :pep:`593`: Flexible function and variable annotations - *Introducing* :class:`Annotated` +.. _type-aliases: Type aliases ============ @@ -103,7 +77,7 @@ Note that ``None`` as a type hint is a special case and is replaced by NewType ======= -Use the :func:`NewType` helper to create distinct types:: +Use the :class:`NewType` helper class to create distinct types:: from typing import NewType @@ -132,15 +106,14 @@ accidentally creating a ``UserId`` in an invalid way:: Note that these checks are enforced only by the static type checker. At runtime, the statement ``Derived = NewType('Derived', Base)`` will make ``Derived`` a -callable that immediately returns whatever parameter you pass it. That means +class that immediately returns whatever parameter you pass it. That means the expression ``Derived(some_value)`` does not create a new class or introduce -any overhead beyond that of a regular function call. +much overhead beyond that of a regular function call. More precisely, the expression ``some_value is Derived(some_value)`` is always true at runtime. -This also means that it is not possible to create a subtype of ``Derived`` -since it is an identity function at runtime, not an actual type:: +It is invalid to create a subtype of ``Derived``:: from typing import NewType @@ -149,7 +122,7 @@ since it is an identity function at runtime, not an actual type:: # Fails at runtime and does not typecheck class AdminUserId(UserId): pass -However, it is possible to create a :func:`NewType` based on a 'derived' ``NewType``:: +However, it is possible to create a :class:`NewType` based on a 'derived' ``NewType``:: from typing import NewType @@ -177,6 +150,12 @@ See :pep:`484` for more details. .. versionadded:: 3.5.2 +.. versionchanged:: 3.10 + ``NewType`` is now a class rather than a function. There is some additional + runtime cost when calling ``NewType`` over a regular function. However, this + cost will be reduced in 3.11.0. + + Callable ======== @@ -194,14 +173,26 @@ For example:: on_error: Callable[[int, Exception], None]) -> None: # Body - async def on_update(value: str) -> None: - # Body - callback: Callable[[str], Awaitable[None]] = on_update - It is possible to declare the return type of a callable without specifying the call signature by substituting a literal ellipsis for the list of arguments in the type hint: ``Callable[..., ReturnType]``. +Callables which take other callables as arguments may indicate that their +parameter types are dependent on each other using :class:`ParamSpec`. +Additionally, if that callable adds or removes arguments from other +callables, the :data:`Concatenate` operator may be used. They +take the form ``Callable[ParamSpecVariable, ReturnType]`` and +``Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]`` +respectively. + +.. versionchanged:: 3.10 + ``Callable`` now supports :class:`ParamSpec` and :data:`Concatenate`. + See :pep:`612` for more information. + +.. seealso:: + The documentation for :class:`ParamSpec` and :class:`Concatenate` provide + examples of usage in ``Callable``. + .. _generics: Generics @@ -218,7 +209,7 @@ subscription to denote expected types for container elements. def notify_by_email(employees: Sequence[Employee], overrides: Mapping[str, str]) -> None: ... -Generics can be parameterized by using a factory available in typing +Generics can be parameterized by using a new factory available in typing called :class:`TypeVar`. :: @@ -231,7 +222,6 @@ called :class:`TypeVar`. def first(l: Sequence[T]) -> T: # Generic function return l[0] -.. _user-defined-generics: User-defined generic types ========================== @@ -266,8 +256,8 @@ A user-defined class can be defined as a generic class. single type parameter ``T`` . This also makes ``T`` valid as a type within the class body. -The :class:`Generic` base class defines :meth:`~object.__class_getitem__` so -that ``LoggedVar[t]`` is valid as a type:: +The :class:`Generic` base class defines :meth:`__class_getitem__` so that +``LoggedVar[t]`` is valid as a type:: from collections.abc import Iterable @@ -275,16 +265,16 @@ that ``LoggedVar[t]`` is valid as a type:: for var in vars: var.set(0) -A generic type can have any number of type variables. All varieties of -:class:`TypeVar` are permissible as parameters for a generic type:: +A generic type can have any number of type variables, and type variables may +be constrained:: - from typing import TypeVar, Generic, Sequence + from typing import TypeVar, Generic + ... - T = TypeVar('T', contravariant=True) - B = TypeVar('B', bound=Sequence[bytes], covariant=True) + T = TypeVar('T') S = TypeVar('S', int, str) - class WeirdTrio(Generic[T, B, S]): + class StrangePair(Generic[T, S]): ... Each type variable argument to :class:`Generic` must be distinct. @@ -331,11 +321,11 @@ not generic but implicitly inherits from ``Iterable[Any]``:: User defined generic type aliases are also supported. Examples:: from collections.abc import Iterable - from typing import TypeVar, Union + from typing import TypeVar S = TypeVar('S') - Response = Union[Iterable[S], int] + Response = Iterable[S] | int - # Return type here is same as Union[Iterable[str], int] + # Return type here is same as Iterable[str] | int def response(query: str) -> Response[str]: ... @@ -348,6 +338,43 @@ User defined generic type aliases are also supported. Examples:: .. versionchanged:: 3.7 :class:`Generic` no longer has a custom metaclass. +User-defined generics for parameter expressions are also supported via parameter +specification variables in the form ``Generic[P]``. The behavior is consistent +with type variables' described above as parameter specification variables are +treated by the typing module as a specialized type variable. The one exception +to this is that a list of types can be used to substitute a :class:`ParamSpec`:: + + >>> from typing import Generic, ParamSpec, TypeVar + + >>> T = TypeVar('T') + >>> P = ParamSpec('P') + + >>> class Z(Generic[T, P]): ... + ... + >>> Z[int, [dict, float]] + __main__.Z[int, (, )] + + +Furthermore, a generic with only one parameter specification variable will accept +parameter lists in the forms ``X[[Type1, Type2, ...]]`` and also +``X[Type1, Type2, ...]`` for aesthetic reasons. Internally, the latter is converted +to the former and are thus equivalent:: + + >>> class X(Generic[P]): ... + ... + >>> X[int, str] + __main__.X[(, )] + >>> X[[int, str]] + __main__.X[(, )] + +Do note that generics with :class:`ParamSpec` may not have correct +``__parameters__`` after substitution in some cases because they +are intended primarily for static type checking. + +.. versionchanged:: 3.10 + :class:`Generic` can now be parameterized over parameter expressions. + See :class:`ParamSpec` and :pep:`612` for more details. + A user-defined generic class can have ABCs as base classes without a metaclass conflict. Generic metaclasses are not supported. The outcome of parameterizing generics is cached, and most types in the typing module are hashable and @@ -366,12 +393,12 @@ value of type :data:`Any` and assign it to any variable:: from typing import Any - a: Any = None - a = [] # OK - a = 2 # OK + a = None # type: Any + a = [] # OK + a = 2 # OK - s: str = '' - s = a # OK + s = '' # type: str + s = a # OK def foo(item: Any) -> int: # Typechecks; 'item' could be any type, @@ -435,7 +462,7 @@ manner. Use :data:`Any` to indicate that a value is dynamically typed. Nominal vs structural subtyping =============================== -Initially :pep:`484` defined the Python static type system as using +Initially :pep:`484` defined Python static type system as using *nominal subtyping*. This means that a class ``A`` is allowed where a class ``B`` is expected if and only if ``A`` is a subclass of ``B``. @@ -523,6 +550,19 @@ These can be used as types in annotations and do not support ``[]``. .. versionadded:: 3.5.4 .. versionadded:: 3.6.2 +.. data:: TypeAlias + + Special annotation for explicitly declaring a :ref:`type alias `. + For example:: + + from typing import TypeAlias + + Factors: TypeAlias = list[int] + + See :pep:`613` for more details about explicit type aliases. + + .. versionadded:: 3.10 + Special forms """"""""""""" @@ -548,9 +588,9 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. data:: Union - Union type; ``Union[X, Y]`` means either X or Y. + Union type; ``Union[X, Y]`` is equivalent to ``X | Y`` and means either X or Y. - To define a union, use e.g. ``Union[int, str]``. Details: + To define a union, use e.g. ``Union[int, str]`` or the shorthand ``int | str``. Details: * The arguments must be types and there must be at least one. @@ -564,26 +604,28 @@ These can be used as types in annotations using ``[]``, each having a unique syn * Redundant arguments are skipped, e.g.:: - Union[int, str, int] == Union[int, str] + Union[int, str, int] == Union[int, str] == int | str * When comparing unions, the argument order is ignored, e.g.:: Union[int, str] == Union[str, int] - * You cannot subclass or instantiate a union. + * You cannot subclass or instantiate a ``Union``. * You cannot write ``Union[X][Y]``. - * You can use ``Optional[X]`` as a shorthand for ``Union[X, None]``. - .. versionchanged:: 3.7 Don't remove explicit subclasses from unions at runtime. + .. versionchanged:: 3.10 + Unions can now be written as ``X | Y``. See + :ref:`union type expressions`. + .. data:: Optional Optional type. - ``Optional[X]`` is equivalent to ``Union[X, None]``. + ``Optional[X]`` is equivalent to ``X | None`` (or ``Union[X, None]``). Note that this is not the same concept as an optional argument, which is one that has a default. An optional argument with a @@ -600,6 +642,10 @@ These can be used as types in annotations using ``[]``, each having a unique syn def foo(arg: Optional[int] = None) -> None: ... + .. versionchanged:: 3.10 + Optional can now be written as ``X | None``. See + :ref:`union type expressions`. + .. data:: Callable Callable type; ``Callable[[int], str]`` is a function of (int) -> str. @@ -617,10 +663,80 @@ These can be used as types in annotations using ``[]``, each having a unique syn ``Callable[..., Any]``, and in turn to :class:`collections.abc.Callable`. + Callables which take other callables as arguments may indicate that their + parameter types are dependent on each other using :class:`ParamSpec`. + Additionally, if that callable adds or removes arguments from other + callables, the :data:`Concatenate` operator may be used. They + take the form ``Callable[ParamSpecVariable, ReturnType]`` and + ``Callable[Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable], ReturnType]`` + respectively. + .. deprecated:: 3.9 :class:`collections.abc.Callable` now supports ``[]``. See :pep:`585` and :ref:`types-genericalias`. + .. versionchanged:: 3.10 + ``Callable`` now supports :class:`ParamSpec` and :data:`Concatenate`. + See :pep:`612` for more information. + + .. seealso:: + The documentation for :class:`ParamSpec` and :class:`Concatenate` provide + examples of usage with ``Callable``. + +.. data:: Concatenate + + Used with :data:`Callable` and :class:`ParamSpec` to type annotate a higher + order callable which adds, removes, or transforms parameters of another + callable. Usage is in the form + ``Concatenate[Arg1Type, Arg2Type, ..., ParamSpecVariable]``. ``Concatenate`` + is currently only valid when used as the first argument to a :data:`Callable`. + The last parameter to ``Concatenate`` must be a :class:`ParamSpec`. + + For example, to annotate a decorator ``with_lock`` which provides a + :class:`threading.Lock` to the decorated function, ``Concatenate`` can be + used to indicate that ``with_lock`` expects a callable which takes in a + ``Lock`` as the first argument, and returns a callable with a different type + signature. In this case, the :class:`ParamSpec` indicates that the returned + callable's parameter types are dependent on the parameter types of the + callable being passed in:: + + from collections.abc import Callable + from threading import Lock + from typing import Any, Concatenate, ParamSpec, TypeVar + + P = ParamSpec('P') + R = TypeVar('R') + + # Use this lock to ensure that only one thread is executing a function + # at any time. + my_lock = Lock() + + def with_lock(f: Callable[Concatenate[Lock, P], R]) -> Callable[P, R]: + '''A type-safe decorator which provides a lock.''' + global my_lock + def inner(*args: P.args, **kwargs: P.kwargs) -> R: + # Provide the lock as the first argument. + return f(my_lock, *args, **kwargs) + return inner + + @with_lock + def sum_threadsafe(lock: Lock, numbers: list[float]) -> float: + '''Add a list of numbers together in a thread-safe manner.''' + with lock: + return sum(numbers) + + # We don't need to pass in the lock ourselves thanks to the decorator. + sum_threadsafe([1.1, 2.2, 3.3]) + +.. versionadded:: 3.10 + +.. seealso:: + + * :pep:`612` -- Parameter Specification Variables (the PEP which introduced + ``ParamSpec`` and ``Concatenate``). + * :class:`ParamSpec` and :class:`Callable`. + + .. class:: Type(Generic[CT_co]) A variable annotated with ``C`` may accept a value of type ``C``. In @@ -656,7 +772,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn :ref:`type variables `, and unions of any of these types. For example:: - def new_non_team_user(user_class: Type[Union[BasicUser, ProUser]]): ... + def new_non_team_user(user_class: Type[BasicUser | ProUser]): ... ``Type[Any]`` is equivalent to ``Type`` which in turn is equivalent to ``type``, which is the root of Python's metaclass hierarchy. @@ -753,7 +869,7 @@ These can be used as types in annotations using ``[]``, each having a unique syn ``no_type_check`` functionality that currently exists in the ``typing`` module which completely disables typechecking annotations on a function or a class, the ``Annotated`` type allows for both static typechecking - of ``T`` (which can safely ignore ``x``) + of ``T`` (e.g., via mypy or Pyre, which can safely ignore ``x``) together with runtime access to ``x`` within a specific application. Ultimately, the responsibility of how to interpret the annotations (if @@ -824,6 +940,75 @@ These can be used as types in annotations using ``[]``, each having a unique syn .. versionadded:: 3.9 + +.. data:: TypeGuard + + Special typing form used to annotate the return type of a user-defined + type guard function. ``TypeGuard`` only accepts a single type argument. + At runtime, functions marked this way should return a boolean. + + ``TypeGuard`` aims to benefit *type narrowing* -- a technique used by static + type checkers to determine a more precise type of an expression within a + program's code flow. Usually type narrowing is done by analyzing + conditional code flow and applying the narrowing to a block of code. The + conditional expression here is sometimes referred to as a "type guard":: + + def is_str(val: str | float): + # "isinstance" type guard + if isinstance(val, str): + # Type of ``val`` is narrowed to ``str`` + ... + else: + # Else, type of ``val`` is narrowed to ``float``. + ... + + Sometimes it would be convenient to use a user-defined boolean function + as a type guard. Such a function should use ``TypeGuard[...]`` as its + return type to alert static type checkers to this intention. + + Using ``-> TypeGuard`` tells the static type checker that for a given + function: + + 1. The return value is a boolean. + 2. If the return value is ``True``, the type of its argument + is the type inside ``TypeGuard``. + + For example:: + + def is_str_list(val: List[object]) -> TypeGuard[List[str]]: + '''Determines whether all objects in the list are strings''' + return all(isinstance(x, str) for x in val) + + def func1(val: List[object]): + if is_str_list(val): + # Type of ``val`` is narrowed to ``List[str]``. + print(" ".join(val)) + else: + # Type of ``val`` remains as ``List[object]``. + print("Not a list of strings!") + + If ``is_str_list`` is a class or instance method, then the type in + ``TypeGuard`` maps to the type of the second parameter after ``cls`` or + ``self``. + + In short, the form ``def foo(arg: TypeA) -> TypeGuard[TypeB]: ...``, + means that if ``foo(arg)`` returns ``True``, then ``arg`` narrows from + ``TypeA`` to ``TypeB``. + + .. note:: + + ``TypeB`` need not be a narrower form of ``TypeA`` -- it can even be a + wider form. The main reason is to allow for things like + narrowing ``List[object]`` to ``List[str]`` even though the latter + is not a subtype of the former, since ``List`` is invariant. + The responsibility of writing type-safe type guards is left to the user. + + ``TypeGuard`` also works with type variables. For more information, see + :pep:`647` (User-Defined Type Guards). + + .. versionadded:: 3.10 + + Building generic types """""""""""""""""""""" @@ -860,8 +1045,7 @@ These are not used in annotations. They are building blocks for creating generic Usage:: T = TypeVar('T') # Can be anything - S = TypeVar('S', bound=str) # Can be any subtype of str - A = TypeVar('A', str, bytes) # Must be exactly str or bytes + A = TypeVar('A', str, bytes) # Must be str or bytes Type variables exist primarily for the benefit of static type checkers. They serve as the parameters for generic types as well @@ -872,95 +1056,127 @@ These are not used in annotations. They are building blocks for creating generic """Return a list containing n references to x.""" return [x]*n + def longest(x: A, y: A) -> A: + """Return the longest of two strings.""" + return x if len(x) >= len(y) else y - def print_capitalized(x: S) -> S: - """Print x capitalized, and return x.""" - print(x.capitalize()) - return x - - - def concatenate(x: A, y: A) -> A: - """Add two strings or bytes objects together.""" - return x + y - - Note that type variables can be *bound*, *constrained*, or neither, but - cannot be both bound *and* constrained. + The latter example's signature is essentially the overloading + of ``(str, str) -> str`` and ``(bytes, bytes) -> bytes``. Also note + that if the arguments are instances of some subclass of :class:`str`, + the return type is still plain :class:`str`. - Constrained type variables and bound type variables have different - semantics in several important ways. Using a *constrained* type variable - means that the ``TypeVar`` can only ever be solved as being exactly one of - the constraints given:: - - a = concatenate('one', 'two') # Ok, variable 'a' has type 'str' - b = concatenate(StringSubclass('one'), StringSubclass('two')) # Inferred type of variable 'b' is 'str', - # despite 'StringSubclass' being passed in - c = concatenate('one', b'two') # error: type variable 'A' can be either 'str' or 'bytes' in a function call, but not both - - Using a *bound* type variable, however, means that the ``TypeVar`` will be - solved using the most specific type possible:: - - print_capitalized('a string') # Ok, output has type 'str' + At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. In general, + :func:`isinstance` and :func:`issubclass` should not be used with types. - class StringSubclass(str): - pass + Type variables may be marked covariant or contravariant by passing + ``covariant=True`` or ``contravariant=True``. See :pep:`484` for more + details. By default type variables are invariant. Alternatively, + a type variable may specify an upper bound using ``bound=``. + This means that an actual type substituted (explicitly or implicitly) + for the type variable must be a subclass of the boundary type, + see :pep:`484`. - print_capitalized(StringSubclass('another string')) # Ok, output has type 'StringSubclass' - print_capitalized(45) # error: int is not a subtype of str +.. class:: ParamSpec(name, *, bound=None, covariant=False, contravariant=False) - Type variables can be bound to concrete types, abstract types (ABCs or - protocols), and even unions of types:: + Parameter specification variable. A specialized version of + :class:`type variables `. - U = TypeVar('U', bound=str|bytes) # Can be any subtype of the union str|bytes - V = TypeVar('V', bound=SupportsAbs) # Can be anything with an __abs__ method + Usage:: - Bound type variables are particularly useful for annotating - :func:`classmethods ` that serve as alternative constructors. - In the following example (© - `Raymond Hettinger `_), the - type variable ``C`` is bound to the ``Circle`` class through the use of a - forward reference. Using this type variable to annotate the - ``with_circumference`` classmethod, rather than hardcoding the return type - as ``Circle``, means that a type checker can correctly infer the return - type even if the method is called on a subclass:: + P = ParamSpec('P') - import math + Parameter specification variables exist primarily for the benefit of static + type checkers. They are used to forward the parameter types of one + callable to another callable -- a pattern commonly found in higher order + functions and decorators. They are only valid when used in ``Concatenate``, + or as the first argument to ``Callable``, or as parameters for user-defined + Generics. See :class:`Generic` for more information on generic types. - C = TypeVar('C', bound='Circle') + For example, to add basic logging to a function, one can create a decorator + ``add_logging`` to log function calls. The parameter specification variable + tells the type checker that the callable passed into the decorator and the + new callable returned by it have inter-dependent type parameters:: - class Circle: - """An abstract circle""" + from collections.abc import Callable + from typing import TypeVar, ParamSpec + import logging - def __init__(self, radius: float) -> None: - self.radius = radius + T = TypeVar('T') + P = ParamSpec('P') + + def add_logging(f: Callable[P, T]) -> Callable[P, T]: + '''A type-safe decorator to add logging to a function.''' + def inner(*args: P.args, **kwargs: P.kwargs) -> T: + logging.info(f'{f.__name__} was called') + return f(*args, **kwargs) + return inner + + @add_logging + def add_two(x: float, y: float) -> float: + '''Add two numbers together.''' + return x + y + + Without ``ParamSpec``, the simplest way to annotate this previously was to + use a :class:`TypeVar` with bound ``Callable[..., Any]``. However this + causes two problems: + + 1. The type checker can't type check the ``inner`` function because + ``*args`` and ``**kwargs`` have to be typed :data:`Any`. + 2. :func:`~cast` may be required in the body of the ``add_logging`` + decorator when returning the ``inner`` function, or the static type + checker must be told to ignore the ``return inner``. + + .. attribute:: args + .. attribute:: kwargs + + Since ``ParamSpec`` captures both positional and keyword parameters, + ``P.args`` and ``P.kwargs`` can be used to split a ``ParamSpec`` into its + components. ``P.args`` represents the tuple of positional parameters in a + given call and should only be used to annotate ``*args``. ``P.kwargs`` + represents the mapping of keyword parameters to their values in a given call, + and should be only be used to annotate ``**kwargs``. Both + attributes require the annotated parameter to be in scope. At runtime, + ``P.args`` and ``P.kwargs`` are instances respectively of + :class:`ParamSpecArgs` and :class:`ParamSpecKwargs`. + + Parameter specification variables created with ``covariant=True`` or + ``contravariant=True`` can be used to declare covariant or contravariant + generic types. The ``bound`` argument is also accepted, similar to + :class:`TypeVar`. However the actual semantics of these keywords are yet to + be decided. + + .. versionadded:: 3.10 - # Use a type variable to show that the return type - # will always be an instance of whatever ``cls`` is - @classmethod - def with_circumference(cls: type[C], circumference: float) -> C: - """Create a circle with the specified circumference""" - radius = circumference / (math.pi * 2) - return cls(radius) + .. note:: + Only parameter specification variables defined in global scope can + be pickled. + .. seealso:: + * :pep:`612` -- Parameter Specification Variables (the PEP which introduced + ``ParamSpec`` and ``Concatenate``). + * :class:`Callable` and :class:`Concatenate`. - class Tire(Circle): - """A specialised circle (made out of rubber)""" +.. data:: ParamSpecArgs +.. data:: ParamSpecKwargs - MATERIAL = 'rubber' + Arguments and keyword arguments attributes of a :class:`ParamSpec`. The + ``P.args`` attribute of a ``ParamSpec`` is an instance of ``ParamSpecArgs``, + and ``P.kwargs`` is an instance of ``ParamSpecKwargs``. They are intended + for runtime introspection and have no special meaning to static type checkers. + Calling :func:`get_origin` on either of these objects will return the + original ``ParamSpec``:: - c = Circle.with_circumference(3) # Ok, variable 'c' has type 'Circle' - t = Tire.with_circumference(4) # Ok, variable 't' has type 'Tire' (not 'Circle') + P = ParamSpec("P") + get_origin(P.args) # returns P + get_origin(P.kwargs) # returns P - At runtime, ``isinstance(x, T)`` will raise :exc:`TypeError`. In general, - :func:`isinstance` and :func:`issubclass` should not be used with types. + .. versionadded:: 3.10 - Type variables may be marked covariant or contravariant by passing - ``covariant=True`` or ``contravariant=True``. See :pep:`484` for more - details. By default, type variables are invariant. .. data:: AnyStr - ``AnyStr`` is a :class:`constrained type variable ` defined as + ``AnyStr`` is a type variable defined as ``AnyStr = TypeVar('AnyStr', str, bytes)``. It is meant to be used for functions that may accept any kind of string @@ -1023,11 +1239,13 @@ These are not used in annotations. They are building blocks for creating generic .. note:: - :func:`runtime_checkable` will check only the presence of the required methods, - not their type signatures! For example, :class:`builtins.complex ` - implements :func:`__float__`, therefore it passes an :func:`issubclass` check - against :class:`SupportsFloat`. However, the ``complex.__float__`` method - exists only to raise a :class:`TypeError` with a more informative message. + :func:`runtime_checkable` will check only the presence of the required + methods, not their type signatures. For example, :class:`ssl.SSLObject` + is a class, therefore it passes an :func:`issubclass` + check against :data:`Callable`. However, the + :meth:`ssl.SSLObject.__init__` method exists only to raise a + :exc:`TypeError` with a more informative message, therefore making + it impossible to call (instantiate) :class:`ssl.SSLObject`. .. versionadded:: 3.8 @@ -1064,7 +1282,7 @@ These are not used in annotations. They are building blocks for declaring types. The resulting class has an extra attribute ``__annotations__`` giving a dict that maps the field names to the field types. (The field names are in the ``_fields`` attribute and the default values are in the - ``_field_defaults`` attribute, both of which are part of the :func:`~collections.namedtuple` + ``_field_defaults`` attribute both of which are part of the namedtuple API.) ``NamedTuple`` subclasses can also have docstrings and methods:: @@ -1095,17 +1313,21 @@ These are not used in annotations. They are building blocks for declaring types. Removed the ``_field_types`` attribute in favor of the more standard ``__annotations__`` attribute which has the same information. -.. function:: NewType(name, tp) +.. class:: NewType(name, tp) - A helper function to indicate a distinct type to a typechecker, - see :ref:`distinct`. At runtime it returns a function that returns - its argument. Usage:: + A helper class to indicate a distinct type to a typechecker, + see :ref:`distinct`. At runtime it returns an object that returns + its argument when called. + Usage:: UserId = NewType('UserId', int) first_user = UserId(1) .. versionadded:: 3.5.2 + .. versionchanged:: 3.10 + ``NewType`` is now a class rather than a function. + .. class:: TypedDict(dict) Special construct to add type hints to a dictionary. @@ -1127,29 +1349,15 @@ These are not used in annotations. They are building blocks for declaring types. assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') + The type info for introspection can be accessed via ``Point2D.__annotations__``, + ``Point2D.__total__``, ``Point2D.__required_keys__``, and + ``Point2D.__optional_keys__``. To allow using this feature with older versions of Python that do not support :pep:`526`, ``TypedDict`` supports two additional equivalent - syntactic forms: - - * Using a literal :class:`dict` as the second argument:: - - Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) - - * Using keyword arguments:: + syntactic forms:: Point2D = TypedDict('Point2D', x=int, y=int, label=str) - - The functional syntax should also be used when any of the keys are not valid - :ref:`identifiers `, for example because they are keywords or contain hyphens. - Example:: - - # raises SyntaxError - class Point2D(TypedDict): - in: int # 'in' is a keyword - x-y: int # name with hyphens - - # OK, functional syntax - Point2D = TypedDict('Point2D', {'in': int, 'x-y': int}) + Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) By default, all keys must be present in a ``TypedDict``. It is possible to override this by specifying totality. @@ -1159,89 +1367,11 @@ These are not used in annotations. They are building blocks for declaring types. x: int y: int - # Alternative syntax - Point2D = TypedDict('Point2D', {'x': int, 'y': int}, total=False) - This means that a ``Point2D`` ``TypedDict`` can have any of the keys omitted. A type checker is only expected to support a literal ``False`` or ``True`` as the value of the ``total`` argument. ``True`` is the default, and makes all items defined in the class body required. - It is possible for a ``TypedDict`` type to inherit from one or more other ``TypedDict`` types - using the class-based syntax. - Usage:: - - class Point3D(Point2D): - z: int - - ``Point3D`` has three items: ``x``, ``y`` and ``z``. It is equivalent to this - definition:: - - class Point3D(TypedDict): - x: int - y: int - z: int - - A ``TypedDict`` cannot inherit from a non-\ ``TypedDict`` class, - notably including :class:`Generic`. For example:: - - class X(TypedDict): - x: int - - class Y(TypedDict): - y: int - - class Z(object): pass # A non-TypedDict class - - class XY(X, Y): pass # OK - - class XZ(X, Z): pass # raises TypeError - - T = TypeVar('T') - class XT(X, Generic[T]): pass # raises TypeError - - A ``TypedDict`` can be introspected via :attr:`__annotations__`, - :attr:`__total__`, :attr:`__required_keys__`, and :attr:`__optional_keys__`. - - .. attribute:: __total__ - - ``Point2D.__total__`` gives the value of the ``total`` argument. - Example:: - - >>> from typing import TypedDict - >>> class Point2D(TypedDict): pass - >>> Point2D.__total__ - True - >>> class Point2D(TypedDict, total=False): pass - >>> Point2D.__total__ - False - >>> class Point3D(Point2D): pass - >>> Point3D.__total__ - True - - .. attribute:: __required_keys__ - .. attribute:: __optional_keys__ - - ``Point2D.__required_keys__`` and ``Point2D.__optional_keys__`` return - :class:`frozenset` objects containing required and non-required keys, respectively. - Currently the only way to declare both required and non-required keys in the - same ``TypedDict`` is mixed inheritance, declaring a ``TypedDict`` with one value - for the ``total`` argument and then inheriting it from another ``TypedDict`` with - a different value for ``total``. - Usage:: - - >>> class Point2D(TypedDict, total=False): - ... x: int - ... y: int - ... - >>> class Point3D(Point2D): - ... z: int - ... - >>> Point3D.__required_keys__ == frozenset({'z'}) - True - >>> Point3D.__optional_keys__ == frozenset({'x', 'y'}) - True - See :pep:`589` for more examples and detailed rules of using ``TypedDict``. .. versionadded:: 3.8 @@ -1377,8 +1507,8 @@ Other concrete types :func:`open`. .. deprecated-removed:: 3.8 3.12 - These types are also in the ``typing.io`` namespace, which was - never supported by type checkers and will be removed. + The ``typing.io`` namespace is deprecated and will be removed. + These types should be directly imported from ``typing`` instead. .. class:: Pattern Match @@ -1391,8 +1521,8 @@ Other concrete types ``Match[bytes]``. .. deprecated-removed:: 3.8 3.12 - These types are also in the ``typing.re`` namespace, which was - never supported by type checkers and will be removed. + The ``typing.re`` namespace is deprecated and will be removed. + These types should be directly imported from ``typing`` instead. .. deprecated:: 3.9 Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``. @@ -1590,7 +1720,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Hashable - An alias to :class:`collections.abc.Hashable`. + An alias to :class:`collections.abc.Hashable` .. class:: Reversible(Iterable[T_co]) @@ -1602,7 +1732,7 @@ Corresponding to other types in :mod:`collections.abc` .. class:: Sized - An alias to :class:`collections.abc.Sized`. + An alias to :class:`collections.abc.Sized` Asynchronous programming """""""""""""""""""""""" @@ -1614,10 +1744,11 @@ Asynchronous programming correspond to those of :class:`Generator`, for example:: from collections.abc import Coroutine - c: Coroutine[list[str], str, int] # Some coroutine defined elsewhere - x = c.send('hi') # Inferred type of 'x' is list[str] + c = None # type: Coroutine[list[str], str, int] + ... + x = c.send('hi') # type: list[str] async def bar() -> None: - y = await c # Inferred type of 'y' is int + x = await c # type: int .. versionadded:: 3.5.3 @@ -1807,7 +1938,7 @@ Functions and decorators ... class Sub(Base): def done(self) -> None: # Error reported by type checker - ... + ... @final class Leaf: @@ -1884,6 +2015,13 @@ Introspection helpers 'name': Annotated[str, 'some marker'] } + .. note:: + + :func:`get_type_hints` does not work with imported + :ref:`type aliases ` that include forward references. + Enabling postponed evaluation of annotations (:pep:`563`) may remove + the need for most forward references. + .. versionchanged:: 3.9 Added ``include_extras`` parameter as part of :pep:`593`. @@ -1895,7 +2033,7 @@ Introspection helpers For a typing object of the form ``X[Y, Z, ...]`` these functions return ``X`` and ``(Y, Z, ...)``. If ``X`` is a generic alias for a builtin or :mod:`collections` class, it gets normalized to the original class. - If ``X`` is a :class:`Union` or :class:`Literal` contained in another + If ``X`` is a union or :class:`Literal` contained in another generic type, the order of ``(Y, Z, ...)`` may be different from the order of the original arguments ``[Y, Z, ...]`` due to type caching. For unsupported objects return ``None`` and ``()`` correspondingly. @@ -1909,6 +2047,21 @@ Introspection helpers .. versionadded:: 3.8 +.. function:: is_typeddict(tp) + + Check if a type is a :class:`TypedDict`. + + For example:: + + class Film(TypedDict): + title: str + year: int + + is_typeddict(Film) # => True + is_typeddict(list | str) # => False + + .. versionadded:: 3.10 + .. class:: ForwardRef A class used for internal typing representation of string forward references. @@ -1944,11 +2097,10 @@ Constant .. note:: - If ``from __future__ import annotations`` is used, + If ``from __future__ import annotations`` is used in Python 3.7 or later, annotations are not evaluated at function definition time. - Instead, they are stored as strings in ``__annotations__``. - This makes it unnecessary to use quotes around the annotation + Instead, they are stored as strings in ``__annotations__``, + This makes it unnecessary to use quotes around the annotation. (see :pep:`563`). .. versionadded:: 3.5.2 - diff --git a/Doc/library/undoc.rst b/Doc/library/undoc.rst new file mode 100644 index 00000000..2444080d --- /dev/null +++ b/Doc/library/undoc.rst @@ -0,0 +1,26 @@ +.. _undoc: + +******************** +Undocumented Modules +******************** + +Here's a quick listing of modules that are currently undocumented, but that +should be documented. Feel free to contribute documentation for them! (Send +via email to docs@python.org.) + +The idea and original contents for this chapter were taken from a posting by +Fredrik Lundh; the specific contents of this chapter have been substantially +revised. + + +Platform specific modules +========================= + +These modules are used to implement the :mod:`os.path` module, and are not +documented beyond this mention. There's little need to document these. + +:mod:`ntpath` + --- Implementation of :mod:`os.path` on Win32 and Win64 platforms. + +:mod:`posixpath` + --- Implementation of :mod:`os.path` on POSIX. diff --git a/Doc/library/unittest.mock.rst b/Doc/library/unittest.mock.rst index 537fbcf4..d0640b42 100644 --- a/Doc/library/unittest.mock.rst +++ b/Doc/library/unittest.mock.rst @@ -262,9 +262,10 @@ the *new_callable* argument to :func:`patch`. this is a new Mock (created on first access). See the :attr:`return_value` attribute. - * *unsafe*: By default if any attribute starts with *assert* or - *assret* will raise an :exc:`AttributeError`. Passing ``unsafe=True`` - will allow access to these attributes. + * *unsafe*: By default, accessing any attribute with name starting with + *assert*, *assret*, *asert*, *aseert* or *assrt* will raise an + :exc:`AttributeError`. Passing ``unsafe=True`` will allow access to + these attributes. .. versionadded:: 3.5 @@ -1515,7 +1516,7 @@ attribute in a class) that does not exist will fail with :exc:`AttributeError`:: >>> test() Traceback (most recent call last): ... - AttributeError: does not have the attribute 'non_existing_attribute' + AttributeError: does not have the attribute 'non_existing' but adding ``create=True`` in the call to :func:`patch` will make the previous example work as expected:: @@ -2549,7 +2550,7 @@ your assertion is gone: >>> mock = Mock(name='Thing', return_value=None) >>> mock(1, 2, 3) - >>> mock.assret_called_once_with(4, 5, 6) # Intentional typo! + >>> mock.assret_called_once_with(4, 5, 6) Your tests can pass silently and incorrectly because of the typo. @@ -2569,7 +2570,7 @@ attributes on the mock that exist on the real class: >>> from urllib import request >>> mock = Mock(spec=request.Request) - >>> mock.assret_called_with # Intentional typo! + >>> mock.assret_called_with Traceback (most recent call last): ... AttributeError: Mock object has no attribute 'assret_called_with' @@ -2581,7 +2582,7 @@ with any methods on the mock: >>> mock.has_data() - >>> mock.has_data.assret_called_with() # Intentional typo! + >>> mock.has_data.assret_called_with() Auto-speccing solves this problem. You can either pass ``autospec=True`` to :func:`patch` / :func:`patch.object` or use the :func:`create_autospec` function to create a @@ -2624,7 +2625,7 @@ any typos in our asserts will raise the correct error:: >>> req.add_header('spam', 'eggs') - >>> req.add_header.assret_called_with # Intentional typo! + >>> req.add_header.assret_called_with Traceback (most recent call last): ... AttributeError: Mock object has no attribute 'assret_called_with' diff --git a/Doc/library/unittest.rst b/Doc/library/unittest.rst index a000428c..99c2f6e0 100644 --- a/Doc/library/unittest.rst +++ b/Doc/library/unittest.rst @@ -223,7 +223,7 @@ Command-line options Only run test methods and classes that match the pattern or substring. This option may be used multiple times, in which case all test cases that - match any of the given patterns are included. + match of the given patterns are included. Patterns that contain a wildcard character (``*``) are matched against the test name using :meth:`fnmatch.fnmatchcase`; otherwise simple case-sensitive @@ -954,6 +954,9 @@ Test cases | :meth:`assertLogs(logger, level) | The ``with`` block logs on *logger* | 3.4 | | ` | with minimum *level* | | +---------------------------------------------------------+--------------------------------------+------------+ + | :meth:`assertNoLogs(logger, level) | The ``with`` block does not log on | 3.10 | + | ` | *logger* with minimum *level* | | + +---------------------------------------------------------+--------------------------------------+------------+ .. method:: assertRaises(exception, callable, *args, **kwds) assertRaises(exception, *, msg=None) @@ -1126,6 +1129,24 @@ Test cases .. versionadded:: 3.4 + .. method:: assertNoLogs(logger=None, level=None) + + A context manager to test that no messages are logged on + the *logger* or one of its children, with at least the given + *level*. + + If given, *logger* should be a :class:`logging.Logger` object or a + :class:`str` giving the name of a logger. The default is the root + logger, which will catch all messages. + + If given, *level* should be either a numeric logging level or + its string equivalent (for example either ``"ERROR"`` or + :attr:`logging.ERROR`). The default is :attr:`logging.INFO`. + + Unlike :meth:`assertLogs`, nothing will be returned by the context + manager. + + .. versionadded:: 3.10 There are also other methods used to perform more specific checks, such as: @@ -2418,7 +2439,7 @@ To add cleanup code that must be run even in the case of an exception, use after :func:`setUpModule` if :func:`setUpModule` raises an exception. It is responsible for calling all the cleanup functions added by - :func:`addModuleCleanup`. If you need cleanup functions to be called + :func:`addCleanupModule`. If you need cleanup functions to be called *prior* to :func:`tearDownModule` then you can call :func:`doModuleCleanups` yourself. diff --git a/Doc/library/unix.rst b/Doc/library/unix.rst index 4553a104..04d4081f 100644 --- a/Doc/library/unix.rst +++ b/Doc/library/unix.rst @@ -13,10 +13,14 @@ of it. Here's an overview: posix.rst pwd.rst + spwd.rst grp.rst + crypt.rst termios.rst tty.rst pty.rst fcntl.rst + pipes.rst resource.rst + nis.rst syslog.rst diff --git a/Doc/library/urllib.parse.rst b/Doc/library/urllib.parse.rst index f0f86051..a060cc9b 100644 --- a/Doc/library/urllib.parse.rst +++ b/Doc/library/urllib.parse.rst @@ -20,7 +20,7 @@ strings up in components (addressing scheme, network location, path etc.), to combine the components back into a URL string, and to convert a "relative URL" to an absolute URL given a "base URL." -The module has been designed to match the Internet RFC on Relative Uniform +The module has been designed to match the internet RFC on Relative Uniform Resource Locators. It supports the following URL schemes: ``file``, ``ftp``, ``gopher``, ``hdl``, ``http``, ``https``, ``imap``, ``mailto``, ``mms``, ``news``, ``nntp``, ``prospero``, ``rsync``, ``rtsp``, ``rtspu``, ``sftp``, @@ -48,29 +48,17 @@ or on combining URL components into a URL string. result, except for a leading slash in the *path* component, which is retained if present. For example: - .. doctest:: - :options: +NORMALIZE_WHITESPACE - >>> from urllib.parse import urlparse - >>> urlparse("scheme://netloc/path;parameters?query#fragment") - ParseResult(scheme='scheme', netloc='netloc', path='/path;parameters', params='', - query='query', fragment='fragment') - >>> o = urlparse("http://docs.python.org:80/3/library/urllib.parse.html?" - ... "highlight=params#url-parsing") - >>> o - ParseResult(scheme='http', netloc='docs.python.org:80', - path='/3/library/urllib.parse.html', params='', - query='highlight=params', fragment='url-parsing') + >>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html') + >>> o # doctest: +NORMALIZE_WHITESPACE + ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', + params='', query='', fragment='') >>> o.scheme 'http' - >>> o.netloc - 'docs.python.org:80' - >>> o.hostname - 'docs.python.org' >>> o.port 80 - >>> o._replace(fragment="").geturl() - 'http://docs.python.org:80/3/library/urllib.parse.html?highlight=params' + >>> o.geturl() + 'http://www.cwi.nl:80/%7Eguido/Python.html' Following the syntax specifications in :rfc:`1808`, urlparse recognizes a netloc only if it is properly introduced by '//'. Otherwise the @@ -104,31 +92,31 @@ or on combining URL components into a URL string. The return value is a :term:`named tuple`, which means that its items can be accessed by index or as named attributes, which are: - +------------------+-------+-------------------------+------------------------+ - | Attribute | Index | Value | Value if not present | - +==================+=======+=========================+========================+ - | :attr:`scheme` | 0 | URL scheme specifier | *scheme* parameter | - +------------------+-------+-------------------------+------------------------+ - | :attr:`netloc` | 1 | Network location part | empty string | - +------------------+-------+-------------------------+------------------------+ - | :attr:`path` | 2 | Hierarchical path | empty string | - +------------------+-------+-------------------------+------------------------+ - | :attr:`params` | 3 | Parameters for last | empty string | - | | | path element | | - +------------------+-------+-------------------------+------------------------+ - | :attr:`query` | 4 | Query component | empty string | - +------------------+-------+-------------------------+------------------------+ - | :attr:`fragment` | 5 | Fragment identifier | empty string | - +------------------+-------+-------------------------+------------------------+ - | :attr:`username` | | User name | :const:`None` | - +------------------+-------+-------------------------+------------------------+ - | :attr:`password` | | Password | :const:`None` | - +------------------+-------+-------------------------+------------------------+ - | :attr:`hostname` | | Host name (lower case) | :const:`None` | - +------------------+-------+-------------------------+------------------------+ - | :attr:`port` | | Port number as integer, | :const:`None` | - | | | if present | | - +------------------+-------+-------------------------+------------------------+ + +------------------+-------+--------------------------+----------------------+ + | Attribute | Index | Value | Value if not present | + +==================+=======+==========================+======================+ + | :attr:`scheme` | 0 | URL scheme specifier | *scheme* parameter | + +------------------+-------+--------------------------+----------------------+ + | :attr:`netloc` | 1 | Network location part | empty string | + +------------------+-------+--------------------------+----------------------+ + | :attr:`path` | 2 | Hierarchical path | empty string | + +------------------+-------+--------------------------+----------------------+ + | :attr:`params` | 3 | Parameters for last path | empty string | + | | | element | | + +------------------+-------+--------------------------+----------------------+ + | :attr:`query` | 4 | Query component | empty string | + +------------------+-------+--------------------------+----------------------+ + | :attr:`fragment` | 5 | Fragment identifier | empty string | + +------------------+-------+--------------------------+----------------------+ + | :attr:`username` | | User name | :const:`None` | + +------------------+-------+--------------------------+----------------------+ + | :attr:`password` | | Password | :const:`None` | + +------------------+-------+--------------------------+----------------------+ + | :attr:`hostname` | | Host name (lower case) | :const:`None` | + +------------------+-------+--------------------------+----------------------+ + | :attr:`port` | | Port number as integer, | :const:`None` | + | | | if present | | + +------------------+-------+--------------------------+----------------------+ Reading the :attr:`port` attribute will raise a :exc:`ValueError` if an invalid port is specified in the URL. See section @@ -165,7 +153,7 @@ or on combining URL components into a URL string. .. versionchanged:: 3.3 The fragment is now parsed for all URL schemes (unless *allow_fragment* is - false), in accordance with :rfc:`3986`. Previously, a whitelist of + false), in accordance with :rfc:`3986`. Previously, an allowlist of schemes that support fragments existed. .. versionchanged:: 3.6 @@ -216,9 +204,9 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. - .. versionchanged:: 3.9.2 + .. versionchanged:: 3.10 Added *separator* parameter with the default value of ``&``. Python - versions earlier than Python 3.9.2 allowed using both ``;`` and ``&`` as + versions earlier than Python 3.10 allowed using both ``;`` and ``&`` as query parameter separator. This has been changed to allow only a single separator key, with ``&`` as the default separator. @@ -247,7 +235,8 @@ or on combining URL components into a URL string. read. If set, then throws a :exc:`ValueError` if there are more than *max_num_fields* fields read. - The optional argument *separator* is the symbol to use for separating the query arguments. It defaults to ``&``. + The optional argument *separator* is the symbol to use for separating the + query arguments. It defaults to ``&``. Use the :func:`urllib.parse.urlencode` function to convert such lists of pairs into query strings. @@ -258,9 +247,9 @@ or on combining URL components into a URL string. .. versionchanged:: 3.8 Added *max_num_fields* parameter. - .. versionchanged:: 3.9.2 + .. versionchanged:: 3.10 Added *separator* parameter with the default value of ``&``. Python - versions earlier than Python 3.9.2 allowed using both ``;`` and ``&`` as + versions earlier than Python 3.10 allowed using both ``;`` and ``&`` as query parameter separator. This has been changed to allow only a single separator key, with ``&`` as the default separator. @@ -334,7 +323,7 @@ or on combining URL components into a URL string. Characters that affect netloc parsing under NFKC normalization will now raise :exc:`ValueError`. - .. versionchanged:: 3.9.5 + .. versionchanged:: 3.10 ASCII newline and tab characters are stripped from the URL. .. _WHATWG spec: https://url.spec.whatwg.org/#concept-basic-url-parser diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst index ae9abe7d..659a3632 100644 --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -109,6 +109,11 @@ The :mod:`urllib.request` module defines the following functions: .. versionchanged:: 3.4.3 *context* was added. + .. versionchanged:: 3.10 + HTTPS connection now send an ALPN extension with protocol indicator + ``http/1.1`` when no *context* is given. Custom *context* should set + ALPN protocols with :meth:`~ssl.SSLContext.set_alpn_protocol`. + .. deprecated:: 3.6 *cafile*, *capath* and *cadefault* are deprecated in favor of *context*. @@ -213,7 +218,6 @@ The following classes are provided: (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11"``, while :mod:`urllib`'s default user agent string is ``"Python-urllib/2.6"`` (on Python 2.6). - All header keys are sent in camel case. An appropriate ``Content-Type`` header should be included if the *data* argument is present. If this header has not been provided and *data* @@ -542,8 +546,7 @@ request. name, and later calls will overwrite previous calls in case the *key* collides. Currently, this is no loss of HTTP functionality, since all headers which have meaning when used more than once have a (header-specific) way of gaining the - same functionality using only one header. Note that headers added using - this method are also added to redirected requests. + same functionality using only one header. .. method:: Request.add_unredirected_header(key, header) @@ -734,7 +737,7 @@ The following attribute and methods should only be used by classes derived from This method, if implemented, will be called by the parent :class:`OpenerDirector`. It should return a file-like object as described in - the return value of the :meth:`~OpenerDirector.open` method of :class:`OpenerDirector`, or ``None``. + the return value of the :meth:`open` of :class:`OpenerDirector`, or ``None``. It should raise :exc:`~urllib.error.URLError`, unless a truly exceptional thing happens (for example, :exc:`MemoryError` should not be mapped to :exc:`URLError`). @@ -1237,7 +1240,7 @@ Here is an example of doing a ``PUT`` request using :class:`Request`:: import urllib.request DATA = b'some data' - req = urllib.request.Request(url='http://localhost:8080', data=DATA,method='PUT') + req = urllib.request.Request(url='http://localhost:8080', data=DATA, method='PUT') with urllib.request.urlopen(req) as f: pass print(f.status) @@ -1540,7 +1543,7 @@ some point in the future. * The :func:`urlopen` and :func:`urlretrieve` functions can cause arbitrarily long delays while waiting for a network connection to be set up. This means - that it is difficult to build an interactive Web client using these functions + that it is difficult to build an interactive web client using these functions without using threads. .. index:: diff --git a/Doc/library/urllib.robotparser.rst b/Doc/library/urllib.robotparser.rst index 544f5027..f063e463 100644 --- a/Doc/library/urllib.robotparser.rst +++ b/Doc/library/urllib.robotparser.rst @@ -19,7 +19,7 @@ This module provides a single class, :class:`RobotFileParser`, which answers questions about whether or not a particular user agent can fetch a URL on the -Web site that published the :file:`robots.txt` file. For more details on the +web site that published the :file:`robots.txt` file. For more details on the structure of :file:`robots.txt` files, see http://www.robotstxt.org/orig.html. diff --git a/Doc/library/uu.rst b/Doc/library/uu.rst index 026ec415..0bc8021e 100644 --- a/Doc/library/uu.rst +++ b/Doc/library/uu.rst @@ -3,17 +3,11 @@ .. module:: uu :synopsis: Encode and decode files in uuencode format. - :deprecated: .. moduleauthor:: Lance Ellinghouse **Source code:** :source:`Lib/uu.py` -.. deprecated:: 3.11 - The :mod:`uu` module is deprecated - (see :pep:`PEP 594 <594#uu-and-the-uu-encoding>` for details). - :mod:`base64` is a modern alternative. - -------------- This module encodes and decodes files in uuencode format, allowing arbitrary diff --git a/Doc/library/uuid.rst b/Doc/library/uuid.rst index ddfbbda2..415e25be 100644 --- a/Doc/library/uuid.rst +++ b/Doc/library/uuid.rst @@ -118,7 +118,7 @@ which relays any information about the UUID's safety, using this enumeration: .. attribute:: UUID.hex - The UUID as a 32-character lowercase hexadecimal string. + The UUID as a 32-character hexadecimal string. .. attribute:: UUID.int diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index 1ad75d5a..127a8717 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -249,7 +249,8 @@ creation according to their needs, the :class:`EnvBuilder` class. There is also a module-level convenience function: .. function:: create(env_dir, system_site_packages=False, clear=False, \ - symlinks=False, with_pip=False, prompt=None) + symlinks=False, with_pip=False, prompt=None, \ + upgrade_deps=False) Create an :class:`EnvBuilder` with the given keyword arguments, and call its :meth:`~EnvBuilder.create` method with the *env_dir* argument. @@ -262,6 +263,9 @@ There is also a module-level convenience function: .. versionchanged:: 3.6 Added the ``prompt`` parameter + .. versionchanged:: 3.9 + Added the ``upgrade_deps`` parameter + An example of extending ``EnvBuilder`` -------------------------------------- diff --git a/Doc/library/warnings.rst b/Doc/library/warnings.rst index 4f05e146..fe11aabb 100644 --- a/Doc/library/warnings.rst +++ b/Doc/library/warnings.rst @@ -105,7 +105,7 @@ The following warnings category classes are currently defined: | | :class:`bytes` and :class:`bytearray`. | +----------------------------------+-----------------------------------------------+ | :exc:`ResourceWarning` | Base category for warnings related to | -| | resource usage (ignored by default). | +| | resource usage. | +----------------------------------+-----------------------------------------------+ .. versionchanged:: 3.7 @@ -229,7 +229,7 @@ In regular release builds, the default warning filter has the following entries ignore::ImportWarning ignore::ResourceWarning -In debug builds, the list of default warning filters is empty. +In a :ref:`debug build `, the list of default warning filters is empty. .. versionchanged:: 3.2 :exc:`DeprecationWarning` is now ignored by default in addition to diff --git a/Doc/library/weakref.rst b/Doc/library/weakref.rst index 4b0945c0..b88543e4 100644 --- a/Doc/library/weakref.rst +++ b/Doc/library/weakref.rst @@ -88,10 +88,6 @@ support weak references but can add support through subclassing:: Extension types can easily be made to support weak references; see :ref:`weakref-support`. -When ``__slots__`` are defined for a given type, weak reference support is -disabled unless a ``'__weakref__'`` string is also present in the sequence of -strings in the ``__slots__`` declaration. -See :ref:`__slots__ documentation ` for details. .. class:: ref(object[, callback]) diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index 0ddba0de..c0990882 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -1,8 +1,8 @@ -:mod:`webbrowser` --- Convenient Web-browser controller +:mod:`webbrowser` --- Convenient web-browser controller ======================================================= .. module:: webbrowser - :synopsis: Easy-to-use controller for Web browsers. + :synopsis: Easy-to-use controller for web browsers. .. moduleauthor:: Fred L. Drake, Jr. .. sectionauthor:: Fred L. Drake, Jr. @@ -12,7 +12,7 @@ -------------- The :mod:`webbrowser` module provides a high-level interface to allow displaying -Web-based documents to users. Under most circumstances, simply calling the +web-based documents to users. Under most circumstances, simply calling the :func:`.open` function from this module will do the right thing. Under Unix, graphical browsers are preferred under X11, but text-mode browsers diff --git a/Doc/library/windows.rst b/Doc/library/windows.rst index 4d72ead1..b60d4e4c 100644 --- a/Doc/library/windows.rst +++ b/Doc/library/windows.rst @@ -9,6 +9,7 @@ This chapter describes modules that are only available on MS Windows platforms. .. toctree:: + msilib.rst msvcrt.rst winreg.rst winsound.rst diff --git a/Doc/library/xdrlib.rst b/Doc/library/xdrlib.rst index a3124a98..42a03a46 100644 --- a/Doc/library/xdrlib.rst +++ b/Doc/library/xdrlib.rst @@ -3,7 +3,6 @@ .. module:: xdrlib :synopsis: Encoders and decoders for the External Data Representation (XDR). - :deprecated: **Source code:** :source:`Lib/xdrlib.py` @@ -11,10 +10,6 @@ single: XDR single: External Data Representation -.. deprecated:: 3.11 - The :mod:`xdrlib` module is deprecated - (see :pep:`PEP 594 <594#xdrlib>` for details). - -------------- The :mod:`xdrlib` module supports the External Data Representation Standard as diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index 20984b98..d3a5f872 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -156,9 +156,6 @@ module documentation. This section lists the differences between the API and The :meth:`writexml` method now preserves the attribute order specified by the user. - .. versionchanged:: 3.9 - The *standalone* parameter was added. - .. method:: Node.toxml(encoding=None, standalone=None) Return a string or byte string containing the XML represented by @@ -177,9 +174,6 @@ module documentation. This section lists the differences between the API and The :meth:`toxml` method now preserves the attribute order specified by the user. - .. versionchanged:: 3.9 - The *standalone* parameter was added. - .. method:: Node.toprettyxml(indent="\\t", newl="\\n", encoding=None, \ standalone=None) @@ -196,8 +190,6 @@ module documentation. This section lists the differences between the API and The :meth:`toprettyxml` method now preserves the attribute order specified by the user. - .. versionchanged:: 3.9 - The *standalone* parameter was added. .. _dom-example: diff --git a/Doc/library/xml.dom.rst b/Doc/library/xml.dom.rst index b387240a..98454e18 100644 --- a/Doc/library/xml.dom.rst +++ b/Doc/library/xml.dom.rst @@ -73,7 +73,7 @@ implementations are free to support the strict mapping from IDL). See section `Document Object Model (DOM) Level 1 Specification `_ The W3C recommendation for the DOM supported by :mod:`xml.dom.minidom`. - `Python Language Mapping Specification `_ + `Python Language Mapping Specification `_ This specifies the mapping from OMG IDL to Python. diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst index 0d96a78c..87f4ee34 100644 --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -363,6 +363,13 @@ These two approaches both output:: |--> Commander Clement +Additional resources +^^^^^^^^^^^^^^^^^^^^ + +See http://effbot.org/zone/element-index.htm for tutorials and links to other +docs. + + .. _elementtree-xpath: XPath support @@ -448,6 +455,12 @@ Supported XPath syntax | | has the given value. The value cannot contain | | | quotes. | +-----------------------+------------------------------------------------------+ +| ``[@attrib!='value']``| Selects all elements for which the given attribute | +| | does not have the given value. The value cannot | +| | contain quotes. | +| | | +| | .. versionadded:: 3.10 | ++-----------------------+------------------------------------------------------+ | ``[tag]`` | Selects all elements that have a child named | | | ``tag``. Only immediate children are supported. | +-----------------------+------------------------------------------------------+ @@ -456,10 +469,22 @@ Supported XPath syntax | | | | | .. versionadded:: 3.7 | +-----------------------+------------------------------------------------------+ +| ``[.!='text']`` | Selects all elements whose complete text content, | +| | including descendants, does not equal the given | +| | ``text``. | +| | | +| | .. versionadded:: 3.10 | ++-----------------------+------------------------------------------------------+ | ``[tag='text']`` | Selects all elements that have a child named | | | ``tag`` whose complete text content, including | | | descendants, equals the given ``text``. | +-----------------------+------------------------------------------------------+ +| ``[tag!='text']`` | Selects all elements that have a child named | +| | ``tag`` whose complete text content, including | +| | descendants, does not equal the given ``text``. | +| | | +| | .. versionadded:: 3.10 | ++-----------------------+------------------------------------------------------+ | ``[position]`` | Selects all elements that are located at the given | | | position. The position can be either an integer | | | (1 is the first position), the expression ``last()`` | @@ -808,7 +833,6 @@ Functions ^^^^^^^^^ .. function:: xml.etree.ElementInclude.default_loader( href, parse, encoding=None) - :module: Default loader. This default loader reads an included resource from disk. *href* is a URL. *parse* is for parse mode either "xml" or "text". *encoding* @@ -820,7 +844,6 @@ Functions .. function:: xml.etree.ElementInclude.include( elem, loader=None, base_url=None, \ max_depth=6) - :module: This function expands XInclude directives. *elem* is the root element. *loader* is an optional resource loader. If omitted, it defaults to :func:`default_loader`. diff --git a/Doc/library/xml.sax.handler.rst b/Doc/library/xml.sax.handler.rst index c7831ce3..59d0d1b3 100644 --- a/Doc/library/xml.sax.handler.rst +++ b/Doc/library/xml.sax.handler.rst @@ -11,12 +11,12 @@ -------------- -The SAX API defines four kinds of handlers: content handlers, DTD handlers, -error handlers, and entity resolvers. Applications normally only need to -implement those interfaces whose events they are interested in; they can -implement the interfaces in a single object or in multiple objects. Handler -implementations should inherit from the base classes provided in the module -:mod:`xml.sax.handler`, so that all methods get default implementations. +The SAX API defines five kinds of handlers: content handlers, DTD handlers, +error handlers, entity resolvers and lexical handlers. Applications normally +only need to implement those interfaces whose events they are interested in; +they can implement the interfaces in a single object or in multiple objects. +Handler implementations should inherit from the base classes provided in the +module :mod:`xml.sax.handler`, so that all methods get default implementations. .. class:: ContentHandler @@ -47,6 +47,12 @@ implementations should inherit from the base classes provided in the module application. The methods of this object control whether errors are immediately converted to exceptions or are handled in some other way. + +.. class:: LexicalHandler + + Interface used by the parser to represent low frequency events which may not + be of interest to many applications. + In addition to these classes, :mod:`xml.sax.handler` provides symbolic constants for the feature and property names. @@ -114,7 +120,7 @@ for the feature and property names. .. data:: property_lexical_handler | value: ``"http://xml.org/sax/properties/lexical-handler"`` - | data type: xml.sax.sax2lib.LexicalHandler (not supported in Python 2) + | data type: xml.sax.handler.LexicalHandler (not supported in Python 2) | description: An optional extension handler for lexical events like comments. | access: read/write @@ -141,7 +147,7 @@ for the feature and property names. .. data:: property_xml_string | value: ``"http://xml.org/sax/properties/xml-string"`` - | data type: Bytes + | data type: String | description: The literal string of characters that was the source for the current event. | access: read-only @@ -413,3 +419,45 @@ the passed-in exception object. information will continue to be passed to the application. Raising an exception in this method will cause parsing to end. + +.. _lexical-handler-objects: + +LexicalHandler Objects +---------------------- +Optional SAX2 handler for lexical events. + +This handler is used to obtain lexical information about an XML +document. Lexical information includes information describing the +document encoding used and XML comments embedded in the document, as +well as section boundaries for the DTD and for any CDATA sections. +The lexical handlers are used in the same manner as content handlers. + +Set the LexicalHandler of an XMLReader by using the setProperty method +with the property identifier +``'http://xml.org/sax/properties/lexical-handler'``. + + +.. method:: LexicalHandler.comment(content) + + Reports a comment anywhere in the document (including the DTD and + outside the document element). + +.. method:: LexicalHandler.startDTD(name, public_id, system_id) + + Reports the start of the DTD declarations if the document has an + associated DTD. + +.. method:: LexicalHandler.endDTD() + + Reports the end of DTD declaration. + +.. method:: LexicalHandler.startCDATA() + + Reports the start of a CDATA marked section. + + The contents of the CDATA marked section will be reported through + the characters handler. + +.. method:: LexicalHandler.endCDATA() + + Reports the end of a CDATA marked section. diff --git a/Doc/library/xmlrpc.client.rst b/Doc/library/xmlrpc.client.rst index 30c5a710..51279b35 100644 --- a/Doc/library/xmlrpc.client.rst +++ b/Doc/library/xmlrpc.client.rst @@ -169,6 +169,12 @@ between conformable Python objects and XML on the wire. `XML-RPC Specification `_ The official specification. + `Unofficial XML-RPC Errata `_ + Fredrik Lundh's "unofficial errata, intended to clarify certain + details in the XML-RPC specification, as well as hint at + 'best practices' to use when designing your own XML-RPC + implementations." + .. _serverproxy-objects: ServerProxy Objects @@ -372,7 +378,7 @@ Fault Objects .. attribute:: faultCode - A string indicating the fault type. + An int indicating the fault type. .. attribute:: faultString diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index de508cad..43520b69 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -289,7 +289,7 @@ ZipFile Objects compressed text files in :term:`universal newlines` mode. .. versionchanged:: 3.6 - :meth:`ZipFile.open` can now be used to write files into the archive with the + :meth:`open` can now be used to write files into the archive with the ``mode='w'`` option. .. versionchanged:: 3.6 @@ -487,7 +487,7 @@ Path Objects Path objects expose the following features of :mod:`pathlib.Path` objects: -Path objects are traversable using the ``/`` operator. +Path objects are traversable using the ``/`` operator or ``joinpath``. .. attribute:: Path.name @@ -536,6 +536,19 @@ Path objects are traversable using the ``/`` operator. Read the current file as bytes. +.. method:: Path.joinpath(*other) + + Return a new Path object with each of the *other* arguments + joined. The following are equivalent:: + + >>> Path(...).joinpath('child').joinpath('grandchild') + >>> Path(...).joinpath('child', 'grandchild') + >>> Path(...) / 'child' / 'grandchild' + + .. versionchanged:: 3.10 + Prior to 3.10, ``joinpath`` was undocumented and accepted + exactly one parameter. + .. _pyzipfile-objects: diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index a3a24ec3..cd7030fe 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -23,8 +23,8 @@ and a path within the archive can be specified to only import from a subdirectory. For example, the path :file:`example.zip/lib/` would only import from the :file:`lib/` subdirectory within the archive. -Any files may be present in the ZIP archive, but importers are only invoked for -:file:`.py` and :file:`.pyc` files. ZIP import of dynamic modules +Any files may be present in the ZIP archive, but only files :file:`.py` and +:file:`.pyc` are available for import. ZIP import of dynamic modules (:file:`.pyd`, :file:`.so`) is disallowed. Note that if an archive only contains :file:`.py` files, Python will not attempt to modify the archive by adding the corresponding :file:`.pyc` file, meaning that if a ZIP archive @@ -44,8 +44,9 @@ doesn't contain :file:`.pyc` files, importing may be rather slow. follows the specification in :pep:`273`, but uses an implementation written by Just van Rossum that uses the import hooks described in :pep:`302`. - :pep:`302` - New Import Hooks - The PEP to add the import hooks that help this module work. + :mod:`importlib` - The implementation of the import machinery + Package providing the relevant protocols for all importers to + implement. This module defines an exception: @@ -73,7 +74,31 @@ zipimporter Objects :exc:`ZipImportError` is raised if *archivepath* doesn't point to a valid ZIP archive. - .. method:: find_module(fullname[, path]) + .. method:: create_module(spec) + + Implementation of :meth:`importlib.abc.Loader.create_module` that returns + :const:`None` to explicitly request the default semantics. + + .. versionadded:: 3.10 + + + .. method:: exec_module(module) + + Implementation of :meth:`importlib.abc.Loader.exec_module`. + + .. versionadded:: 3.10 + + + .. method:: find_loader(fullname, path=None) + + An implementation of :meth:`importlib.abc.PathEntryFinder.find_loader`. + + .. deprecated:: 3.10 + + Use :meth:`find_spec` instead. + + + .. method:: find_module(fullname, path=None) Search for a module specified by *fullname*. *fullname* must be the fully qualified (dotted) module name. It returns the zipimporter instance itself @@ -81,11 +106,22 @@ zipimporter Objects *path* argument is ignored---it's there for compatibility with the importer protocol. + .. deprecated:: 3.10 + + Use :meth:`find_spec` instead. + + + .. method:: find_spec(fullname, target=None) + + An implementation of :meth:`importlib.abc.PathEntryFinder.find_spec`. + + .. versionadded:: 3.10 + .. method:: get_code(fullname) Return the code object for the specified module. Raise - :exc:`ZipImportError` if the module couldn't be found. + :exc:`ZipImportError` if the module couldn't be imported. .. method:: get_data(pathname) @@ -101,7 +137,7 @@ zipimporter Objects Return the value ``__file__`` would be set to if the specified module was imported. Raise :exc:`ZipImportError` if the module couldn't be - found. + imported. .. versionadded:: 3.1 @@ -123,8 +159,20 @@ zipimporter Objects .. method:: load_module(fullname) Load the module specified by *fullname*. *fullname* must be the fully - qualified (dotted) module name. It returns the imported module, or raises - :exc:`ZipImportError` if it wasn't found. + qualified (dotted) module name. Returns the imported module on success, + raises :exc:`ZipImportError` on failure. + + .. deprecated:: 3.10 + + Use :meth:`exec_module` instead. + + + .. method:: invalidate_caches() + + Clear out the internal cache of information about files found within + the ZIP archive. + + .. versionadded:: 3.10 .. attribute:: archive diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst index 6758c615..ec60ea24 100644 --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -42,9 +42,10 @@ The available exception and functions in this module are: for use as a general hash algorithm. .. versionchanged:: 3.0 - The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``adler32(data) & 0xffffffff``. + Always returns an unsigned value. + To generate the same numeric value across all Python versions and + platforms, use ``adler32(data) & 0xffffffff``. + .. function:: compress(data, /, level=-1) @@ -126,9 +127,10 @@ The available exception and functions in this module are: for use as a general hash algorithm. .. versionchanged:: 3.0 - The result is always unsigned. - To generate the same numeric value when using Python 2 or earlier, - use ``crc32(data) & 0xffffffff``. + Always returns an unsigned value. + To generate the same numeric value across all Python versions and + platforms, use ``crc32(data) & 0xffffffff``. + .. function:: decompress(data, /, wbits=MAX_WBITS, bufsize=DEF_BUF_SIZE) diff --git a/Doc/library/zoneinfo.rst b/Doc/library/zoneinfo.rst index 3a4c12a7..1b2ba2af 100644 --- a/Doc/library/zoneinfo.rst +++ b/Doc/library/zoneinfo.rst @@ -124,8 +124,9 @@ time zone database (except on Windows, where there are no "well-known" locations for time zone data). On POSIX systems, downstream distributors and those building Python from source who know where their system time zone data is deployed may change the default time zone path by specifying -the compile-time option ``TZPATH`` (or, more likely, the ``configure`` flag -``--with-tzpath``), which should be a string delimited by :data:`os.pathsep`. +the compile-time option ``TZPATH`` (or, more likely, the :option:`configure +flag --with-tzpath <--with-tzpath>`), which should be a string delimited by +:data:`os.pathsep`. On all platforms, the configured value is available as the ``TZPATH`` key in :func:`sysconfig.get_config_var`. diff --git a/Doc/license.rst b/Doc/license.rst index 842cf03a..cd03411d 100644 --- a/Doc/license.rst +++ b/Doc/license.rst @@ -100,7 +100,7 @@ PSF LICENSE AGREEMENT FOR PYTHON |release| analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python |release| alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2022 Python Software Foundation; All Rights + copyright, i.e., "Copyright © 2001-2021 Python Software Foundation; All Rights Reserved" are retained in Python |release| alone or in any derivative version prepared by Licensee. @@ -203,9 +203,9 @@ CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with Python 1.6.1 may be located on the - Internet using the following unique, persistent identifier (known as a handle): + internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This Agreement may also be obtained from a proxy server on the - Internet using the following URL: http://hdl.handle.net/1895.22/1013." + internet using the following URL: http://hdl.handle.net/1895.22/1013." 3. In the event Licensee prepares a derivative work that is based on or incorporates Python 1.6.1 or any part thereof, and wants to make the derivative diff --git a/Doc/make.bat b/Doc/make.bat index 93de1d8f..d621bd16 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -13,7 +13,7 @@ if not defined SPHINXBUILD ( %PYTHON% -c "import sphinx" > nul 2> nul if errorlevel 1 ( echo Installing sphinx with %PYTHON% - %PYTHON% -m pip install -r requirements.txt + %PYTHON% -m pip install sphinx==2.2.0 if errorlevel 1 exit /B ) set SPHINXBUILD=%PYTHON% -c "import sphinx.cmd.build, sys; sys.exit(sphinx.cmd.build.main())" @@ -30,7 +30,6 @@ if not defined BLURB ( %PYTHON% -c "import blurb" > nul 2> nul if errorlevel 1 ( echo Installing blurb with %PYTHON% - rem Should have been installed with Sphinx earlier %PYTHON% -m pip install blurb if errorlevel 1 exit /B ) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 493fd707..41719be3 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -51,6 +51,7 @@ Summarizing: : | `for_stmt` : | `try_stmt` : | `with_stmt` + : | `match_stmt` : | `funcdef` : | `classdef` : | `async_with_stmt` @@ -253,10 +254,9 @@ is found that matches the exception. An expression-less except clause, if present, must be last; it matches any exception. For an except clause with an expression, that expression is evaluated, and the clause matches the exception if the resulting object is "compatible" with the exception. An object is -compatible with an exception if the object is the class or a -:term:`non-virtual base class ` of the exception object, -or a tuple containing an item that is the class or a non-virtual base class -of the exception object. +compatible with an exception if it is the class or a base class of the exception +object, or a tuple containing an item that is the class or a base class of +the exception object. If no except clause matches the exception, the search for an exception handler continues in the surrounding code and on the invocation stack. [#]_ @@ -303,9 +303,27 @@ Before an except clause's suite is executed, details about the exception are stored in the :mod:`sys` module and can be accessed via :func:`sys.exc_info`. :func:`sys.exc_info` returns a 3-tuple consisting of the exception class, the exception instance and a traceback object (see section :ref:`types`) identifying -the point in the program where the exception occurred. :func:`sys.exc_info` -values are restored to their previous values (before the call) when returning -from a function that handled an exception. +the point in the program where the exception occurred. The details about the +exception accessed via :func:`sys.exc_info` are restored to their previous values +when leaving an exception handler:: + + >>> print(sys.exc_info()) + (None, None, None) + >>> try: + ... raise TypeError + ... except: + ... print(sys.exc_info()) + ... try: + ... raise ValueError + ... except: + ... print(sys.exc_info()) + ... print(sys.exc_info()) + ... + (, TypeError(), ) + (, ValueError(), ) + (, TypeError(), ) + >>> print(sys.exc_info()) + (None, None, None) .. index:: keyword: else @@ -394,7 +412,8 @@ This allows common :keyword:`try`...\ :keyword:`except`...\ :keyword:`finally` usage patterns to be encapsulated for convenient reuse. .. productionlist:: python-grammar - with_stmt: "with" `with_item` ("," `with_item`)* ":" `suite` + with_stmt: "with" ( "(" `with_stmt_contents` ","? ")" | `with_stmt_contents` ) ":" `suite` + with_stmt_contents: `with_item` ("," `with_item`)* with_item: `expression` ["as" `target`] The execution of the :keyword:`with` statement with one "item" proceeds as follows: @@ -471,15 +490,626 @@ is semantically equivalent to:: with B() as b: SUITE +You can also write multi-item context managers in multiple lines if +the items are surrounded by parentheses. For example:: + + with ( + A() as a, + B() as b, + ): + SUITE + .. versionchanged:: 3.1 Support for multiple context expressions. +.. versionchanged:: 3.10 + Support for using grouping parentheses to break the statement in multiple lines. + .. seealso:: :pep:`343` - The "with" statement The specification, background, and examples for the Python :keyword:`with` statement. +.. _match: + +The :keyword:`!match` statement +=============================== + +.. index:: + ! statement: match + ! keyword: case + ! single: pattern matching + keyword: if + keyword: as + pair: match; case + single: : (colon); compound statement + +.. versionadded:: 3.10 + +The match statement is used for pattern matching. Syntax: + +.. productionlist:: python-grammar + match_stmt: 'match' `subject_expr` ":" NEWLINE INDENT `case_block`+ DEDENT + subject_expr: `star_named_expression` "," `star_named_expressions`? + : | `named_expression` + case_block: 'case' `patterns` [`guard`] ":" `block` + +.. note:: + This section uses single quotes to denote + :ref:`soft keywords `. + +Pattern matching takes a pattern as input (following ``case``) and a subject +value (following ``match``). The pattern (which may contain subpatterns) is +matched against the subject value. The outcomes are: + +* A match success or failure (also termed a pattern success or failure). + +* Possible binding of matched values to a name. The prerequisites for this are + further discussed below. + +The ``match`` and ``case`` keywords are :ref:`soft keywords `. + +.. seealso:: + + * :pep:`634` -- Structural Pattern Matching: Specification + * :pep:`636` -- Structural Pattern Matching: Tutorial + + +Overview +-------- + +Here's an overview of the logical flow of a match statement: + + +#. The subject expression ``subject_expr`` is evaluated and a resulting subject + value obtained. If the subject expression contains a comma, a tuple is + constructed using :ref:`the standard rules `. + +#. Each pattern in a ``case_block`` is attempted to match with the subject value. The + specific rules for success or failure are described below. The match attempt can also + bind some or all of the standalone names within the pattern. The precise + pattern binding rules vary per pattern type and are + specified below. **Name bindings made during a successful pattern match + outlive the executed block and can be used after the match statement**. + + .. note:: + + During failed pattern matches, some subpatterns may succeed. Do not + rely on bindings being made for a failed match. Conversely, do not + rely on variables remaining unchanged after a failed match. The exact + behavior is dependent on implementation and may vary. This is an + intentional decision made to allow different implementations to add + optimizations. + +#. If the pattern succeeds, the corresponding guard (if present) is evaluated. In + this case all name bindings are guaranteed to have happened. + + * If the guard evaluates as true or is missing, the ``block`` inside + ``case_block`` is executed. + + * Otherwise, the next ``case_block`` is attempted as described above. + + * If there are no further case blocks, the match statement is completed. + +.. note:: + + Users should generally never rely on a pattern being evaluated. Depending on + implementation, the interpreter may cache values or use other optimizations + which skip repeated evaluations. + +A sample match statement:: + + >>> flag = False + >>> match (100, 200): + ... case (100, 300): # Mismatch: 200 != 300 + ... print('Case 1') + ... case (100, 200) if flag: # Successful match, but guard fails + ... print('Case 2') + ... case (100, y): # Matches and binds y to 200 + ... print(f'Case 3, y: {y}') + ... case _: # Pattern not attempted + ... print('Case 4, I match anything!') + ... + Case 3, y: 200 + + +In this case, ``if flag`` is a guard. Read more about that in the next section. + +Guards +------ + +.. index:: ! guard + +.. productionlist:: python-grammar + guard: "if" `named_expression` + +A ``guard`` (which is part of the ``case``) must succeed for code inside +the ``case`` block to execute. It takes the form: :keyword:`if` followed by an +expression. + + +The logical flow of a ``case`` block with a ``guard`` follows: + +#. Check that the pattern in the ``case`` block succeeded. If the pattern + failed, the ``guard`` is not evaluated and the next ``case`` block is + checked. + +#. If the pattern succeeded, evaluate the ``guard``. + + * If the ``guard`` condition evaluates as true, the case block is + selected. + + * If the ``guard`` condition evaluates as false, the case block is not + selected. + + * If the ``guard`` raises an exception during evaluation, the exception + bubbles up. + +Guards are allowed to have side effects as they are expressions. Guard +evaluation must proceed from the first to the last case block, one at a time, +skipping case blocks whose pattern(s) don't all succeed. (I.e., +guard evaluation must happen in order.) Guard evaluation must stop once a case +block is selected. + + +.. _irrefutable_case: + +Irrefutable Case Blocks +----------------------- + +.. index:: irrefutable case block, case block + +An irrefutable case block is a match-all case block. A match statement may have +at most one irrefutable case block, and it must be last. + +A case block is considered irrefutable if it has no guard and its pattern is +irrefutable. A pattern is considered irrefutable if we can prove from its +syntax alone that it will always succeed. Only the following patterns are +irrefutable: + +* :ref:`as-patterns` whose left-hand side is irrefutable + +* :ref:`or-patterns` containing at least one irrefutable pattern + +* :ref:`capture-patterns` + +* :ref:`wildcard-patterns` + +* parenthesized irrefutable patterns + + +Patterns +-------- + +.. index:: + single: ! patterns + single: AS pattern, OR pattern, capture pattern, wildcard pattern + +.. note:: + This section uses grammar notations beyond standard EBNF: + + * the notation ``SEP.RULE+`` is shorthand for ``RULE (SEP RULE)*`` + + * the notation ``!RULE`` is shorthand for a negative lookahead assertion + + +The top-level syntax for ``patterns`` is: + +.. productionlist:: python-grammar + patterns: `open_sequence_pattern` | `pattern` + pattern: `as_pattern` | `or_pattern` + closed_pattern: | `literal_pattern` + : | `capture_pattern` + : | `wildcard_pattern` + : | `value_pattern` + : | `group_pattern` + : | `sequence_pattern` + : | `mapping_pattern` + : | `class_pattern` + +The descriptions below will include a description "in simple terms" of what a pattern +does for illustration purposes (credits to Raymond Hettinger for a document that +inspired most of the descriptions). Note that these descriptions are purely for +illustration purposes and **may not** reflect +the underlying implementation. Furthermore, they do not cover all valid forms. + + +.. _or-patterns: + +OR Patterns +^^^^^^^^^^^ + +An OR pattern is two or more patterns separated by vertical +bars ``|``. Syntax: + +.. productionlist:: python-grammar + or_pattern: "|".`closed_pattern`+ + +Only the final subpattern may be :ref:`irrefutable `, and each +subpattern must bind the same set of names to avoid ambiguity. + +An OR pattern matches each of its subpatterns in turn to the subject value, +until one succeeds. The OR pattern is then considered successful. Otherwise, +if none of the subpatterns succeed, the OR pattern fails. + +In simple terms, ``P1 | P2 | ...`` will try to match ``P1``, if it fails it will try to +match ``P2``, succeeding immediately if any succeeds, failing otherwise. + +.. _as-patterns: + +AS Patterns +^^^^^^^^^^^ + +An AS pattern matches an OR pattern on the left of the :keyword:`as` +keyword against a subject. Syntax: + +.. productionlist:: python-grammar + as_pattern: `or_pattern` "as" `capture_pattern` + +If the OR pattern fails, the AS pattern fails. Otherwise, the AS pattern binds +the subject to the name on the right of the as keyword and succeeds. +``capture_pattern`` cannot be a a ``_``. + +In simple terms ``P as NAME`` will match with ``P``, and on success it will +set ``NAME = ``. + + +.. _literal-patterns: + +Literal Patterns +^^^^^^^^^^^^^^^^ + +A literal pattern corresponds to most +:ref:`literals ` in Python. Syntax: + +.. productionlist:: python-grammar + literal_pattern: `signed_number` + : | `signed_number` "+" NUMBER + : | `signed_number` "-" NUMBER + : | `strings` + : | "None" + : | "True" + : | "False" + : | `signed_number`: NUMBER | "-" NUMBER + +The rule ``strings`` and the token ``NUMBER`` are defined in the +:doc:`standard Python grammar <./grammar>`. Triple-quoted strings are +supported. Raw strings and byte strings are supported. :ref:`f-strings` are +not supported. + +The forms ``signed_number '+' NUMBER`` and ``signed_number '-' NUMBER`` are +for expressing :ref:`complex numbers `; they require a real number +on the left and an imaginary number on the right. E.g. ``3 + 4j``. + +In simple terms, ``LITERAL`` will succeed only if `` == LITERAL``. For +the singletons ``None``, ``True`` and ``False``, the :keyword:`is` operator is used. + +.. _capture-patterns: + +Capture Patterns +^^^^^^^^^^^^^^^^ + +A capture pattern binds the subject value to a name. +Syntax: + +.. productionlist:: python-grammar + capture_pattern: !'_' NAME + +A single underscore ``_`` is not a capture pattern (this is what ``!'_'`` +expresses). It is instead treated as a :token:`wildcard_pattern`. + +In a given pattern, a given name can only be bound once. E.g. +``case x, x: ...`` is invalid while ``case [x] | x: ...`` is allowed. + +Capture patterns always succeed. The binding follows scoping rules +established by the assignment expression operator in :pep:`572`; the +name becomes a local variable in the closest containing function scope unless +there's an applicable :keyword:`global` or :keyword:`nonlocal` statement. + +In simple terms ``NAME`` will always succeed and it will set ``NAME = ``. + +.. _wildcard-patterns: + +Wildcard Patterns +^^^^^^^^^^^^^^^^^ + +A wildcard pattern always succeeds (matches anything) +and binds no name. Syntax: + +.. productionlist:: python-grammar + wildcard_pattern: '_' + +``_`` is a :ref:`soft keyword ` within any pattern, +but only within patterns. It is an identifier, as usual, even within +``match`` subject expressions, ``guard``\ s, and ``case`` blocks. + +In simple terms, ``_`` will always succeed. + +.. _value-patterns: + +Value Patterns +^^^^^^^^^^^^^^ + +A value pattern represents a named value in Python. +Syntax: + +.. productionlist:: python-grammar + value_pattern: `attr` + attr: `name_or_attr` "." NAME + name_or_attr: `attr` | NAME + +The dotted name in the pattern is looked up using standard Python +:ref:`name resolution rules `. The pattern succeeds if the +value found compares equal to the subject value (using the ``==`` equality +operator). + +In simple terms ``NAME1.NAME2`` will succeed only if `` == NAME1.NAME2`` + +.. note:: + + If the same value occurs multiple times in the same match statement, the + interpreter may cache the first value found and reuse it rather than repeat + the same lookup. This cache is strictly tied to a given execution of a + given match statement. + +.. _group-patterns: + +Group Patterns +^^^^^^^^^^^^^^ + +A group pattern allows users to add parentheses around patterns to +emphasize the intended grouping. Otherwise, it has no additional syntax. +Syntax: + +.. productionlist:: python-grammar + group_pattern: "(" `pattern` ")" + +In simple terms ``(P)`` has the same effect as ``P``. + +.. _sequence-patterns: + +Sequence Patterns +^^^^^^^^^^^^^^^^^ + +A sequence pattern contains several subpatterns to be matched against sequence elements. +The syntax is similar to the unpacking of a list or tuple. + +.. productionlist:: python-grammar + sequence_pattern: "[" [`maybe_sequence_pattern`] "]" + : | "(" [`open_sequence_pattern`] ")" + open_sequence_pattern: `maybe_star_pattern` "," [`maybe_sequence_pattern`] + maybe_sequence_pattern: ",".`maybe_star_pattern`+ ","? + maybe_star_pattern: `star_pattern` | `pattern` + star_pattern: "*" (`capture_pattern` | `wildcard_pattern`) + +There is no difference if parentheses or square brackets +are used for sequence patterns (i.e. ``(...)`` vs ``[...]`` ). + +.. note:: + A single pattern enclosed in parentheses without a trailing comma + (e.g. ``(3 | 4)``) is a :ref:`group pattern `. + While a single pattern enclosed in square brackets (e.g. ``[3 | 4]``) is + still a sequence pattern. + +At most one star subpattern may be in a sequence pattern. The star subpattern +may occur in any position. If no star subpattern is present, the sequence +pattern is a fixed-length sequence pattern; otherwise it is a variable-length +sequence pattern. + +The following is the logical flow for matching a sequence pattern against a +subject value: + +#. If the subject value is not a sequence [#]_, the sequence pattern + fails. + +#. If the subject value is an instance of ``str``, ``bytes`` or ``bytearray`` + the sequence pattern fails. + +#. The subsequent steps depend on whether the sequence pattern is fixed or + variable-length. + + If the sequence pattern is fixed-length: + + #. If the length of the subject sequence is not equal to the number of + subpatterns, the sequence pattern fails + + #. Subpatterns in the sequence pattern are matched to their corresponding + items in the subject sequence from left to right. Matching stops as soon + as a subpattern fails. If all subpatterns succeed in matching their + corresponding item, the sequence pattern succeeds. + + Otherwise, if the sequence pattern is variable-length: + + #. If the length of the subject sequence is less than the number of non-star + subpatterns, the sequence pattern fails. + + #. The leading non-star subpatterns are matched to their corresponding items + as for fixed-length sequences. + + #. If the previous step succeeds, the star subpattern matches a list formed + of the remaining subject items, excluding the remaining items + corresponding to non-star subpatterns following the star subpattern. + + #. Remaining non-star subpatterns are matched to their corresponding subject + items, as for a fixed-length sequence. + + .. note:: The length of the subject sequence is obtained via + :func:`len` (i.e. via the :meth:`__len__` protocol). This length may be + cached by the interpreter in a similar manner as + :ref:`value patterns `. + + +In simple terms ``[P1, P2, P3,`` ... ``, P]`` matches only if all the following +happens: + +* check ```` is a sequence +* ``len(subject) == `` +* ``P1`` matches ``[0]`` (note that this match can also bind names) +* ``P2`` matches ``[1]`` (note that this match can also bind names) +* ... and so on for the corresponding pattern/element. + +.. _mapping-patterns: + +Mapping Patterns +^^^^^^^^^^^^^^^^ + +A mapping pattern contains one or more key-value patterns. The syntax is +similar to the construction of a dictionary. +Syntax: + +.. productionlist:: python-grammar + mapping_pattern: "{" [`items_pattern`] "}" + items_pattern: ",".`key_value_pattern`+ ","? + key_value_pattern: (`literal_pattern` | `value_pattern`) ":" `pattern` + : | `double_star_pattern` + double_star_pattern: "**" `capture_pattern` + +At most one double star pattern may be in a mapping pattern. The double star +pattern must be the last subpattern in the mapping pattern. + +Duplicate keys in mapping patterns are disallowed. Duplicate literal keys will +raise a :exc:`SyntaxError`. Two keys that otherwise have the same value will +raise a :exc:`ValueError` at runtime. + +The following is the logical flow for matching a mapping pattern against a +subject value: + +#. If the subject value is not a mapping [#]_,the mapping pattern fails. + +#. If every key given in the mapping pattern is present in the subject mapping, + and the pattern for each key matches the corresponding item of the subject + mapping, the mapping pattern succeeds. + +#. If duplicate keys are detected in the mapping pattern, the pattern is + considered invalid. A :exc:`SyntaxError` is raised for duplicate literal + values; or a :exc:`ValueError` for named keys of the same value. + +.. note:: Key-value pairs are matched using the two-argument form of the mapping + subject's ``get()`` method. Matched key-value pairs must already be present + in the mapping, and not created on-the-fly via :meth:`__missing__` or + :meth:`__getitem__`. + +In simple terms ``{KEY1: P1, KEY2: P2, ... }`` matches only if all the following +happens: + +* check ```` is a mapping +* ``KEY1 in `` +* ``P1`` matches ``[KEY1]`` +* ... and so on for the corresponding KEY/pattern pair. + + +.. _class-patterns: + +Class Patterns +^^^^^^^^^^^^^^ + +A class pattern represents a class and its positional and keyword arguments +(if any). Syntax: + +.. productionlist:: python-grammar + class_pattern: `name_or_attr` "(" [`pattern_arguments` ","?] ")" + pattern_arguments: `positional_patterns` ["," `keyword_patterns`] + : | `keyword_patterns` + positional_patterns: ",".`pattern`+ + keyword_patterns: ",".`keyword_pattern`+ + keyword_pattern: NAME "=" `pattern` + +The same keyword should not be repeated in class patterns. + +The following is the logical flow for matching a mapping pattern against a +subject value: + +#. If ``name_or_attr`` is not an instance of the builtin :class:`type` , raise + :exc:`TypeError`. + +#. If the subject value is not an instance of ``name_or_attr`` (tested via + :func:`isinstance`), the class pattern fails. + +#. If no pattern arguments are present, the pattern succeeds. Otherwise, + the subsequent steps depend on whether keyword or positional argument patterns + are present. + + For a number of built-in types (specified below), a single positional + subpattern is accepted which will match the entire subject; for these types + keyword patterns also work as for other types. + + If only keyword patterns are present, they are processed as follows, + one by one: + + I. The keyword is looked up as an attribute on the subject. + + * If this raises an exception other than :exc:`AttributeError`, the + exception bubbles up. + + * If this raises :exc:`AttributeError`, the class pattern has failed. + + * Else, the subpattern associated with the keyword pattern is matched + against the subject's attribute value. If this fails, the class + pattern fails; if this succeeds, the match proceeds to the next keyword. + + + II. If all keyword patterns succeed, the class pattern succeeds. + + If any positional patterns are present, they are converted to keyword + patterns using the :data:`~object.__match_args__` attribute on the class + ``name_or_attr`` before matching: + + I. The equivalent of ``getattr(cls, "__match_args__", ())`` is called. + + * If this raises an exception, the exception bubbles up. + + * If the returned value is not a tuple, the conversion fails and + :exc:`TypeError` is raised. + + * If there are more positional patterns than ``len(cls.__match_args__)``, + :exc:`TypeError` is raised. + + * Otherwise, positional pattern ``i`` is converted to a keyword pattern + using ``__match_args__[i]`` as the keyword. ``__match_args__[i]`` must + be a string; if not :exc:`TypeError` is raised. + + * If there are duplicate keywords, :exc:`TypeError` is raised. + + .. seealso:: :ref:`class-pattern-matching` + + II. Once all positional patterns have been converted to keyword patterns, + the match proceeds as if there were only keyword patterns. + + For the following built-in types the handling of positional subpatterns is + different: + + * :class:`bool` + * :class:`bytearray` + * :class:`bytes` + * :class:`dict` + * :class:`float` + * :class:`frozenset` + * :class:`int` + * :class:`list` + * :class:`set` + * :class:`str` + * :class:`tuple` + + These classes accept a single positional argument, and the pattern there is matched + against the whole object rather than an attribute. For example ``int(0|1)`` matches + the value ``0``, but not the values ``0.0`` or ``False``. + +In simple terms ``CLS(P1, attr=P2)`` matches only if the following happens: + +* ``isinstance(, CLS)`` +* convert ``P1`` to a keyword pattern using ``CLS.__match_args__`` +* For each keyword argument ``attr=P2``: + * ``hasattr(, "attr")`` + * ``P2`` matches ``.attr`` +* ... and so on for the corresponding keyword argument/pattern pair. + +.. seealso:: + + * :pep:`634` -- Structural Pattern Matching: Specification + * :pep:`636` -- Structural Pattern Matching: Tutorial + + .. index:: single: parameter; function definition @@ -572,9 +1202,9 @@ value --- this is a syntactic restriction that is not expressed by the grammar. **Default parameter values are evaluated from left to right when the function definition is executed.** This means that the expression is evaluated once, when the function is defined, and that the same "pre-computed" value is used for each -call. This is especially important to understand when a default parameter is a +call. This is especially important to understand when a default parameter value is a mutable object, such as a list or a dictionary: if the function modifies the -object (e.g. by appending an item to a list), the default value is in effect +object (e.g. by appending an item to a list), the default parameter value is in effect modified. This is generally not what was intended. A way around this is to use ``None`` as the default, and explicitly test for it in the body of the function, e.g.:: @@ -778,10 +1408,8 @@ Coroutine function definition keyword: await Execution of Python coroutines can be suspended and resumed at many points -(see :term:`coroutine`). Inside the body of a coroutine function, ``await`` and -``async`` identifiers become reserved keywords; :keyword:`await` expressions, -:keyword:`async for` and :keyword:`async with` can only be used in -coroutine function bodies. +(see :term:`coroutine`). :keyword:`await` expressions, :keyword:`async for` and +:keyword:`async with` can only be used in the body of a coroutine function. Functions defined with ``async def`` syntax are always coroutine functions, even if they do not contain ``await`` or ``async`` keywords. @@ -795,6 +1423,9 @@ An example of a coroutine function:: do_stuff() await some_coroutine() +.. versionchanged:: 3.7 + ``await`` and ``async`` are now keywords; previously they were only + treated as such inside the body of a coroutine function. .. index:: statement: async for .. _`async for`: @@ -895,6 +1526,35 @@ body of a coroutine function. there is a :keyword:`finally` clause which happens to raise another exception. That new exception causes the old one to be lost. +.. [#] In pattern matching, a sequence is defined as one of the following: + + * a class that inherits from :class:`collections.abc.Sequence` + * a Python class that has been registered as :class:`collections.abc.Sequence` + * a builtin class that has its (CPython) :data:`Py_TPFLAGS_SEQUENCE` bit set + * a class that inherits from any of the above + + The following standard library classes are sequences: + + * :class:`array.array` + * :class:`collections.deque` + * :class:`list` + * :class:`memoryview` + * :class:`range` + * :class:`tuple` + + .. note:: Subject values of type ``str``, ``bytes``, and ``bytearray`` + do not match sequence patterns. + +.. [#] In pattern matching, a mapping is defined as one of the following: + + * a class that inherits from :class:`collections.abc.Mapping` + * a Python class that has been registered as :class:`collections.abc.Mapping` + * a builtin class that has its (CPython) :data:`Py_TPFLAGS_MAPPING` bit set + * a class that inherits from any of the above + + The standard library classes :class:`dict` and :class:`types.MappingProxyType` + are mappings. + .. [#] A string literal appearing as the first statement in the function body is transformed into the function's ``__doc__`` attribute and therefore the function's :term:`docstring`. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 033d65fd..310167e8 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -188,7 +188,7 @@ Ellipsis representation in computers. The string representations of the numeric classes, computed by - :meth:`~object.__repr__` and :meth:`~object.__str__`, have the following + :meth:`__repr__` and :meth:`__str__`, have the following properties: * They are valid numeric literals which, when passed to their @@ -553,7 +553,10 @@ Callable types | | the dict are the parameter | | | | names, and ``'return'`` for | | | | the return annotation, if | | - | | provided. | | + | | provided. For more | | + | | information on working with | | + | | this attribute, see | | + | | :ref:`annotations-howto`. | | +-------------------------+-------------------------------+-----------+ | :attr:`__kwdefaults__` | A dict containing defaults | Writable | | | for keyword-only parameters. | | @@ -674,8 +677,7 @@ Callable types returns an asynchronous iterator object which can be used in an :keyword:`async for` statement to execute the body of the function. - Calling the asynchronous iterator's - :meth:`aiterator.__anext__ ` method + Calling the asynchronous iterator's :meth:`aiterator.__anext__` method will return an :term:`awaitable` which when awaited will execute until it provides a value using the :keyword:`yield` expression. When the function executes an empty :keyword:`return` @@ -713,13 +715,13 @@ Callable types Classes Classes are callable. These objects normally act as factories for new instances of themselves, but variations are possible for class types that - override :meth:`~object.__new__`. The arguments of the call are passed to - :meth:`__new__` and, in the typical case, to :meth:`~object.__init__` to + override :meth:`__new__`. The arguments of the call are passed to + :meth:`__new__` and, in the typical case, to :meth:`__init__` to initialize the new instance. Class Instances Instances of arbitrary classes can be made callable by defining a - :meth:`~object.__call__` method in their class. + :meth:`__call__` method in their class. Modules @@ -749,16 +751,29 @@ Modules single: __annotations__ (module attribute) pair: module; namespace - Predefined (writable) attributes: :attr:`__name__` is the module's name; - :attr:`__doc__` is the module's documentation string, or ``None`` if - unavailable; :attr:`__annotations__` (optional) is a dictionary containing - :term:`variable annotations ` collected during module - body execution; :attr:`__file__` is the pathname of the file from which the - module was loaded, if it was loaded from a file. The :attr:`__file__` - attribute may be missing for certain types of modules, such as C modules - that are statically linked into the interpreter; for extension modules - loaded dynamically from a shared library, it is the pathname of the shared - library file. + Predefined (writable) attributes: + + :attr:`__name__` + The module's name. + + :attr:`__doc__` + The module's documentation string, or ``None`` if + unavailable. + + :attr:`__file__` + The pathname of the file from which the + module was loaded, if it was loaded from a file. + The :attr:`__file__` + attribute may be missing for certain types of modules, such as C modules + that are statically linked into the interpreter. For extension modules + loaded dynamically from a shared library, it's the pathname of the shared + library file. + + :attr:`__annotations__` + A dictionary containing + :term:`variable annotations ` collected during + module body execution. For best practices on working + with :attr:`__annotations__`, please see :ref:`annotations-howto`. .. index:: single: __dict__ (module attribute) @@ -822,14 +837,30 @@ Custom classes single: __doc__ (class attribute) single: __annotations__ (class attribute) - Special attributes: :attr:`~definition.__name__` is the class name; :attr:`__module__` is - the module name in which the class was defined; :attr:`~object.__dict__` is the - dictionary containing the class's namespace; :attr:`~class.__bases__` is a - tuple containing the base classes, in the order of their occurrence in the - base class list; :attr:`__doc__` is the class's documentation string, - or ``None`` if undefined; :attr:`__annotations__` (optional) is a dictionary - containing :term:`variable annotations ` collected during - class body execution. + Special attributes: + + :attr:`~definition.__name__` + The class name. + + :attr:`__module__` + The name of the module in which the class was defined. + + :attr:`~object.__dict__` + The dictionary containing the class's namespace. + + :attr:`~class.__bases__` + A tuple containing the base classes, in the order of + their occurrence in the base class list. + + :attr:`__doc__` + The class's documentation string, or ``None`` if undefined. + + :attr:`__annotations__` + A dictionary containing + :term:`variable annotations ` + collected during class body execution. For best practices on + working with :attr:`__annotations__`, please see + :ref:`annotations-howto`. Class instances .. index:: @@ -849,14 +880,14 @@ Class instances section :ref:`descriptors` for another way in which attributes of a class retrieved via its instances may differ from the objects actually stored in the class's :attr:`~object.__dict__`. If no class attribute is found, and the - object's class has a :meth:`~object.__getattr__` method, that is called to satisfy + object's class has a :meth:`__getattr__` method, that is called to satisfy the lookup. .. index:: triple: class instance; attribute; assignment Attribute assignments and deletions update the instance's dictionary, never a - class's dictionary. If the class has a :meth:`~object.__setattr__` or - :meth:`~object.__delattr__` method, this is called instead of updating the instance + class's dictionary. If the class has a :meth:`__setattr__` or + :meth:`__delattr__` method, this is called instead of updating the instance dictionary directly. .. index:: @@ -1110,8 +1141,7 @@ Internal types Slice objects .. index:: builtin: slice - Slice objects are used to represent slices for - :meth:`~object.__getitem__` + Slice objects are used to represent slices for :meth:`__getitem__` methods. They are also created by the built-in :func:`slice` function. .. index:: @@ -1140,9 +1170,8 @@ Internal types around any other object, usually a user-defined method object. When a static method object is retrieved from a class or a class instance, the object actually returned is the wrapped object, which is not subject to any further - transformation. Static method objects are not themselves callable, although the - objects they wrap usually are. Static method objects are created by the built-in - :func:`staticmethod` constructor. + transformation. Static method objects are also callable. Static method + objects are created by the built-in :func:`staticmethod` constructor. Class method objects A class method object, like a static method object, is a wrapper around another @@ -1165,8 +1194,7 @@ A class can implement certain operations that are invoked by special syntax (such as arithmetic operations or subscripting and slicing) by defining methods with special names. This is Python's approach to :dfn:`operator overloading`, allowing classes to define their own behavior with respect to language -operators. For instance, if a class defines a method named -:meth:`~object.__getitem__`, +operators. For instance, if a class defines a method named :meth:`__getitem__`, and ``x`` is an instance of this class, then ``x[i]`` is roughly equivalent to ``type(x).__getitem__(x, i)``. Except where mentioned, attempts to execute an operation raise an exception when no appropriate method is defined (typically @@ -1174,9 +1202,9 @@ operation raise an exception when no appropriate method is defined (typically Setting a special method to ``None`` indicates that the corresponding operation is not available. For example, if a class sets -:meth:`~object.__iter__` to ``None``, the class is not iterable, so calling +:meth:`__iter__` to ``None``, the class is not iterable, so calling :func:`iter` on its instances will raise a :exc:`TypeError` (without -falling back to :meth:`~object.__getitem__`). [#]_ +falling back to :meth:`__getitem__`). [#]_ When implementing a class that emulates any built-in type, it is important that the emulation only be implemented to the degree that it makes sense for the @@ -1435,7 +1463,7 @@ Basic customization Called by built-in function :func:`hash` and for operations on members of hashed collections including :class:`set`, :class:`frozenset`, and - :class:`dict`. The ``__hash__()`` method should return an integer. The only required + :class:`dict`. :meth:`__hash__` should return an integer. The only required property is that objects which compare equal have the same hash value; it is advised to mix together the hash values of the components of the object that also play a part in comparison of objects by packing them into a tuple and @@ -1711,28 +1739,6 @@ class' :attr:`~object.__dict__`. Called to delete the attribute on an instance *instance* of the owner class. -.. method:: object.__set_name__(self, owner, name) - - Called at the time the owning class *owner* is created. The - descriptor has been assigned to *name*. - - .. note:: - - :meth:`__set_name__` is only called implicitly as part of the - :class:`type` constructor, so it will need to be called explicitly with - the appropriate parameters when a descriptor is added to a class after - initial creation:: - - class A: - pass - descr = custom_descriptor() - A.attr = descr - descr.__set_name__(A, 'attr') - - See :ref:`class-object-creation` for more details. - - .. versionadded:: 3.6 - The attribute :attr:`__objclass__` is interpreted by the :mod:`inspect` module as specifying the class where this object was defined (setting this appropriately can assist in runtime introspection of dynamic class attributes). @@ -1748,8 +1754,7 @@ Invoking Descriptors In general, a descriptor is an object attribute with "binding behavior", one whose attribute access has been overridden by methods in the descriptor -protocol: :meth:`~object.__get__`, :meth:`~object.__set__`, and -:meth:`~object.__delete__`. If any of +protocol: :meth:`__get__`, :meth:`__set__`, and :meth:`__delete__`. If any of those methods are defined for an object, it is said to be a descriptor. The default behavior for attribute access is to get, set, or delete the @@ -1780,13 +1785,12 @@ Class Binding Super Binding If ``a`` is an instance of :class:`super`, then the binding ``super(B, obj).m()`` searches ``obj.__class__.__mro__`` for the base class ``A`` - immediately following ``B`` and then invokes the descriptor with the call: + immediately preceding ``B`` and then invokes the descriptor with the call: ``A.__dict__['m'].__get__(obj, obj.__class__)``. For instance bindings, the precedence of descriptor invocation depends on which descriptor methods are defined. A descriptor can define any combination -of :meth:`~object.__get__`, :meth:`~object.__set__` and -:meth:`~object.__delete__`. If it does not +of :meth:`__get__`, :meth:`__set__` and :meth:`__delete__`. If it does not define :meth:`__get__`, then accessing the attribute will return the descriptor object itself unless there is a value in the object's instance dictionary. If the descriptor defines :meth:`__set__` and/or :meth:`__delete__`, it is a data @@ -1797,8 +1801,7 @@ descriptors have just the :meth:`__get__` method. Data descriptors with instance dictionary. In contrast, non-data descriptors can be overridden by instances. -Python methods (including those decorated with -:func:`@staticmethod ` and :func:`@classmethod `) are +Python methods (including :func:`staticmethod` and :func:`classmethod`) are implemented as non-data descriptors. Accordingly, instances can redefine and override methods. This allows individual instances to acquire behaviors that differ from other instances of the same class. @@ -1813,50 +1816,46 @@ __slots__ ^^^^^^^^^ *__slots__* allow us to explicitly declare data members (like -properties) and deny the creation of :attr:`~object.__dict__` and *__weakref__* +properties) and deny the creation of *__dict__* and *__weakref__* (unless explicitly declared in *__slots__* or available in a parent.) -The space saved over using :attr:`~object.__dict__` can be significant. +The space saved over using *__dict__* can be significant. Attribute lookup speed can be significantly improved as well. .. data:: object.__slots__ This class variable can be assigned a string, iterable, or sequence of strings with variable names used by instances. *__slots__* reserves space - for the declared variables and prevents the automatic creation of - :attr:`~object.__dict__` + for the declared variables and prevents the automatic creation of *__dict__* and *__weakref__* for each instance. Notes on using *__slots__* """""""""""""""""""""""""" -* When inheriting from a class without *__slots__*, the - :attr:`~object.__dict__` and +* When inheriting from a class without *__slots__*, the *__dict__* and *__weakref__* attribute of the instances will always be accessible. -* Without a :attr:`~object.__dict__` variable, instances cannot be assigned new - variables not +* Without a *__dict__* variable, instances cannot be assigned new variables not listed in the *__slots__* definition. Attempts to assign to an unlisted variable name raises :exc:`AttributeError`. If dynamic assignment of new variables is desired, then add ``'__dict__'`` to the sequence of strings in the *__slots__* declaration. * Without a *__weakref__* variable for each instance, classes defining - *__slots__* do not support :mod:`weak references ` to its instances. - If weak reference + *__slots__* do not support weak references to its instances. If weak reference support is needed, then add ``'__weakref__'`` to the sequence of strings in the *__slots__* declaration. -* *__slots__* are implemented at the class level by creating :ref:`descriptors ` - for each variable name. As a result, class attributes +* *__slots__* are implemented at the class level by creating descriptors + (:ref:`descriptors`) for each variable name. As a result, class attributes cannot be used to set default values for instance variables defined by *__slots__*; otherwise, the class attribute would overwrite the descriptor assignment. * The action of a *__slots__* declaration is not limited to the class where it is defined. *__slots__* declared in parents are available in - child classes. However, child subclasses will get a :attr:`~object.__dict__` and + child classes. However, child subclasses will get a *__dict__* and *__weakref__* unless they also define *__slots__* (which should only contain names of any *additional* slots). @@ -1868,24 +1867,18 @@ Notes on using *__slots__* * Nonempty *__slots__* does not work for classes derived from "variable-length" built-in types such as :class:`int`, :class:`bytes` and :class:`tuple`. -* Any non-string :term:`iterable` may be assigned to *__slots__*. +* Any non-string iterable may be assigned to *__slots__*. Mappings may also be + used; however, in the future, special meaning may be assigned to the values + corresponding to each key. -* If a :class:`dictionary ` is used to assign *__slots__*, the dictionary - keys will be used as the slot names. The values of the dictionary can be used - to provide per-attribute docstrings that will be recognised by - :func:`inspect.getdoc` and displayed in the output of :func:`help`. +* *__class__* assignment works only if both classes have the same *__slots__*. -* :attr:`~instance.__class__` assignment works only if both classes have the - same *__slots__*. - -* :ref:`Multiple inheritance ` with multiple slotted parent - classes can be used, +* Multiple inheritance with multiple slotted parent classes can be used, but only one parent is allowed to have attributes created by slots (the other bases must have empty slot layouts) - violations raise :exc:`TypeError`. -* If an :term:`iterator` is used for *__slots__* then a :term:`descriptor` is - created for each +* If an iterator is used for *__slots__* then a descriptor is created for each of the iterator's values. However, the *__slots__* attribute will be an empty iterator. @@ -1894,8 +1887,8 @@ Notes on using *__slots__* Customizing class creation -------------------------- -Whenever a class inherits from another class, :meth:`~object.__init_subclass__` is -called on the parent class. This way, it is possible to write classes which +Whenever a class inherits from another class, *__init_subclass__* is +called on that class. This way, it is possible to write classes which change the behavior of subclasses. This is closely related to class decorators, but where class decorators only affect the specific class they're applied to, ``__init_subclass__`` solely applies to future subclasses of the @@ -1934,6 +1927,33 @@ class defining the method. .. versionadded:: 3.6 +When a class is created, :meth:`type.__new__` scans the class variables +and makes callbacks to those with a :meth:`__set_name__` hook. + +.. method:: object.__set_name__(self, owner, name) + + Automatically called at the time the owning class *owner* is + created. The object has been assigned to *name* in that class:: + + class A: + x = C() # Automatically calls: x.__set_name__(A, 'x') + + If the class variable is assigned after the class is created, + :meth:`__set_name__` will not be called automatically. + If needed, :meth:`__set_name__` can be called directly:: + + class A: + pass + + c = C() + A.x = c # The hook is not called + c.__set_name__(A, 'x') # Manually invoke the hook + + See :ref:`class-object-creation` for more details. + + .. versionadded:: 3.6 + + .. _metaclasses: Metaclasses @@ -2020,8 +2040,7 @@ Once the appropriate metaclass has been identified, then the class namespace is prepared. If the metaclass has a ``__prepare__`` attribute, it is called as ``namespace = metaclass.__prepare__(name, bases, **kwds)`` (where the additional keyword arguments, if any, come from the class definition). The -``__prepare__`` method should be implemented as a -:func:`classmethod `. The +``__prepare__`` method should be implemented as a :func:`classmethod`. The namespace returned by ``__prepare__`` is passed in to ``__new__``, but when the final class object is created the namespace is copied into a new ``dict``. @@ -2084,15 +2103,15 @@ current call is identified based on the first argument passed to the method. Failing to do so will result in a :exc:`RuntimeError` in Python 3.8. When using the default metaclass :class:`type`, or any metaclass that ultimately -calls ``type.__new__``, the following additional customisation steps are +calls ``type.__new__``, the following additional customization steps are invoked after creating the class object: -* first, ``type.__new__`` collects all of the descriptors in the class - namespace that define a :meth:`~object.__set_name__` method; -* second, all of these ``__set_name__`` methods are called with the class - being defined and the assigned name of that particular descriptor; -* finally, the :meth:`~object.__init_subclass__` hook is called on the - immediate parent of the new class in its method resolution order. +1) The ``type.__new__`` method collects all of the attributes in the class + namespace that define a :meth:`~object.__set_name__` method; +2) Those ``__set_name__`` methods are called with the class + being defined and the assigned name of that particular attribute; +3) The :meth:`~object.__init_subclass__` hook is called on the + immediate parent of the new class in its method resolution order. After the class object is created, it is passed to the class decorators included in the class definition (if any) and the resulting object is bound @@ -2161,142 +2180,22 @@ case the instance is itself a class. Emulating generic types ----------------------- -When using :term:`type annotations`, it is often useful to -*parameterize* a :term:`generic type` using Python's square-brackets notation. -For example, the annotation ``list[int]`` might be used to signify a -:class:`list` in which all the elements are of type :class:`int`. - -.. seealso:: - - :pep:`484` - Type Hints - Introducing Python's framework for type annotations - - :ref:`Generic Alias Types` - Documentation for objects representing parameterized generic classes - - :ref:`Generics`, :ref:`user-defined generics` and :class:`typing.Generic` - Documentation on how to implement generic classes that can be - parameterized at runtime and understood by static type-checkers. - -A class can *generally* only be parameterized if it defines the special -class method ``__class_getitem__()``. +One can implement the generic class syntax as specified by :pep:`484` +(for example ``List[int]``) by defining a special method: .. classmethod:: object.__class_getitem__(cls, key) Return an object representing the specialization of a generic class by type arguments found in *key*. - When defined on a class, ``__class_getitem__()`` is automatically a class - method. As such, there is no need for it to be decorated with - :func:`@classmethod` when it is defined. - - -The purpose of *__class_getitem__* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The purpose of :meth:`~object.__class_getitem__` is to allow runtime -parameterization of standard-library generic classes in order to more easily -apply :term:`type hints` to these classes. - -To implement custom generic classes that can be parameterized at runtime and -understood by static type-checkers, users should either inherit from a standard -library class that already implements :meth:`~object.__class_getitem__`, or -inherit from :class:`typing.Generic`, which has its own implementation of -``__class_getitem__()``. - -Custom implementations of :meth:`~object.__class_getitem__` on classes defined -outside of the standard library may not be understood by third-party -type-checkers such as mypy. Using ``__class_getitem__()`` on any class for -purposes other than type hinting is discouraged. - - -.. _classgetitem-versus-getitem: - - -*__class_getitem__* versus *__getitem__* -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Usually, the :ref:`subscription` of an object using square -brackets will call the :meth:`~object.__getitem__` instance method defined on -the object's class. However, if the object being subscribed is itself a class, -the class method :meth:`~object.__class_getitem__` may be called instead. -``__class_getitem__()`` should return a :ref:`GenericAlias` -object if it is properly defined. - -Presented with the :term:`expression` ``obj[x]``, the Python interpreter -follows something like the following process to decide whether -:meth:`~object.__getitem__` or :meth:`~object.__class_getitem__` should be -called:: - - from inspect import isclass - - def subscribe(obj, x): - """Return the result of the expression `obj[x]`""" - - class_of_obj = type(obj) - - # If the class of obj defines __getitem__, - # call class_of_obj.__getitem__(obj, x) - if hasattr(class_of_obj, '__getitem__'): - return class_of_obj.__getitem__(obj, x) - - # Else, if obj is a class and defines __class_getitem__, - # call obj.__class_getitem__(x) - elif isclass(obj) and hasattr(obj, '__class_getitem__'): - return obj.__class_getitem__(x) - - # Else, raise an exception - else: - raise TypeError( - f"'{class_of_obj.__name__}' object is not subscriptable" - ) - -In Python, all classes are themselves instances of other classes. The class of -a class is known as that class's :term:`metaclass`, and most classes have the -:class:`type` class as their metaclass. :class:`type` does not define -:meth:`~object.__getitem__`, meaning that expressions such as ``list[int]``, -``dict[str, float]`` and ``tuple[str, bytes]`` all result in -:meth:`~object.__class_getitem__` being called:: - - >>> # list has class "type" as its metaclass, like most classes: - >>> type(list) - - >>> type(dict) == type(list) == type(tuple) == type(str) == type(bytes) - True - >>> # "list[int]" calls "list.__class_getitem__(int)" - >>> list[int] - list[int] - >>> # list.__class_getitem__ returns a GenericAlias object: - >>> type(list[int]) - - -However, if a class has a custom metaclass that defines -:meth:`~object.__getitem__`, subscribing the class may result in different -behaviour. An example of this can be found in the :mod:`enum` module:: - - >>> from enum import Enum - >>> class Menu(Enum): - ... """A breakfast menu""" - ... SPAM = 'spam' - ... BACON = 'bacon' - ... - >>> # Enum classes have a custom metaclass: - >>> type(Menu) - - >>> # EnumMeta defines __getitem__, - >>> # so __class_getitem__ is not called, - >>> # and the result is not a GenericAlias object: - >>> Menu['SPAM'] - - >>> type(Menu['SPAM']) - - +This method is looked up on the class object itself, and when defined in +the class body, this method is implicitly a class method. Note, this +mechanism is primarily reserved for use with static type hints, other usage +is discouraged. .. seealso:: - :pep:`560` - Core Support for typing module and generic types - Introducing :meth:`~object.__class_getitem__`, and outlining when a - :ref:`subscription` results in ``__class_getitem__()`` - being called instead of :meth:`~object.__getitem__` + + :pep:`560` - Core support for typing module and generic types .. _callable-types: @@ -2319,36 +2218,31 @@ Emulating container types ------------------------- The following methods can be defined to implement container objects. Containers -usually are :term:`sequences ` (such as :class:`lists ` or -:class:`tuples `) or :term:`mappings ` (like -:class:`dictionaries `), +usually are sequences (such as lists or tuples) or mappings (like dictionaries), but can represent other containers as well. The first set of methods is used either to emulate a sequence or to emulate a mapping; the difference is that for a sequence, the allowable keys should be the integers *k* for which ``0 <= k < -N`` where *N* is the length of the sequence, or :class:`slice` objects, which define a +N`` where *N* is the length of the sequence, or slice objects, which define a range of items. It is also recommended that mappings provide the methods :meth:`keys`, :meth:`values`, :meth:`items`, :meth:`get`, :meth:`clear`, :meth:`setdefault`, :meth:`pop`, :meth:`popitem`, :meth:`!copy`, and -:meth:`update` behaving similar to those for Python's standard :class:`dictionary ` +:meth:`update` behaving similar to those for Python's standard dictionary objects. The :mod:`collections.abc` module provides a :class:`~collections.abc.MutableMapping` -:term:`abstract base class` to help create those methods from a base set of -:meth:`~object.__getitem__`, :meth:`~object.__setitem__`, :meth:`~object.__delitem__`, and :meth:`keys`. +abstract base class to help create those methods from a base set of +:meth:`__getitem__`, :meth:`__setitem__`, :meth:`__delitem__`, and :meth:`keys`. Mutable sequences should provide methods :meth:`append`, :meth:`count`, :meth:`index`, :meth:`extend`, :meth:`insert`, :meth:`pop`, :meth:`remove`, -:meth:`reverse` and :meth:`sort`, like Python standard :class:`list` -objects. Finally, +:meth:`reverse` and :meth:`sort`, like Python standard list objects. Finally, sequence types should implement addition (meaning concatenation) and -multiplication (meaning repetition) by defining the methods -:meth:`~object.__add__`, :meth:`~object.__radd__`, :meth:`~object.__iadd__`, -:meth:`~object.__mul__`, :meth:`~object.__rmul__` and :meth:`~object.__imul__` -described below; they should not define other numerical +multiplication (meaning repetition) by defining the methods :meth:`__add__`, +:meth:`__radd__`, :meth:`__iadd__`, :meth:`__mul__`, :meth:`__rmul__` and +:meth:`__imul__` described below; they should not define other numerical operators. It is recommended that both mappings and sequences implement the -:meth:`~object.__contains__` method to allow efficient use of the ``in`` -operator; for +:meth:`__contains__` method to allow efficient use of the ``in`` operator; for mappings, ``in`` should search the mapping's keys; for sequences, it should search through the values. It is further recommended that both mappings and -sequences implement the :meth:`~object.__iter__` method to allow efficient iteration +sequences implement the :meth:`__iter__` method to allow efficient iteration through the container; for mappings, :meth:`__iter__` should iterate through the object's keys; for sequences, it should iterate through the values. @@ -2401,27 +2295,19 @@ through the object's keys; for sequences, it should iterate through the values. .. method:: object.__getitem__(self, key) - Called to implement evaluation of ``self[key]``. For :term:`sequence` types, - the accepted keys should be integers and slice objects. Note that the - special interpretation of negative indexes (if the class wishes to emulate a - :term:`sequence` type) is up to the :meth:`__getitem__` method. If *key* is - of an inappropriate type, :exc:`TypeError` may be raised; if of a value - outside the set of indexes for the sequence (after any special - interpretation of negative values), :exc:`IndexError` should be raised. For - :term:`mapping` types, if *key* is missing (not in the container), - :exc:`KeyError` should be raised. - - .. note:: - - :keyword:`for` loops expect that an :exc:`IndexError` will be raised for - illegal indexes to allow proper detection of the end of the sequence. + Called to implement evaluation of ``self[key]``. For sequence types, the + accepted keys should be integers and slice objects. Note that the special + interpretation of negative indexes (if the class wishes to emulate a sequence + type) is up to the :meth:`__getitem__` method. If *key* is of an inappropriate + type, :exc:`TypeError` may be raised; if of a value outside the set of indexes + for the sequence (after any special interpretation of negative values), + :exc:`IndexError` should be raised. For mapping types, if *key* is missing (not + in the container), :exc:`KeyError` should be raised. .. note:: - When :ref:`subscripting` a *class*, the special - class method :meth:`~object.__class_getitem__` may be called instead of - ``__getitem__()``. See :ref:`classgetitem-versus-getitem` for more - details. + :keyword:`for` loops expect that an :exc:`IndexError` will be raised for illegal + indexes to allow proper detection of the end of the sequence. .. method:: object.__setitem__(self, key, value) @@ -2603,13 +2489,6 @@ left undefined. :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in fact part of the data model. - .. note:: - - Due to a bug in the dispatching mechanism for ``**=``, a class that - defines :meth:`__ipow__` but returns ``NotImplemented`` would fail to - fall back to ``x.__pow__(y)`` and ``y.__rpow__(x)``. This bug is fixed - in Python 3.10. - .. method:: object.__neg__(self) object.__pos__(self) @@ -2662,8 +2541,8 @@ left undefined. return the value of the object truncated to an :class:`~numbers.Integral` (typically an :class:`int`). - The built-in function :func:`int` falls back to :meth:`__trunc__` if neither - :meth:`__int__` nor :meth:`__index__` is defined. + If :meth:`__int__` is not defined then the built-in function :func:`int` + falls back to :meth:`__trunc__`. .. _context-managers: @@ -2716,6 +2595,38 @@ For more information on context managers, see :ref:`typecontextmanager`. statement. +.. _class-pattern-matching: + +Customizing positional arguments in class pattern matching +---------------------------------------------------------- + +When using a class name in a pattern, positional arguments in the pattern are not +allowed by default, i.e. ``case MyClass(x, y)`` is typically invalid without special +support in ``MyClass``. To be able to use that kind of patterns, the class needs to +define a *__match_args__* attribute. + +.. data:: object.__match_args__ + + This class variable can be assigned a tuple of strings. When this class is + used in a class pattern with positional arguments, each positional argument will + be converted into a keyword argument, using the corresponding value in + *__match_args__* as the keyword. The absence of this attribute is equivalent to + setting it to ``()``. + +For example, if ``MyClass.__match_args__`` is ``("left", "center", "right")`` that means +that ``case MyClass(x, y)`` is equivalent to ``case MyClass(left=x, center=y)``. Note +that the number of arguments in the pattern must be smaller than or equal to the number +of elements in *__match_args__*; if it is larger, the pattern match attempt will raise +a :exc:`TypeError`. + +.. versionadded:: 3.10 + +.. seealso:: + + :pep:`634` - Structural Pattern Matching + The specification for the Python ``match`` statement. + + .. _special-lookup: Special method lookup @@ -2737,8 +2648,7 @@ exception:: TypeError: object of type 'C' has no len() The rationale behind this behaviour lies with a number of special methods such -as :meth:`~object.__hash__` and :meth:`~object.__repr__` that are implemented -by all objects, +as :meth:`__hash__` and :meth:`__repr__` that are implemented by all objects, including type objects. If the implicit lookup of these methods used the conventional lookup process, they would fail when invoked on the type object itself:: @@ -2761,7 +2671,7 @@ the instance when looking up special methods:: In addition to bypassing any instance attributes in the interest of correctness, implicit special method lookup generally also bypasses the -:meth:`~object.__getattribute__` method even of the object's metaclass:: +:meth:`__getattribute__` method even of the object's metaclass:: >>> class Meta(type): ... def __getattribute__(*args): @@ -2785,7 +2695,7 @@ correctness, implicit special method lookup generally also bypasses the >>> len(c) # Implicit lookup 10 -Bypassing the :meth:`~object.__getattribute__` machinery in this fashion +Bypassing the :meth:`__getattribute__` machinery in this fashion provides significant scope for speed optimisations within the interpreter, at the cost of some flexibility in the handling of special methods (the special method *must* be set on the class @@ -2802,7 +2712,7 @@ Coroutines Awaitable Objects ----------------- -An :term:`awaitable` object generally implements an :meth:`~object.__await__` method. +An :term:`awaitable` object generally implements an :meth:`__await__` method. :term:`Coroutine objects ` returned from :keyword:`async def` functions are awaitable. @@ -2810,7 +2720,7 @@ are awaitable. The :term:`generator iterator` objects returned from generators decorated with :func:`types.coroutine` or :func:`asyncio.coroutine` - are also awaitable, but they do not implement :meth:`~object.__await__`. + are also awaitable, but they do not implement :meth:`__await__`. .. method:: object.__await__(self) @@ -2829,7 +2739,7 @@ Coroutine Objects ----------------- :term:`Coroutine objects ` are :term:`awaitable` objects. -A coroutine's execution can be controlled by calling :meth:`~object.__await__` and +A coroutine's execution can be controlled by calling :meth:`__await__` and iterating over the result. When the coroutine has finished executing and returns, the iterator raises :exc:`StopIteration`, and the exception's :attr:`~StopIteration.value` attribute holds the return value. If the @@ -2848,21 +2758,20 @@ generators, coroutines do not directly support iteration. Starts or resumes execution of the coroutine. If *value* is ``None``, this is equivalent to advancing the iterator returned by - :meth:`~object.__await__`. If *value* is not ``None``, this method delegates + :meth:`__await__`. If *value* is not ``None``, this method delegates to the :meth:`~generator.send` method of the iterator that caused the coroutine to suspend. The result (return value, :exc:`StopIteration`, or other exception) is the same as when iterating over the :meth:`__await__` return value, described above. -.. method:: coroutine.throw(value) - coroutine.throw(type[, value[, traceback]]) +.. method:: coroutine.throw(type[, value[, traceback]]) Raises the specified exception in the coroutine. This method delegates to the :meth:`~generator.throw` method of the iterator that caused the coroutine to suspend, if it has such a method. Otherwise, the exception is raised at the suspension point. The result (return value, :exc:`StopIteration`, or other exception) is the same as - when iterating over the :meth:`~object.__await__` return value, described + when iterating over the :meth:`__await__` return value, described above. If the exception is not caught in the coroutine, it propagates back to the caller. @@ -2916,11 +2825,11 @@ An example of an asynchronous iterable object:: .. versionadded:: 3.5 .. versionchanged:: 3.7 - Prior to Python 3.7, :meth:`~object.__aiter__` could return an *awaitable* + Prior to Python 3.7, ``__aiter__`` could return an *awaitable* that would resolve to an :term:`asynchronous iterator `. - Starting with Python 3.7, :meth:`~object.__aiter__` must return an + Starting with Python 3.7, ``__aiter__`` must return an asynchronous iterator object. Returning anything else will result in a :exc:`TypeError` error. @@ -2963,9 +2872,8 @@ An example of an asynchronous context manager class:: controlled conditions. It generally isn't a good idea though, since it can lead to some very strange behaviour if it is handled incorrectly. -.. [#] The :meth:`~object.__hash__`, :meth:`~object.__iter__`, - :meth:`~object.__reversed__`, and :meth:`~object.__contains__` methods have - special handling for this; others +.. [#] The :meth:`__hash__`, :meth:`__iter__`, :meth:`__reversed__`, and + :meth:`__contains__` methods have special handling for this; others will still raise a :exc:`TypeError`, but may do so by relying on the behavior that ``None`` is not callable. @@ -2976,6 +2884,5 @@ An example of an asynchronous context manager class:: *blocking* such fallback. .. [#] For operands of the same type, it is assumed that if the non-reflected - method -- such as :meth:`~object.__add__` -- fails then the overall - operation is not + method -- such as :meth:`__add__` -- fails then the overall operation is not supported, which is why the reflected method is not called. diff --git a/Doc/reference/executionmodel.rst b/Doc/reference/executionmodel.rst index 5eed24e6..55ac01b6 100644 --- a/Doc/reference/executionmodel.rst +++ b/Doc/reference/executionmodel.rst @@ -119,14 +119,14 @@ is subtle. Python lacks declarations and allows name binding operations to occur anywhere within a code block. The local variables of a code block can be determined by scanning the entire text of the block for name binding operations. -If the :keyword:`global` statement occurs within a block, all uses of the names -specified in the statement refer to the bindings of those names in the top-level +If the :keyword:`global` statement occurs within a block, all uses of the name +specified in the statement refer to the binding of that name in the top-level namespace. Names are resolved in the top-level namespace by searching the global namespace, i.e. the namespace of the module containing the code block, and the builtins namespace, the namespace of the module :mod:`builtins`. The -global namespace is searched first. If the names are not found there, the +global namespace is searched first. If the name is not found there, the builtins namespace is searched. The :keyword:`!global` statement must precede -all uses of the listed names. +all uses of the name. The :keyword:`global` statement has the same scope as a name binding operation in the same block. If the nearest enclosing scope for a free variable contains @@ -249,9 +249,8 @@ a stack traceback, except when the exception is :exc:`SystemExit`. Exceptions are identified by class instances. The :keyword:`except` clause is selected depending on the class of the instance: it must reference the class of -the instance or a :term:`non-virtual base class ` thereof. -The instance can be received by the handler and can carry additional information -about the exceptional condition. +the instance or a base class thereof. The instance can be received by the +handler and can carry additional information about the exceptional condition. .. note:: diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 9f6f6f7d..ab47f37c 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -422,9 +422,9 @@ Yield expressions The yield expression is used when defining a :term:`generator` function or an :term:`asynchronous generator` function and thus can only be used in the body of a function definition. Using a yield -expression in a function's body causes that function to be a generator function, +expression in a function's body causes that function to be a generator, and using it in an :keyword:`async def` function's body causes that -coroutine function to be an asynchronous generator function. For example:: +coroutine function to be an asynchronous generator. For example:: def gen(): # defines a generator function yield 123 @@ -557,27 +557,14 @@ is already executing raises a :exc:`ValueError` exception. could receive the value. -.. method:: generator.throw(value) - generator.throw(type[, value[, traceback]]) +.. method:: generator.throw(type[, value[, traceback]]) - Raises an exception at the point where the generator was paused, + Raises an exception of type ``type`` at the point where the generator was paused, and returns the next value yielded by the generator function. If the generator exits without yielding another value, a :exc:`StopIteration` exception is raised. If the generator function does not catch the passed-in exception, or raises a different exception, then that exception propagates to the caller. - In typical use, this is called with a single exception instance similar to the - way the :keyword:`raise` keyword is used. - - For backwards compatability, however, the second signature is - supported, following a convention from older versions of Python. - The *type* argument should be an exception class, and *value* - should be an exception instance. If the *value* is not provided, the - *type* constructor is called to get an instance. If *traceback* - is provided, it is set on the exception, otherwise any existing - :attr:`~BaseException.__traceback__` attribute stored in *value* may - be cleared. - .. index:: exception: GeneratorExit @@ -658,6 +645,16 @@ after resuming depends on the method which resumed the execution. If :meth:`~agen.asend` is used, then the result will be the value passed in to that method. +If an asynchronous generator happens to exit early by :keyword:`break`, the caller +task being cancelled, or other exceptions, the generator's async cleanup code +will run and possibly raise exceptions or access context variables in an +unexpected context--perhaps after the lifetime of tasks it depends, or +during the event loop shutdown when the async-generator garbage collection hook +is called. +To prevent this, the caller must explicitly close the async generator by calling +:meth:`~agen.aclose` method to finalize the generator and ultimately detach it +from the event loop. + In an asynchronous generator function, yield expressions are allowed anywhere in a :keyword:`try` construct. However, if an asynchronous generator is not resumed before it is finalized (by reaching a zero reference count or by @@ -669,9 +666,9 @@ generator-iterator's :meth:`~agen.aclose` method and run the resulting coroutine object, thus allowing any pending :keyword:`!finally` clauses to execute. -To take care of finalization, an event loop should define -a *finalizer* function which takes an asynchronous generator-iterator -and presumably calls :meth:`~agen.aclose` and executes the coroutine. +To take care of finalization upon event loop termination, an event loop should +define a *finalizer* function which takes an asynchronous generator-iterator and +presumably calls :meth:`~agen.aclose` and executes the coroutine. This *finalizer* may be registered by calling :func:`sys.set_asyncgen_hooks`. When first iterated over, an asynchronous generator-iterator will store the registered *finalizer* to be called upon finalization. For a reference example @@ -815,44 +812,30 @@ Subscriptions object: dictionary pair: sequence; item -The subscription of an instance of a :ref:`container class ` -will generally select an element from the container. The subscription of a -:term:`generic class ` will generally return a -:ref:`GenericAlias ` object. +Subscription of a sequence (string, tuple or list) or mapping (dictionary) +object usually selects an item from the collection: .. productionlist:: python-grammar subscription: `primary` "[" `expression_list` "]" -When an object is subscripted, the interpreter will evaluate the primary and -the expression list. +The primary must evaluate to an object that supports subscription (lists or +dictionaries for example). User-defined objects can support subscription by +defining a :meth:`__getitem__` method. -The primary must evaluate to an object that supports subscription. An object -may support subscription through defining one or both of -:meth:`~object.__getitem__` and :meth:`~object.__class_getitem__`. When the -primary is subscripted, the evaluated result of the expression list will be -passed to one of these methods. For more details on when ``__class_getitem__`` -is called instead of ``__getitem__``, see :ref:`classgetitem-versus-getitem`. +For built-in objects, there are two types of objects that support subscription: -If the expression list contains at least one comma, it will evaluate to a -:class:`tuple` containing the items of the expression list. Otherwise, the -expression list will evaluate to the value of the list's sole member. +If the primary is a mapping, the expression list must evaluate to an object +whose value is one of the keys of the mapping, and the subscription selects the +value in the mapping that corresponds to that key. (The expression list is a +tuple except if it has exactly one item.) -For built-in objects, there are two types of objects that support subscription -via :meth:`~object.__getitem__`: - -1. Mappings. If the primary is a :term:`mapping`, the expression list must - evaluate to an object whose value is one of the keys of the mapping, and the - subscription selects the value in the mapping that corresponds to that key. - An example of a builtin mapping class is the :class:`dict` class. -2. Sequences. If the primary is a :term:`sequence`, the expression list must - evaluate to an :class:`int` or a :class:`slice` (as discussed in the - following section). Examples of builtin sequence classes include the - :class:`str`, :class:`list` and :class:`tuple` classes. +If the primary is a sequence, the expression list must evaluate to an integer +or a slice (as discussed in the following section). The formal syntax makes no special provision for negative indices in -:term:`sequences `. However, built-in sequences all provide a :meth:`~object.__getitem__` +sequences; however, built-in sequences all provide a :meth:`__getitem__` method that interprets negative indices by adding the length of the sequence -to the index so that, for example, ``x[-1]`` selects the last item of ``x``. The +to the index (so that ``x[-1]`` selects the last item of ``x``). The resulting value must be a nonnegative integer less than the number of items in the sequence, and the subscription selects the item whose index is that value (counting from zero). Since the support for negative indices and slicing @@ -863,10 +846,14 @@ this method will need to explicitly add that support. single: character pair: string; item -A :class:`string ` is a special kind of sequence whose items are -*characters*. A character is not a separate data type but a +A string's items are characters. A character is not a separate data type but a string of exactly one character. +Subscription of certain :term:`classes ` or :term:`types ` +creates a :ref:`generic alias `. +In this case, user-defined classes can support subscription by providing a +:meth:`__class_getitem__` classmethod. + .. _slicings: @@ -1882,7 +1869,7 @@ precedence and have a left-to-right chaining feature as described in the | ``x[index]``, ``x[index:index]``, | Subscription, slicing, | | ``x(arguments...)``, ``x.attribute`` | call, attribute reference | +-----------------------------------------------+-------------------------------------+ -| :keyword:`await x ` | Await expression | +| :keyword:`await` ``x`` | Await expression | +-----------------------------------------------+-------------------------------------+ | ``**`` | Exponentiation [#]_ | +-----------------------------------------------+-------------------------------------+ @@ -1906,7 +1893,7 @@ precedence and have a left-to-right chaining feature as described in the | :keyword:`is`, :keyword:`is not`, ``<``, | tests and identity tests | | ``<=``, ``>``, ``>=``, ``!=``, ``==`` | | +-----------------------------------------------+-------------------------------------+ -| :keyword:`not x ` | Boolean NOT | +| :keyword:`not` ``x`` | Boolean NOT | +-----------------------------------------------+-------------------------------------+ | :keyword:`and` | Boolean AND | +-----------------------------------------------+-------------------------------------+ diff --git a/Doc/reference/grammar.rst b/Doc/reference/grammar.rst index acf83765..59b45005 100644 --- a/Doc/reference/grammar.rst +++ b/Doc/reference/grammar.rst @@ -13,7 +13,8 @@ In particular, ``&`` followed by a symbol, token or parenthesized group indicates a positive lookahead (i.e., is required to match but not consumed), while ``!`` indicates a negative lookahead (i.e., is required _not_ to match). We use the ``|`` separator to mean PEG's -"ordered choice" (written as ``/`` in traditional PEG grammars). +"ordered choice" (written as ``/`` in traditional PEG grammars). See +:pep:`617` for more details on the grammar's syntax. .. literalinclude:: ../../Grammar/python.gram :language: peg diff --git a/Doc/reference/import.rst b/Doc/reference/import.rst index 2d9802b0..9834f957 100644 --- a/Doc/reference/import.rst +++ b/Doc/reference/import.rst @@ -84,9 +84,9 @@ considered a package. All modules have a name. Subpackage names are separated from their parent package name by a dot, akin to Python's standard attribute access syntax. Thus -you might have a package called :mod:`email`, which in turn has a subpackage -called :mod:`email.mime` and a module within that subpackage called -:mod:`email.mime.text`. +you might have a module called :mod:`sys` and a package called :mod:`email`, +which in turn has a subpackage called :mod:`email.mime` and a module within +that subpackage called :mod:`email.mime.text`. Regular packages @@ -329,6 +329,10 @@ modules, and one that knows how to import modules from an :term:`import path` import machinery will try it only if the finder does not implement ``find_spec()``. +.. versionchanged:: 3.10 + Use of :meth:`~importlib.abc.MetaPathFinder.find_module` by the import system + now raises :exc:`ImportWarning`. + Loading ======= @@ -470,6 +474,9 @@ import machinery will create the new module itself. An :exc:`ImportError` is raised when ``exec_module()`` is defined but ``create_module()`` is not. +.. versionchanged:: 3.10 + Use of ``load_module()`` will raise :exc:`ImportWarning`. + Submodules ---------- @@ -483,19 +490,21 @@ submodule. Let's say you have the following directory structure:: spam/ __init__.py foo.py + bar.py -and ``spam/__init__.py`` has the following line in it:: +and ``spam/__init__.py`` has the following lines in it:: from .foo import Foo + from .bar import Bar -then executing the following puts name bindings for ``foo`` and ``Foo`` in the +then executing the following puts a name binding to ``foo`` and ``bar`` in the ``spam`` module:: >>> import spam >>> spam.foo - >>> spam.Foo - + >>> spam.bar + Given Python's familiar name binding rules this might seem surprising, but it's actually a fundamental feature of the import system. The invariant @@ -673,6 +682,13 @@ Here are the exact rules used: :meth:`~importlib.abc.Loader.module_repr` method, if defined, before trying either approach described above. However, the method is deprecated. +.. versionchanged:: 3.10 + + Calling :meth:`~importlib.abc.Loader.module_repr` now occurs after trying to + use a module's ``__spec__`` attribute but before falling back on + ``__file__``. Use of :meth:`~importlib.abc.Loader.module_repr` is slated to + stop in Python 3.12. + .. _pyc-invalidation: Cached bytecode invalidation @@ -887,6 +903,11 @@ a list containing the portion. exist on a path entry finder, the import system will always call ``find_loader()`` in preference to ``find_module()``. +.. versionchanged:: 3.10 + Calls to :meth:`~importlib.abc.PathEntryFinder.find_module` and + :meth:`~importlib.abc.PathEntryFinder.find_loader` by the import + system will raise :exc:`ImportWarning`. + Replacing the standard import system ==================================== @@ -949,6 +970,8 @@ should expose ``XXX.YYY.ZZZ`` as a usable expression, but .moduleY is not a valid expression. +.. _import-dunder-main: + Special considerations for __main__ =================================== diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst index b8f9ca21..4ad8f8be 100644 --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -101,11 +101,12 @@ addition, if the first bytes of the file are the UTF-8 byte-order mark (``b'\xef\xbb\xbf'``), the declared file encoding is UTF-8 (this is supported, among others, by Microsoft's :program:`notepad`). -If an encoding is declared, the encoding name must be recognized by Python -(see :ref:`standard-encodings`). The +If an encoding is declared, the encoding name must be recognized by Python. The encoding is used for all lexical analysis, including string literals, comments and identifiers. +.. XXX there should be a list of supported encodings. + .. _explicit-joining: @@ -350,6 +351,27 @@ exactly as written here: assert del global not with async elif if or yield + +.. _soft-keywords: + +Soft Keywords +------------- + +.. index:: soft keyword, keyword + +.. versionadded:: 3.10 + +Some identifiers are only reserved under specific contexts. These are known as +*soft keywords*. The identifiers ``match``, ``case`` and ``_`` can +syntactically act as keywords in contexts related to the pattern matching +statement, but this distinction is done at the parser level, not when +tokenizing. + +As soft keywords, their use with pattern matching is possible while still +preserving compatibility with existing code that uses ``match``, ``case`` and ``_`` as +identifier names. + + .. index:: single: _, identifiers single: __, identifiers @@ -447,11 +469,9 @@ see section :ref:`encodings`. In plain English: Both types of literals can be enclosed in matching single quotes (``'``) or double quotes (``"``). They can also be enclosed in matching groups of three single or double quotes (these are generally referred to as -*triple-quoted strings*). The backslash (``\``) character is used to give special -meaning to otherwise ordinary characters like ``n``, which means 'newline' when -escaped (``\n``). It can also be used to escape characters that otherwise have a -special meaning, such as newline, backslash itself, or the quote character. -See :ref:`escape sequences ` below for examples. +*triple-quoted strings*). The backslash (``\``) character is used to escape +characters that otherwise have a special meaning, such as newline, backslash +itself, or the quote character. .. index:: single: b'; bytes literal @@ -510,8 +530,6 @@ retained), except that three unescaped quotes in a row terminate the literal. ( single: \u; escape sequence single: \U; escape sequence -.. _escape-sequences: - Unless an ``'r'`` or ``'R'`` prefix is present, escape sequences in string and bytes literals are interpreted according to rules similar to those used by Standard C. The recognized escape sequences are: diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 2c2c2453..bb1209df 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -124,7 +124,9 @@ square brackets, is recursively defined as follows. * If the target list is a single target with no trailing comma, optionally in parentheses, the object is assigned to that target. -* Else: +* Else: The object must be an iterable with the same number of + items as there are targets in the target list, and the items are assigned, + from left to right, to the corresponding targets. * If the target list contains one target prefixed with an asterisk, called a "starred" target: The object must be an iterable with at least as many items @@ -561,10 +563,10 @@ The :keyword:`!raise` statement .. productionlist:: python-grammar raise_stmt: "raise" [`expression` ["from" `expression`]] -If no expressions are present, :keyword:`raise` re-raises the -exception that is currently being handled, which is also known as the *active exception*. -If there isn't currently an active exception, a :exc:`RuntimeError` exception is raised -indicating that this is an error. +If no expressions are present, :keyword:`raise` re-raises the last exception +that was active in the current scope. If no exception is active in the current +scope, a :exc:`RuntimeError` exception is raised indicating that this is an +error. Otherwise, :keyword:`raise` evaluates the first expression as the exception object. It must be either a subclass or an instance of :class:`BaseException`. @@ -579,8 +581,8 @@ The :dfn:`type` of the exception is the exception instance's class, the A traceback object is normally created automatically when an exception is raised and attached to it as the :attr:`__traceback__` attribute, which is writable. You can create an exception and set your own traceback in one step using the -:meth:`~BaseException.with_traceback` exception method (which returns the -same exception instance, with its traceback set to its argument), like so:: +:meth:`with_traceback` exception method (which returns the same exception +instance, with its traceback set to its argument), like so:: raise Exception("foo occurred").with_traceback(tracebackobj) @@ -612,10 +614,8 @@ exceptions will be printed:: File "", line 4, in RuntimeError: Something bad happened -A similar mechanism works implicitly if a new exception is raised when -an exception is already being handled. An exception may be handled -when an :keyword:`except` or :keyword:`finally` clause, or a -:keyword:`with` statement, is used. The previous exception is then +A similar mechanism works implicitly if an exception is raised inside an +exception handler or a :keyword:`finally` clause: the previous exception is then attached as the new exception's :attr:`__context__` attribute:: >>> try: @@ -795,9 +795,9 @@ The :keyword:`from` form uses a slightly more complex process: Examples:: import foo # foo imported and bound locally - import foo.bar.baz # foo, foo.bar, and foo.bar.baz imported, foo bound locally - import foo.bar.baz as fbb # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as fbb - from foo.bar import baz # foo, foo.bar, and foo.bar.baz imported, foo.bar.baz bound as baz + import foo.bar.baz # foo.bar.baz imported, foo bound locally + import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb + from foo.bar import baz # foo.bar.baz imported and bound as baz from foo import attr # foo imported and foo.attr bound as attr .. index:: single: * (asterisk); import statement @@ -953,7 +953,7 @@ Names listed in a :keyword:`global` statement must not be used in the same code block textually preceding that :keyword:`!global` statement. Names listed in a :keyword:`global` statement must not be defined as formal -parameters or in a :keyword:`for` loop control target, :keyword:`class` +parameters, or as targets in :keyword:`with` statements or :keyword:`except` clauses, or in a :keyword:`for` target list, :keyword:`class` definition, function definition, :keyword:`import` statement, or variable annotation. diff --git a/Doc/requirements.txt b/Doc/requirements.txt index cf659a0f..2b70af3a 100644 --- a/Doc/requirements.txt +++ b/Doc/requirements.txt @@ -3,16 +3,10 @@ # Sphinx version is pinned so that new versions that introduce new warnings # won't suddenly cause build failures. Updating the version is fine as long # as no warnings are raised by doing so. -sphinx==2.4.4 -# Docutils version is pinned to a version compatible with Sphinx -# version 2.4.4. It can be removed after bumping Sphinx version to at -# least 3.5.4. -docutils==0.17.1 -# Jinja version is pinned to a version compatible with Sphinx version 2.4.4. -jinja2==3.0.3 +sphinx==3.2.1 blurb # The theme used by the documentation is stored separately, so we need # to install that as well. -python-docs-theme>=2022.1 +python-docs-theme diff --git a/Doc/tools/extensions/c_annotations.py b/Doc/tools/extensions/c_annotations.py index 76c9d920..489f0661 100644 --- a/Doc/tools/extensions/c_annotations.py +++ b/Doc/tools/extensions/c_annotations.py @@ -10,8 +10,10 @@ * stable API annotations - Usage: Set the `refcount_file` config value to the path to the reference + Usage: + * Set the `refcount_file` config value to the path to the reference count data file. + * Set the `stable_abi_file` config value to the path to stable ABI list. :copyright: Copyright 2007-2014 by Georg Brandl. :license: Python license. @@ -20,11 +22,23 @@ from os import path from docutils import nodes from docutils.parsers.rst import directives +from docutils.parsers.rst import Directive +from docutils.statemachine import StringList +import csv from sphinx import addnodes from sphinx.domains.c import CObject +REST_ROLE_MAP = { + 'function': 'func', + 'var': 'data', + 'type': 'type', + 'macro': 'macro', + 'type': 'type', +} + + class RCEntry: def __init__(self, name): self.name = name @@ -33,12 +47,10 @@ class RCEntry: self.result_refs = None -class Annotations(dict): - @classmethod - def fromfile(cls, filename): - d = cls() - fp = open(filename, 'r') - try: +class Annotations: + def __init__(self, refcount_filename, stable_abi_file): + self.refcount_data = {} + with open(refcount_filename, 'r') as fp: for line in fp: line = line.strip() if line[:1] in ("", "#"): @@ -50,9 +62,9 @@ class Annotations(dict): function, type, arg, refcount, comment = parts # Get the entry, creating it if needed: try: - entry = d[function] + entry = self.refcount_data[function] except KeyError: - entry = d[function] = RCEntry(function) + entry = self.refcount_data[function] = RCEntry(function) if not refcount or refcount == "null": refcount = None else: @@ -64,27 +76,58 @@ class Annotations(dict): else: entry.result_type = type entry.result_refs = refcount - finally: - fp.close() - return d + + self.stable_abi_data = {} + with open(stable_abi_file, 'r') as fp: + for record in csv.DictReader(fp): + role = record['role'] + name = record['name'] + self.stable_abi_data[name] = record def add_annotations(self, app, doctree): for node in doctree.traverse(addnodes.desc_content): par = node.parent if par['domain'] != 'c': continue - if par['stableabi']: - node.insert(0, nodes.emphasis(' Part of the stable ABI.', - ' Part of the stable ABI.', - classes=['stableabi'])) - if par['objtype'] != 'function': - continue if not par[0].has_key('ids') or not par[0]['ids']: continue name = par[0]['ids'][0] if name.startswith("c."): name = name[2:] - entry = self.get(name) + + objtype = par['objtype'] + + # Stable ABI annotation. These have two forms: + # Part of the [Stable ABI](link). + # Part of the [Stable ABI](link) since version X.Y. + record = self.stable_abi_data.get(name) + if record: + if record['role'] != objtype: + raise ValueError( + f"Object type mismatch in limited API annotation " + f"for {name}: {record['role']!r} != {objtype!r}") + stable_added = record['added'] + message = ' Part of the ' + emph_node = nodes.emphasis(message, message, + classes=['stableabi']) + ref_node = addnodes.pending_xref( + 'Stable ABI', refdomain="std", reftarget='stable', + reftype='ref', refexplicit="False") + ref_node += nodes.Text('Stable ABI') + emph_node += ref_node + if record['ifdef_note']: + emph_node += nodes.Text(' ' + record['ifdef_note']) + if stable_added == '3.2': + # Stable ABI was introduced in 3.2. + emph_node += nodes.Text('.') + else: + emph_node += nodes.Text(f' since version {stable_added}.') + node.insert(0, emph_node) + + # Return value annotation + if objtype != 'function': + continue + entry = self.refcount_data.get(name) if not entry: continue elif not entry.result_type.endswith("Object*"): @@ -99,13 +142,36 @@ class Annotations(dict): def init_annotations(app): - refcounts = Annotations.fromfile( - path.join(app.srcdir, app.config.refcount_file)) - app.connect('doctree-read', refcounts.add_annotations) + annotations = Annotations( + path.join(app.srcdir, app.config.refcount_file), + path.join(app.srcdir, app.config.stable_abi_file), + ) + app.connect('doctree-read', annotations.add_annotations) + + class LimitedAPIList(Directive): + + has_content = False + required_arguments = 0 + optional_arguments = 0 + final_argument_whitespace = True + + def run(self): + content = [] + for record in annotations.stable_abi_data.values(): + role = REST_ROLE_MAP[record['role']] + name = record['name'] + content.append(f'* :c:{role}:`{name}`') + + pnode = nodes.paragraph() + self.state.nested_parse(StringList(content), 0, pnode) + return [pnode] + + app.add_directive('limited-api-list', LimitedAPIList) def setup(app): app.add_config_value('refcount_file', '', True) + app.add_config_value('stable_abi_file', '', True) app.connect('builder-inited', init_annotations) # monkey-patch C object... diff --git a/Doc/tools/extensions/escape4chm.py b/Doc/tools/extensions/escape4chm.py index 89970975..e9999716 100644 --- a/Doc/tools/extensions/escape4chm.py +++ b/Doc/tools/extensions/escape4chm.py @@ -5,7 +5,6 @@ effect on some MBCS Windows systems. https://bugs.python.org/issue32174 """ -import pathlib import re from html.entities import codepoint2name @@ -40,12 +39,12 @@ def fixup_keywords(app, exception): return getLogger(__name__).info('fixing HTML escapes in keywords file...') - outdir = pathlib.Path(app.builder.outdir) + outdir = app.builder.outdir outname = app.builder.config.htmlhelp_basename - with open(outdir / (outname + '.hhk'), 'rb') as f: + with app.builder.open_file(outdir, outname + '.hhk', 'r') as f: index = f.read() - with open(outdir / (outname + '.hhk'), 'wb') as f: - f.write(index.replace(b''', b''')) + with app.builder.open_file(outdir, outname + '.hhk', 'w') as f: + f.write(index.replace(''', ''')) def setup(app): # `html-page-context` event emitted when the HTML builder has diff --git a/Doc/tools/extensions/glossary_search.py b/Doc/tools/extensions/glossary_search.py new file mode 100644 index 00000000..59a6862e --- /dev/null +++ b/Doc/tools/extensions/glossary_search.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +""" + glossary_search.py + ~~~~~~~~~~~~~~~~ + + Feature search results for glossary items prominently. + + :license: Python license. +""" +import json +import os.path +from docutils.nodes import definition_list_item +from sphinx.addnodes import glossary +from sphinx.util import logging + + +logger = logging.getLogger(__name__) +STATIC_DIR = '_static' +JSON = 'glossary.json' + + +def process_glossary_nodes(app, doctree, fromdocname): + if app.builder.format != 'html': + return + + terms = {} + + for node in doctree.traverse(glossary): + for glossary_item in node.traverse(definition_list_item): + term = glossary_item[0].astext().lower() + definition = glossary_item[1] + + rendered = app.builder.render_partial(definition) + terms[term] = { + 'title': glossary_item[0].astext(), + 'body': rendered['html_body'] + } + + if hasattr(app.env, 'glossary_terms'): + app.env.glossary_terms.update(terms) + else: + app.env.glossary_terms = terms + +def on_build_finish(app, exc): + if not hasattr(app.env, 'glossary_terms'): + return + if not app.env.glossary_terms: + return + + logger.info(f'Writing {JSON}', color='green') + + dest_dir = os.path.join(app.outdir, STATIC_DIR) + os.makedirs(dest_dir, exist_ok=True) + + with open(os.path.join(dest_dir, JSON), 'w') as f: + json.dump(app.env.glossary_terms, f) + + +def setup(app): + app.connect('doctree-resolved', process_glossary_nodes) + app.connect('build-finished', on_build_finish) + + return {'version': '0.1', 'parallel_read_safe': True} diff --git a/Doc/tools/extensions/peg_highlight.py b/Doc/tools/extensions/peg_highlight.py index 4262687d..42101be1 100644 --- a/Doc/tools/extensions/peg_highlight.py +++ b/Doc/tools/extensions/peg_highlight.py @@ -27,6 +27,12 @@ class PEGLexer(RegexLexer): tokens = { "ws": [(r"\n", Text), (r"\s+", Text), (r"#.*$", Comment.Singleline),], "lookaheads": [ + # Forced tokens + (r"(&&)(?=\w+\s?)", bygroups(None)), + (r"(&&)(?='.+'\s?)", bygroups(None)), + (r'(&&)(?=".+"\s?)', bygroups(None)), + (r"(&&)(?=\(.+\)\s?)", bygroups(None)), + (r"(?<=\|\s)(&\w+\s?)", bygroups(None)), (r"(?<=\|\s)(&'.+'\s?)", bygroups(None)), (r'(?<=\|\s)(&".+"\s?)', bygroups(None)), @@ -36,17 +42,22 @@ class PEGLexer(RegexLexer): (r"(@\w+ '''(.|\n)+?''')", bygroups(None)), (r"^(@.*)$", bygroups(None)), ], - "actions": [(r"{(.|\n)+?}", bygroups(None)),], + "actions": [ + (r"{(.|\n)+?}", bygroups(None)), + ], "strings": [ (r"'\w+?'", Keyword), (r'"\w+?"', Keyword), (r"'\W+?'", Text), (r'"\W+?"', Text), ], - "variables": [(_name + _text_ws + "(=)", bygroups(None, None, None),),], + "variables": [ + (_name + _text_ws + "(=)", bygroups(None, None, None),), + (_name + _text_ws + r"(\[[\w\d_\*]+?\])" + _text_ws + "(=)", bygroups(None, None, None, None, None),), + ], "invalids": [ - (r"^(\s+\|\s+.*invalid_\w+.*\n)", bygroups(None)), - (r"^(\s+\|\s+.*incorrect_\w+.*\n)", bygroups(None)), + (r"^(\s+\|\s+invalid_\w+\s*\n)", bygroups(None)), + (r"^(\s+\|\s+incorrect_\w+\s*\n)", bygroups(None)), (r"^(#.*invalid syntax.*(?:.|\n)*)", bygroups(None),), ], "root": [ diff --git a/Doc/tools/extensions/pyspecific.py b/Doc/tools/extensions/pyspecific.py index 4575300f..92fc5e7c 100644 --- a/Doc/tools/extensions/pyspecific.py +++ b/Doc/tools/extensions/pyspecific.py @@ -43,9 +43,8 @@ except ImportError: import suspicious -ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s' -GH_ISSUE_URI = 'https://github.com/python/cpython/issues/%s' -SOURCE_URI = 'https://github.com/python/cpython/tree/3.9/%s' +ISSUE_URI = 'https://bugs.python.org/issue%s' +SOURCE_URI = 'https://github.com/python/cpython/tree/3.10/%s' # monkey-patch reST parser to disable alphabetic and roman enumerated lists from docutils.parsers.rst.states import Body @@ -59,33 +58,11 @@ Body.enum.converters['loweralpha'] = \ def issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): issue = utils.unescape(text) - # sanity check: there are no bpo issues within these two values - if 47261 < int(issue) < 400000: - msg = inliner.reporter.error(f'The BPO ID {text!r} seems too high -- ' - 'use :gh:`...` for GitHub IDs', line=lineno) - prb = inliner.problematic(rawtext, rawtext, msg) - return [prb], [msg] text = 'bpo-' + issue refnode = nodes.reference(text, text, refuri=ISSUE_URI % issue) return [refnode], [] -# Support for marking up and linking to GitHub issues - -def gh_issue_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): - issue = utils.unescape(text) - # sanity check: all GitHub issues have ID >= 32426 - # even though some of them are also valid BPO IDs - if int(issue) < 32426: - msg = inliner.reporter.error(f'The GitHub ID {text!r} seems too low -- ' - 'use :issue:`...` for BPO IDs', line=lineno) - prb = inliner.problematic(rawtext, rawtext, msg) - return [prb], [msg] - text = 'gh-' + issue - refnode = nodes.reference(text, text, refuri=GH_ISSUE_URI % issue) - return [refnode], [] - - # Support for linking to Python source files easily def source_role(typ, rawtext, text, lineno, inliner, options={}, content=[]): @@ -153,6 +130,39 @@ class Availability(Directive): # Support for documenting audit event +def audit_events_purge(app, env, docname): + """This is to remove from env.all_audit_events old traces of removed + documents. + """ + if not hasattr(env, 'all_audit_events'): + return + fresh_all_audit_events = {} + for name, event in env.all_audit_events.items(): + event["source"] = [(d, t) for d, t in event["source"] if d != docname] + if event["source"]: + # Only keep audit_events that have at least one source. + fresh_all_audit_events[name] = event + env.all_audit_events = fresh_all_audit_events + + +def audit_events_merge(app, env, docnames, other): + """In Sphinx parallel builds, this merges env.all_audit_events from + subprocesses. + + all_audit_events is a dict of names, with values like: + {'source': [(docname, target), ...], 'args': args} + """ + if not hasattr(other, 'all_audit_events'): + return + if not hasattr(env, 'all_audit_events'): + env.all_audit_events = {} + for name, value in other.all_audit_events.items(): + if name in env.all_audit_events: + env.all_audit_events[name]["source"].extend(value["source"]) + else: + env.all_audit_events[name] = value + + class AuditEvent(Directive): has_content = True @@ -385,14 +395,18 @@ class DeprecatedRemoved(Directive): translatable=False) node.append(para) env = self.state.document.settings.env - env.get_domain('changeset').note_changeset(node) + # deprecated pre-Sphinx-2 method + if hasattr(env, 'note_versionchange'): + env.note_versionchange('deprecated', version[0], node, self.lineno) + # new method + else: + env.get_domain('changeset').note_changeset(node) return [node] + messages # Support for including Misc/NEWS -issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)', re.I) -gh_issue_re = re.compile('(?:gh-issue-|gh-)([0-9]+)', re.I) +issue_re = re.compile('(?:[Ii]ssue #|bpo-)([0-9]+)') whatsnew_re = re.compile(r"(?im)^what's new in (.*?)\??$") @@ -419,9 +433,8 @@ class MiscNews(Directive): text = 'The NEWS file is not available.' node = nodes.strong(text, text) return [node] - content = issue_re.sub(r':issue:`\1`', content) - # Fallback handling for the GitHub issue - content = gh_issue_re.sub(r':gh:`\1`', content) + content = issue_re.sub(r'`bpo-\1 `__', + content) content = whatsnew_re.sub(r'\1', content) # remove first 3 lines as they are the main heading lines = ['.. default-role:: obj', ''] + content.splitlines()[3:] @@ -601,7 +614,6 @@ def process_audit_events(app, doctree, fromdocname): def setup(app): app.add_role('issue', issue_role) - app.add_role('gh', gh_issue_role) app.add_role('source', source_role) app.add_directive('impl-detail', ImplementationDetail) app.add_directive('availability', Availability) @@ -622,4 +634,6 @@ def setup(app): app.add_directive_to_domain('py', 'abstractmethod', PyAbstractMethod) app.add_directive('miscnews', MiscNews) app.connect('doctree-resolved', process_audit_events) + app.connect('env-merge-info', audit_events_merge) + app.connect('env-purge-doc', audit_events_purge) return {'version': '1.0', 'parallel_read_safe': True} diff --git a/Doc/tools/rstlint.py b/Doc/tools/rstlint.py index a3024d67..cbcb8eb8 100755 --- a/Doc/tools/rstlint.py +++ b/Doc/tools/rstlint.py @@ -13,6 +13,7 @@ import os import re import sys import getopt +from string import ascii_letters from os.path import join, splitext, abspath, exists from collections import defaultdict @@ -128,6 +129,81 @@ def check_leaked_markup(fn, lines): yield lno+1, 'possibly leaked markup: %r' % line +def hide_literal_blocks(lines): + """Tool to remove literal blocks from given lines. + + It yields empty lines in place of blocks, so line numbers are + still meaningful. + """ + in_block = False + for line in lines: + if line.endswith("::\n"): + in_block = True + elif in_block: + if line == "\n" or line.startswith(" "): + line = "\n" + else: + in_block = False + yield line + + +def type_of_explicit_markup(line): + if re.match(fr'\.\. {all_directives}::', line): + return 'directive' + if re.match(r'\.\. \[[0-9]+\] ', line): + return 'footnote' + if re.match(r'\.\. \[[^\]]+\] ', line): + return 'citation' + if re.match(r'\.\. _.*[^_]: ', line): + return 'target' + if re.match(r'\.\. \|[^\|]*\| ', line): + return 'substitution_definition' + return 'comment' + + +def hide_comments(lines): + """Tool to remove comments from given lines. + + It yields empty lines in place of comments, so line numbers are + still meaningfull. + """ + in_multiline_comment = False + for line in lines: + if line == "..\n": + in_multiline_comment = True + elif in_multiline_comment: + if line == "\n" or line.startswith(" "): + line = "\n" + else: + in_multiline_comment = False + if line.startswith(".. ") and type_of_explicit_markup(line) == 'comment': + line = "\n" + yield line + + + +@checker(".rst", severity=2) +def check_missing_surrogate_space_on_plural(fn, lines): + r"""Check for missing 'backslash-space' between a code sample a letter. + + Good: ``Point``\ s + Bad: ``Point``s + """ + in_code_sample = False + check_next_one = False + for lno, line in enumerate(hide_comments(hide_literal_blocks(lines))): + tokens = line.split("``") + for token_no, token in enumerate(tokens): + if check_next_one: + if token[0] in ascii_letters: + yield lno + 1, f"Missing backslash-space between code sample and {token!r}." + check_next_one = False + if token_no == len(tokens) - 1: + continue + if in_code_sample: + check_next_one = True + in_code_sample = not in_code_sample + def main(argv): usage = '''\ Usage: %s [-v] [-f] [-s sev] [-i path]* [path] diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 3eb3d795..54360c2f 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -110,11 +110,10 @@ howto/pyporting,,::,Programming Language :: Python :: 3 howto/regex,,::, howto/regex,,:foo,(?:foo) howto/urllib2,,:password,"""joe:password@example.com""" +library/__main__,,`, library/ast,,:upper,lower:upper library/ast,,:step,lower:upper:step library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)]," -library/bisect,32,:hi,all(val >= x for val in a[i:hi]) -library/bisect,42,:hi,all(val > x for val in a[i:hi]) library/configparser,,:home,my_dir: ${Common:home_dir}/twosheds library/configparser,,:option,${section:option} library/configparser,,:path,python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python} @@ -170,8 +169,8 @@ library/ipaddress,,::,2001:db00::0/24 library/ipaddress,,:db00,2001:db00::0/ffff:ff00:: library/ipaddress,,::,2001:db00::0/ffff:ff00:: library/itertools,,:step,elements from seq[start:stop:step] -library/itertools,,:stop,elements from seq[start:stop:step] library/itertools,,::,kernel = tuple(kernel)[::-1] +library/itertools,,:stop,elements from seq[start:stop:step] library/logging.handlers,,:port,host:port library/mmap,,:i2,obj[i1:i2] library/multiprocessing,,`,# Add more tasks using `put()` @@ -213,10 +212,7 @@ library/socket,,:can,"return (can_id, can_dlc, data[:can_dlc])" library/socket,,:len,fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) library/sqlite3,,:year,"cur.execute(""select * from lang where first_appeared=:year"", {""year"": 1972})" library/sqlite3,,:memory, -library/sqlite3,,:template,"con = sqlite3.connect(""file:template.db?mode=ro"", uri=True)" -library/sqlite3,,:nosuchdb,"con = sqlite3.connect(""file:nosuchdb.db?mode=rw"", uri=True)" -library/sqlite3,,:mem1,"con1 = sqlite3.connect(""file:mem1?mode=memory&cache=shared"", uri=True)" -library/sqlite3,,:mem1,"con2 = sqlite3.connect(""file:mem1?mode=memory&cache=shared"", uri=True)" +library/sqlite3,,:path,"db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)" library/ssl,,:My,"Organizational Unit Name (eg, section) []:My Group" library/ssl,,:My,"Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Organization, Inc." library/ssl,,:myserver,"Common Name (eg, YOUR name) []:myserver.mygroup.myorganization.com" @@ -238,6 +234,12 @@ library/tarfile,,:xz,'r:xz' library/tarfile,,:xz,'w:xz' library/time,,:mm, library/time,,:ss, +library/tkinter,,::,ttk::frame .frm -padding 10 +library/tkinter,,::,"grid [ttk::label .frm.lbl -text ""Hello World!""] -column 0 -row 0" +library/tkinter,,::,"grid [ttk::button .frm.btn -text ""Quit"" -command ""destroy .""] -column 1 -row 0" +library/tkinter,,::,ttk::frame +library/tkinter,,::,ttk::button +library/tkinter,,::,ttk::widget library/tracemalloc,,:limit,"for index, stat in enumerate(top_stats[:limit], 1):" library/turtle,,::,Example:: library/unittest,,:foo,"self.assertEqual(cm.output, ['INFO:foo:first message'," @@ -269,7 +271,6 @@ license,,:zooko,mailto:zooko@zooko.com reference/expressions,,:index,x[index:index] reference/lexical_analysis,,`,$ ? ` reference/lexical_analysis,,:fileencoding,# vim:fileencoding= -reference/datamodel,,`, """Return the result of the expression `obj[x]`""" tutorial/datastructures,,:value,It is also possible to delete a key:value tutorial/datastructures,,:value,key:value pairs within the braces adds initial key:value pairs tutorial/stdlib2,,:config,"logging.warning('Warning:config file %s not found', 'server.conf')" @@ -284,7 +285,11 @@ tutorial/stdlib2,,:start,"fields = struct.unpack(' + var GLOSSARY_PAGE = 'glossary.html'; + + jQuery(function() { + $.getJSON("_static/glossary.json", function(glossary) { + var RESULT_TEMPLATE = ''; + $("#search-results").prepend(RESULT_TEMPLATE); + + var params = $.getQueryParameters(); + if (params.q) { + var search_param = params.q[0].toLowerCase(); + var glossary_item = glossary[search_param]; + if (glossary_item) { + var resultDiv = $("#glossary-result"); + + // set up the title text with a link to the glossary page + resultDiv.find(".glossary-title").text('Glossary: ' + glossary_item.title); + var link_target = search_param.replace(/ /g, '-'); + resultDiv.find(".glossary-title").attr( + 'href', GLOSSARY_PAGE + '#term-' + link_target + ); + + // rewrite any anchor links (to other glossary terms) + // to have a full reference to the glossary page + var body = $(glossary_item.body).children(); + body.find("a[href^='#']").each(function() { + var current_url = $(this).attr('href'); + $(this).attr('href', GLOSSARY_PAGE + current_url); + }); + resultDiv.find(".glossary-body").html(body); + + resultDiv.show(); + } else { + $("#glossary-result").hide(''); + } + } + }); + }); + +{% endblock %} \ No newline at end of file diff --git a/Doc/tutorial/classes.rst b/Doc/tutorial/classes.rst index f44cb0b4..0d780e3b 100644 --- a/Doc/tutorial/classes.rst +++ b/Doc/tutorial/classes.rst @@ -797,7 +797,7 @@ using the :func:`next` built-in function; this example shows how it all works:: >>> s = 'abc' >>> it = iter(s) >>> it - + >>> next(it) 'a' >>> next(it) diff --git a/Doc/tutorial/controlflow.rst b/Doc/tutorial/controlflow.rst index 289d4423..fb3b140f 100644 --- a/Doc/tutorial/controlflow.rst +++ b/Doc/tutorial/controlflow.rst @@ -36,6 +36,9 @@ to avoid excessive indentation. An :keyword:`!if` ... :keyword:`!elif` ... :keyword:`!elif` ... sequence is a substitute for the ``switch`` or ``case`` statements found in other languages. +If you're comparing the same value to several constants, or checking for specific types or +attributes, you may also find the :keyword:`!match` statement useful. For more +details see :ref:`tut-match`. .. _tut-for: @@ -70,6 +73,9 @@ Code that modifies a collection while iterating over that same collection can be tricky to get right. Instead, it is usually more straight-forward to loop over a copy of the collection or to create a new collection:: + # Create a sample collection + users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'} + # Strategy: Iterate over a copy for user, status in users.copy().items(): if status == 'inactive': @@ -238,6 +244,172 @@ at a more abstract level. The :keyword:`!pass` is silently ignored:: ... pass # Remember to implement this! ... + +.. _tut-match: + +:keyword:`!match` Statements +============================ + +A match statement takes an expression and compares its value to successive +patterns given as one or more case blocks. This is superficially +similar to a switch statement in C, Java or JavaScript (and many +other languages), but it can also extract components (sequence elements or +object attributes) from the value into variables. + +The simplest form compares a subject value against one or more literals:: + + def http_error(status): + match status: + case 400: + return "Bad request" + case 404: + return "Not found" + case 418: + return "I'm a teapot" + case _: + return "Something's wrong with the internet" + +Note the last block: the "variable name" ``_`` acts as a *wildcard* and +never fails to match. If no case matches, none of the branches is executed. + +You can combine several literals in a single pattern using ``|`` ("or"):: + + case 401 | 403 | 404: + return "Not allowed" + +Patterns can look like unpacking assignments, and can be used to bind +variables:: + + # point is an (x, y) tuple + match point: + case (0, 0): + print("Origin") + case (0, y): + print(f"Y={y}") + case (x, 0): + print(f"X={x}") + case (x, y): + print(f"X={x}, Y={y}") + case _: + raise ValueError("Not a point") + +Study that one carefully! The first pattern has two literals, and can +be thought of as an extension of the literal pattern shown above. But +the next two patterns combine a literal and a variable, and the +variable *binds* a value from the subject (``point``). The fourth +pattern captures two values, which makes it conceptually similar to +the unpacking assignment ``(x, y) = point``. + +If you are using classes to structure your data +you can use the class name followed by an argument list resembling a +constructor, but with the ability to capture attributes into variables:: + + class Point: + x: int + y: int + + def where_is(point): + match point: + case Point(x=0, y=0): + print("Origin") + case Point(x=0, y=y): + print(f"Y={y}") + case Point(x=x, y=0): + print(f"X={x}") + case Point(): + print("Somewhere else") + case _: + print("Not a point") + +You can use positional parameters with some builtin classes that provide an +ordering for their attributes (e.g. dataclasses). You can also define a specific +position for attributes in patterns by setting the ``__match_args__`` special +attribute in your classes. If it's set to ("x", "y"), the following patterns are all +equivalent (and all bind the ``y`` attribute to the ``var`` variable):: + + Point(1, var) + Point(1, y=var) + Point(x=1, y=var) + Point(y=var, x=1) + +A recommended way to read patterns is to look at them as an extended form of what you +would put on the left of an assignment, to understand which variables would be set to +what. +Only the standalone names (like ``var`` above) are assigned to by a match statement. +Dotted names (like ``foo.bar``), attribute names (the ``x=`` and ``y=`` above) or class names +(recognized by the "(...)" next to them like ``Point`` above) are never assigned to. + +Patterns can be arbitrarily nested. For example, if we have a short +list of points, we could match it like this:: + + match points: + case []: + print("No points") + case [Point(0, 0)]: + print("The origin") + case [Point(x, y)]: + print(f"Single point {x}, {y}") + case [Point(0, y1), Point(0, y2)]: + print(f"Two on the Y axis at {y1}, {y2}") + case _: + print("Something else") + +We can add an ``if`` clause to a pattern, known as a "guard". If the +guard is false, ``match`` goes on to try the next case block. Note +that value capture happens before the guard is evaluated:: + + match point: + case Point(x, y) if x == y: + print(f"Y=X at {x}") + case Point(x, y): + print(f"Not on the diagonal") + +Several other key features of this statement: + +- Like unpacking assignments, tuple and list patterns have exactly the + same meaning and actually match arbitrary sequences. An important + exception is that they don't match iterators or strings. + +- Sequence patterns support extended unpacking: ``[x, y, *rest]`` and ``(x, y, + *rest)`` work similar to unpacking assignments. The + name after ``*`` may also be ``_``, so ``(x, y, *_)`` matches a sequence + of at least two items without binding the remaining items. + +- Mapping patterns: ``{"bandwidth": b, "latency": l}`` captures the + ``"bandwidth"`` and ``"latency"`` values from a dictionary. Unlike sequence + patterns, extra keys are ignored. An unpacking like ``**rest`` is also + supported. (But ``**_`` would be redundant, so it not allowed.) + +- Subpatterns may be captured using the ``as`` keyword:: + + case (Point(x1, y1), Point(x2, y2) as p2): ... + + will capture the second element of the input as ``p2`` (as long as the input is + a sequence of two points) + +- Most literals are compared by equality, however the singletons ``True``, + ``False`` and ``None`` are compared by identity. + +- Patterns may use named constants. These must be dotted names + to prevent them from being interpreted as capture variable:: + + from enum import Enum + class Color(Enum): + RED = 0 + GREEN = 1 + BLUE = 2 + + match color: + case Color.RED: + print("I see red!") + case Color.GREEN: + print("Grass is green") + case Color.BLUE: + print("I'm feeling the blues :(") + +For a more detailed explanation and additional examples, you can look into +:pep:`636` which is written in a tutorial format. + .. _tut-functions: Defining Functions @@ -710,7 +882,7 @@ zero or more normal arguments may occur. :: file.write(separator.join(args)) -Normally, these *variadic* arguments will be last in the list of formal +Normally, these ``variadic`` arguments will be last in the list of formal parameters, because they scoop up all remaining input arguments that are passed to the function. Any formal parameters which occur after the ``*args`` parameter are 'keyword-only' arguments, meaning that they can only be used as diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index 542593ce..f2490d65 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -101,29 +101,29 @@ The :keyword:`try` statement works as follows. * If no exception occurs, the *except clause* is skipped and execution of the :keyword:`try` statement is finished. -* If an exception occurs during execution of the try clause, the rest of the - clause is skipped. Then if its type matches the exception named after the - :keyword:`except` keyword, the except clause is executed, and then execution - continues after the :keyword:`try` statement. +* If an exception occurs during execution of the :keyword:`try` clause, the rest of the + clause is skipped. Then, if its type matches the exception named after the + :keyword:`except` keyword, the *except clause* is executed, and then execution + continues after the try/except block. -* If an exception occurs which does not match the exception named in the except - clause, it is passed on to outer :keyword:`try` statements; if no handler is +* If an exception occurs which does not match the exception named in the *except + clause*, it is passed on to outer :keyword:`try` statements; if no handler is found, it is an *unhandled exception* and execution stops with a message as shown above. -A :keyword:`try` statement may have more than one except clause, to specify +A :keyword:`try` statement may have more than one *except clause*, to specify handlers for different exceptions. At most one handler will be executed. -Handlers only handle exceptions that occur in the corresponding try clause, not -in other handlers of the same :keyword:`!try` statement. An except clause may -name multiple exceptions as a parenthesized tuple, for example:: +Handlers only handle exceptions that occur in the corresponding *try clause*, +not in other handlers of the same :keyword:`!try` statement. An *except clause* +may name multiple exceptions as a parenthesized tuple, for example:: ... except (RuntimeError, TypeError, NameError): ... pass A class in an :keyword:`except` clause is compatible with an exception if it is the same class or a base class thereof (but not the other way around --- an -except clause listing a derived class is not compatible with a base class). For -example, the following code will print B, C, D in that order:: +*except clause* listing a derived class is not compatible with a base class). +For example, the following code will print B, C, D in that order:: class B(Exception): pass @@ -144,13 +144,13 @@ example, the following code will print B, C, D in that order:: except B: print("B") -Note that if the except clauses were reversed (with ``except B`` first), it -would have printed B, B, B --- the first matching except clause is triggered. +Note that if the *except clauses* were reversed (with ``except B`` first), it +would have printed B, B, B --- the first matching *except clause* is triggered. -The last except clause may omit the exception name(s), to serve as a wildcard. -Use this with extreme caution, since it is easy to mask a real programming error -in this way! It can also be used to print an error message and then re-raise -the exception (allowing a caller to handle the exception as well):: +All exceptions inherit from :exc:`BaseException`, and so it can be used to serve +as a wildcard. Use this with extreme caution, since it is easy to mask a real +programming error in this way! It can also be used to print an error message and +then re-raise the exception (allowing a caller to handle the exception as well):: import sys @@ -162,14 +162,17 @@ the exception (allowing a caller to handle the exception as well):: print("OS error: {0}".format(err)) except ValueError: print("Could not convert data to an integer.") - except: - print("Unexpected error:", sys.exc_info()[0]) + except BaseException as err: + print(f"Unexpected {err=}, {type(err)=}") raise +Alternatively the last except clause may omit the exception name(s), however the exception +value must then be retrieved from ``sys.exc_info()[1]``. + The :keyword:`try` ... :keyword:`except` statement has an optional *else -clause*, which, when present, must follow all except clauses. It is useful for -code that must be executed if the try clause does not raise an exception. For -example:: +clause*, which, when present, must follow all *except clauses*. It is useful +for code that must be executed if the *try clause* does not raise an exception. +For example:: for arg in sys.argv[1:]: try: @@ -189,7 +192,7 @@ When an exception occurs, it may have an associated value, also known as the exception's *argument*. The presence and type of the argument depend on the exception type. -The except clause may specify a variable after the exception name. The +The *except clause* may specify a variable after the exception name. The variable is bound to an exception instance with the arguments stored in ``instance.args``. For convenience, the exception instance defines :meth:`__str__` so the arguments can be printed directly without having to @@ -217,8 +220,8 @@ If an exception has arguments, they are printed as the last part ('detail') of the message for unhandled exceptions. Exception handlers don't just handle exceptions if they occur immediately in the -try clause, but also if they occur inside functions that are called (even -indirectly) in the try clause. For example:: +*try clause*, but also if they occur inside functions that are called (even +indirectly) in the *try clause*. For example:: >>> def this_fails(): ... x = 1/0 @@ -281,17 +284,17 @@ chaining exceptions. For example:: This can be useful when you are transforming exceptions. For example:: >>> def func(): - ... raise IOError + ... raise ConnectionError ... >>> try: ... func() - ... except IOError as exc: + ... except ConnectionError as exc: ... raise RuntimeError('Failed to open database') from exc ... Traceback (most recent call last): File "", line 2, in File "", line 2, in func - OSError + ConnectionError The above exception was the direct cause of the following exception: @@ -300,7 +303,7 @@ This can be useful when you are transforming exceptions. For example:: RuntimeError: Failed to open database Exception chaining happens automatically when an exception is raised inside an -:keyword:`except` or :keyword:`finally` section. Exception chaining can be +:keyword:`except` or :keyword:`finally` section. This can be disabled by using ``from None`` idiom: >>> try: @@ -326,7 +329,41 @@ be derived from the :exc:`Exception` class, either directly or indirectly. Exception classes can be defined which do anything any other class can do, but are usually kept simple, often only offering a number of attributes that allow -information about the error to be extracted by handlers for the exception. +information about the error to be extracted by handlers for the exception. When +creating a module that can raise several distinct errors, a common practice is +to create a base class for exceptions defined by that module, and subclass that +to create specific exception classes for different error conditions:: + + class Error(Exception): + """Base class for exceptions in this module.""" + pass + + class InputError(Error): + """Exception raised for errors in the input. + + Attributes: + expression -- input expression in which the error occurred + message -- explanation of the error + """ + + def __init__(self, expression, message): + self.expression = expression + self.message = message + + class TransitionError(Error): + """Raised when an operation attempts a state transition that's not + allowed. + + Attributes: + previous -- state at beginning of transition + next -- attempted new state + message -- explanation of why the specific transition is not allowed + """ + + def __init__(self, previous, next, message): + self.previous = previous + self.next = next + self.message = message Most exceptions are defined with names that end in "Error", similar to the naming of the standard exceptions. @@ -459,5 +496,3 @@ used in a way that ensures they are always cleaned up promptly and correctly. :: After the statement is executed, the file *f* is always closed, even if a problem was encountered while processing the lines. Objects which, like files, provide predefined clean-up actions will indicate this in their documentation. - - diff --git a/Doc/tutorial/floatingpoint.rst b/Doc/tutorial/floatingpoint.rst index 7212b40b..b98de6e5 100644 --- a/Doc/tutorial/floatingpoint.rst +++ b/Doc/tutorial/floatingpoint.rst @@ -133,7 +133,7 @@ with inexact values become comparable to one another:: Binary floating-point arithmetic holds many surprises like this. The problem with "0.1" is explained in precise detail below, in the "Representation Error" -section. See `The Perils of Floating Point `_ +section. See `The Perils of Floating Point `_ for a more complete account of other common surprises. As that says near the end, "there are no easy answers." Still, don't be unduly diff --git a/Doc/tutorial/index.rst b/Doc/tutorial/index.rst index 8ee011e2..96791f88 100644 --- a/Doc/tutorial/index.rst +++ b/Doc/tutorial/index.rst @@ -11,7 +11,7 @@ together with its interpreted nature, make it an ideal language for scripting and rapid application development in many areas on most platforms. The Python interpreter and the extensive standard library are freely available -in source or binary form for all major platforms from the Python Web site, +in source or binary form for all major platforms from the Python web site, https://www.python.org/, and may be freely distributed. The same site also contains distributions of and pointers to many free third party Python modules, programs and tools, and additional documentation. diff --git a/Doc/tutorial/inputoutput.rst b/Doc/tutorial/inputoutput.rst index b5006365..7f83c4d4 100644 --- a/Doc/tutorial/inputoutput.rst +++ b/Doc/tutorial/inputoutput.rst @@ -279,12 +279,11 @@ Reading and Writing Files object: file :func:`open` returns a :term:`file object`, and is most commonly used with -two positional arguments and one keyword argument: -``open(filename, mode, encoding=None)`` +two arguments: ``open(filename, mode)``. :: - >>> f = open('workfile', 'w', encoding="utf-8") + >>> f = open('workfile', 'w') .. XXX str(f) is @@ -301,14 +300,11 @@ writing. The *mode* argument is optional; ``'r'`` will be assumed if it's omitted. Normally, files are opened in :dfn:`text mode`, that means, you read and write -strings from and to the file, which are encoded in a specific *encoding*. -If *encoding* is not specified, the default is platform dependent -(see :func:`open`). -Because UTF-8 is the modern de-facto standard, ``encoding="utf-8"`` is -recommended unless you know that you need to use a different encoding. -Appending a ``'b'`` to the mode opens the file in :dfn:`binary mode`. -Binary mode data is read and written as :class:`bytes` objects. -You can not specify *encoding* when opening file in binary mode. +strings from and to the file, which are encoded in a specific encoding. If +encoding is not specified, the default is platform dependent (see +:func:`open`). ``'b'`` appended to the mode opens the file in +:dfn:`binary mode`: now the data is read and written in the form of bytes +objects. This mode should be used for all files that don't contain text. In text mode, the default when reading is to convert platform-specific line endings (``\n`` on Unix, ``\r\n`` on Windows) to just ``\n``. When writing in @@ -324,7 +320,7 @@ after its suite finishes, even if an exception is raised at some point. Using :keyword:`!with` is also much shorter than writing equivalent :keyword:`try`\ -\ :keyword:`finally` blocks:: - >>> with open('workfile', encoding="utf-8") as f: + >>> with open('workfile') as f: ... read_data = f.read() >>> # We can check that the file has been automatically closed. @@ -494,15 +490,11 @@ simply serializes the object to a :term:`text file`. So if ``f`` is a json.dump(x, f) -To decode the object again, if ``f`` is a :term:`binary file` or -:term:`text file` object which has been opened for reading:: +To decode the object again, if ``f`` is a :term:`text file` object which has +been opened for reading:: x = json.load(f) -.. note:: - JSON files must be encoded in UTF-8. Use ``encoding="utf-8"`` when opening - JSON file as a :term:`text file` for both of reading and writing. - This simple serialization technique can handle lists and dictionaries, but serializing arbitrary class instances in JSON requires a bit of extra effort. The reference for the :mod:`json` module contains an explanation of this. diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst index b78d2960..d2733a99 100644 --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -10,13 +10,13 @@ Using the Python Interpreter Invoking the Interpreter ======================== -The Python interpreter is usually installed as :file:`/usr/local/bin/python3.9` +The Python interpreter is usually installed as :file:`/usr/local/bin/python3.10` on those machines where it is available; putting :file:`/usr/local/bin` in your Unix shell's search path makes it possible to start it by typing the command: .. code-block:: text - python3.9 + python3.10 to the shell. [#]_ Since the choice of the directory where the interpreter lives is an installation option, other places are possible; check with your local @@ -24,7 +24,7 @@ Python guru or system administrator. (E.g., :file:`/usr/local/python` is a popular alternative location.) On Windows machines where you have installed Python from the :ref:`Microsoft Store -`, the :file:`python3.9` command will be available. If you have +`, the :file:`python3.10` command will be available. If you have the :ref:`py.exe launcher ` installed, you can use the :file:`py` command. See :ref:`setting-envvars` for other ways to launch Python. @@ -97,8 +97,8 @@ before printing the first prompt: .. code-block:: shell-session - $ python3.9 - Python 3.9 (default, June 4 2019, 09:25:04) + $ python3.10 + Python 3.10 (default, June 4 2019, 09:25:04) [GCC 4.8.2] on linux Type "help", "copyright", "credits" or "license" for more information. >>> diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 33678f5a..8763626e 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -11,13 +11,6 @@ with a prompt are output from the interpreter. Note that a secondary prompt on a line by itself in an example means you must type a blank line; this is used to end a multi-line command. -.. only:: html - - You can toggle the display of prompts and output by clicking on ``>>>`` - in the upper-right corner of an example box. If you hide the prompts - and output for an example, then you can easily copy and paste the input - lines into your interpreter. - .. index:: single: # (hash); comment Many of the examples in this manual, even those entered at the interactive diff --git a/Doc/tutorial/modules.rst b/Doc/tutorial/modules.rst index c5cca917..f1d4957e 100644 --- a/Doc/tutorial/modules.rst +++ b/Doc/tutorial/modules.rst @@ -183,8 +183,7 @@ The Module Search Path .. index:: triple: module; search; path When a module named :mod:`spam` is imported, the interpreter first searches for -a built-in module with that name. These module names are listed in -:data:`sys.builtin_module_names`. If not found, it then searches for a file +a built-in module with that name. If not found, it then searches for a file named :file:`spam.py` in a list of directories given by the variable :data:`sys.path`. :data:`sys.path` is initialized from these locations: @@ -505,7 +504,7 @@ code:: __all__ = ["echo", "surround", "reverse"] This would mean that ``from sound.effects import *`` would import the three -named submodules of the :mod:`sound.effects` package. +named submodules of the :mod:`sound` package. If ``__all__`` is not defined, the statement ``from sound.effects import *`` does *not* import all submodules from the package :mod:`sound.effects` into the @@ -535,6 +534,8 @@ importing module needs to use submodules with the same name from different packages. +.. _intra-package-references: + Intra-package References ------------------------ diff --git a/Doc/tutorial/stdlib.rst b/Doc/tutorial/stdlib.rst index 32dda97c..f33265cd 100644 --- a/Doc/tutorial/stdlib.rst +++ b/Doc/tutorial/stdlib.rst @@ -15,7 +15,7 @@ operating system:: >>> import os >>> os.getcwd() # Return the current working directory - 'C:\\Python39' + 'C:\\Python310' >>> os.chdir('/server/accesslogs') # Change current working directory >>> os.system('mkdir today') # Run the command mkdir in the system shell 0 @@ -78,9 +78,8 @@ and an optional number of lines to be displayed:: import argparse - parser = argparse.ArgumentParser( - prog='top', - description='Show top lines from each file') + parser = argparse.ArgumentParser(prog = 'top', + description = 'Show top lines from each file') parser.add_argument('filenames', nargs='+') parser.add_argument('-l', '--lines', type=int, default=10) args = parser.parse_args() @@ -179,13 +178,13 @@ protocols. Two of the simplest are :mod:`urllib.request` for retrieving data from URLs and :mod:`smtplib` for sending mail:: >>> from urllib.request import urlopen - >>> with urlopen('http://worldtimeapi.org/api/timezone/etc/UTC.txt') as response: + >>> with urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl') as response: ... for line in response: - ... line = line.decode() # Convert bytes to a str - ... if line.startswith('datetime'): - ... print(line.rstrip()) # Remove trailing newline - ... - datetime: 2022-01-01T01:36:47.689215+00:00 + ... line = line.decode('utf-8') # Decoding the binary data to text. + ... if 'EST' in line or 'EDT' in line: # look for Eastern Time + ... print(line) + +
Nov. 25, 09:43:32 PM EST >>> import smtplib >>> server = smtplib.SMTP('localhost') @@ -327,7 +326,7 @@ Python has a "batteries included" philosophy. This is best seen through the sophisticated and robust capabilities of its larger packages. For example: * The :mod:`xmlrpc.client` and :mod:`xmlrpc.server` modules make implementing - remote procedure calls into an almost trivial task. Despite the modules' + remote procedure calls into an almost trivial task. Despite the modules names, no direct knowledge or handling of XML is needed. * The :mod:`email` package is a library for managing email messages, including diff --git a/Doc/tutorial/stdlib2.rst b/Doc/tutorial/stdlib2.rst index 29948285..298034d3 100644 --- a/Doc/tutorial/stdlib2.rst +++ b/Doc/tutorial/stdlib2.rst @@ -278,7 +278,7 @@ applications include caching objects that are expensive to create:: Traceback (most recent call last): File "", line 1, in d['primary'] # entry was automatically removed - File "C:/python39/lib/weakref.py", line 46, in __getitem__ + File "C:/python310/lib/weakref.py", line 46, in __getitem__ o = self.data[key]() KeyError: 'primary' diff --git a/Doc/tutorial/venv.rst b/Doc/tutorial/venv.rst index 2782db9d..221c11ca 100644 --- a/Doc/tutorial/venv.rst +++ b/Doc/tutorial/venv.rst @@ -48,7 +48,7 @@ place it, and run the :mod:`venv` module as a script with the directory path:: This will create the ``tutorial-env`` directory if it doesn't exist, and also create directories inside it containing a copy of the Python -interpreter, the standard library, and various supporting files. +interpreter and various supporting files. A common directory location for a virtual environment is ``.venv``. This name keeps the directory typically hidden in your shell and thus diff --git a/Doc/tutorial/whatnow.rst b/Doc/tutorial/whatnow.rst index 32082013..18805da9 100644 --- a/Doc/tutorial/whatnow.rst +++ b/Doc/tutorial/whatnow.rst @@ -30,8 +30,8 @@ the set are: More Python resources: -* https://www.python.org: The major Python Web site. It contains code, - documentation, and pointers to Python-related pages around the Web. This Web +* https://www.python.org: The major Python web site. It contains code, + documentation, and pointers to Python-related pages around the web. This web site is mirrored in various places around the world, such as Europe, Japan, and Australia; a mirror may be faster than the main site, depending on your geographical location. diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst index 66d8d57a..c4f65eb6 100644 --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -369,31 +369,19 @@ Miscellaneous options (filename or built-in module) from which it is loaded. When given twice (:option:`!-vv`), print a message for each file that is checked for when searching for a module. Also provides information on module cleanup at exit. + + .. versionchanged:: 3.10 + The :mod:`site` module reports the site-specific paths + and :file:`.pth` files being processed. + See also :envvar:`PYTHONVERBOSE`. .. _using-on-warnings: .. cmdoption:: -W arg - Warning control. Python's warning machinery by default prints warning - messages to :data:`sys.stderr`. A typical warning message has the following - form: - - .. code-block:: none - - file:line: category: message - - By default, each warning is printed once for each source line where it - occurs. This option controls how often warnings are printed. - - Multiple :option:`-W` options may be given; when a warning matches more than - one option, the action for the last matching option is performed. Invalid - :option:`-W` options are ignored (though, a warning message is printed about - invalid options when the first warning is issued). - - Warnings can also be controlled using the :envvar:`PYTHONWARNINGS` - environment variable and from within a Python program using the - :mod:`warnings` module. + Warning control. Python's warning machinery by default prints warning + messages to :data:`sys.stderr`. The simplest settings apply a particular action unconditionally to all warnings emitted by a process (even those that are otherwise ignored by @@ -406,14 +394,48 @@ Miscellaneous options -Wonce # Warn once per Python process -Wignore # Never warn - The action names can be abbreviated as desired (e.g. ``-Wi``, ``-Wd``, - ``-Wa``, ``-We``) and the interpreter will resolve them to the appropriate - action name. + The action names can be abbreviated as desired and the interpreter will + resolve them to the appropriate action name. For example, ``-Wi`` is the + same as ``-Wignore``. + + The full form of argument is:: + + action:message:category:module:lineno + + Empty fields match all values; trailing empty fields may be omitted. For + example ``-W ignore::DeprecationWarning`` ignores all DeprecationWarning + warnings. + + The *action* field is as explained above but only applies to warnings that + match the remaining fields. + + The *message* field must match the whole warning message; this match is + case-insensitive. + + The *category* field matches the warning category + (ex: ``DeprecationWarning``). This must be a class name; the match test + whether the actual warning category of the message is a subclass of the + specified warning category. + + The *module* field matches the (fully-qualified) module name; this match is + case-sensitive. + + The *lineno* field matches the line number, where zero matches all line + numbers and is thus equivalent to an omitted line number. + + Multiple :option:`-W` options can be given; when a warning matches more than + one option, the action for the last matching option is performed. Invalid + :option:`-W` options are ignored (though, a warning message is printed about + invalid options when the first warning is issued). + + Warnings can also be controlled using the :envvar:`PYTHONWARNINGS` + environment variable and from within a Python program using the + :mod:`warnings` module. For example, the :func:`warnings.filterwarnings` + function can be used to use a regular expression on the warning message. See :ref:`warning-filter` and :ref:`describing-warning-filters` for more details. - .. cmdoption:: -x Skip the first line of the source, allowing use of non-Unix forms of @@ -426,19 +448,15 @@ Miscellaneous options defines the following possible values: * ``-X faulthandler`` to enable :mod:`faulthandler`; - * ``-X oldparser``: enable the traditional LL(1) parser. See also - :envvar:`PYTHONOLDPARSER` and :pep:`617`. * ``-X showrefcount`` to output the total reference count and number of used memory blocks when the program finishes or after each statement in the - interactive interpreter. This only works on debug builds. + interactive interpreter. This only works on :ref:`debug builds + `. * ``-X tracemalloc`` to start tracing Python memory allocations using the :mod:`tracemalloc` module. By default, only the most recent frame is stored in a traceback of a trace. Use ``-X tracemalloc=NFRAME`` to start tracing with a traceback limit of *NFRAME* frames. See the :func:`tracemalloc.start` for more information. - * ``-X int_max_str_digits`` configures the :ref:`integer string conversion - length limitation `. See also - :envvar:`PYTHONINTMAXSTRDIGITS`. * ``-X importtime`` to show how long each import takes. It shows module name, cumulative time (including nested imports) and self time (excluding nested imports). Note that its output may be broken in multi-threaded @@ -447,13 +465,15 @@ Miscellaneous options * ``-X dev``: enable :ref:`Python Development Mode `, introducing additional runtime checks that are too expensive to be enabled by default. - * ``-X utf8`` enables UTF-8 mode for operating system interfaces, overriding - the default locale-aware mode. ``-X utf8=0`` explicitly disables UTF-8 - mode (even when it would otherwise activate automatically). - See :envvar:`PYTHONUTF8` for more details. + * ``-X utf8`` enables the :ref:`Python UTF-8 Mode `. + ``-X utf8=0`` explicitly disables :ref:`Python UTF-8 Mode ` + (even when it would otherwise activate automatically). * ``-X pycache_prefix=PATH`` enables writing ``.pyc`` files to a parallel tree rooted at the given directory instead of to the code tree. See also :envvar:`PYTHONPYCACHEPREFIX`. + * ``-X warn_default_encoding`` issues a :class:`EncodingWarning` when the + locale-specific default encoding is used for opening files. + See also :envvar:`PYTHONWARNDEFAULTENCODING`. It also allows passing arbitrary values and retrieving them through the :data:`sys._xoptions` dictionary. @@ -483,8 +503,8 @@ Miscellaneous options The ``-X showalloccount`` option has been removed. - .. versionadded:: 3.9.14 - The ``-X int_max_str_digits`` option. + .. versionadded:: 3.10 + The ``-X warn_default_encoding`` option. .. deprecated-removed:: 3.9 3.10 The ``-X oldparser`` option. @@ -593,15 +613,6 @@ conflict. :option:`-d` multiple times. -.. envvar:: PYTHONOLDPARSER - - If this is set to a non-empty string, enable the traditional LL(1) parser. - - See also the :option:`-X` ``oldparser`` option and :pep:`617`. - - .. deprecated-removed:: 3.9 3.10 - - .. envvar:: PYTHONINSPECT If this is set to a non-empty string it is equivalent to specifying the @@ -665,13 +676,6 @@ conflict. .. versionadded:: 3.2.3 -.. envvar:: PYTHONINTMAXSTRDIGITS - - If this variable is set to an integer, it is used to configure the - interpreter's global :ref:`integer string conversion length limitation - `. - - .. versionadded:: 3.9.14 .. envvar:: PYTHONIOENCODING @@ -795,17 +799,13 @@ conflict. :c:data:`PYMEM_DOMAIN_MEM` and :c:data:`PYMEM_DOMAIN_OBJ` domains and use the :c:func:`malloc` function for the :c:data:`PYMEM_DOMAIN_RAW` domain. - Install debug hooks: + Install :ref:`debug hooks `: * ``debug``: install debug hooks on top of the :ref:`default memory allocators `. * ``malloc_debug``: same as ``malloc`` but also install debug hooks. * ``pymalloc_debug``: same as ``pymalloc`` but also install debug hooks. - See the :ref:`default memory allocators ` and the - :c:func:`PyMem_SetupDebugHooks` function (install debug hooks on Python - memory allocators). - .. versionchanged:: 3.7 Added the ``"default"`` allocator. @@ -829,9 +829,10 @@ conflict. .. envvar:: PYTHONLEGACYWINDOWSFSENCODING - If set to a non-empty string, the default filesystem encoding and errors mode - will revert to their pre-3.6 values of 'mbcs' and 'replace', respectively. - Otherwise, the new defaults 'utf-8' and 'surrogatepass' are used. + If set to a non-empty string, the default :term:`filesystem encoding and + error handler` mode will revert to their pre-3.6 values of 'mbcs' and + 'replace', respectively. Otherwise, the new defaults 'utf-8' and + 'surrogatepass' are used. This may also be enabled at runtime with :func:`sys._enablelegacywindowsfsencoding()`. @@ -917,66 +918,35 @@ conflict. .. envvar:: PYTHONUTF8 - If set to ``1``, enables the interpreter's UTF-8 mode, where ``UTF-8`` is - used as the text encoding for system interfaces, regardless of the - current locale setting. + If set to ``1``, enable the :ref:`Python UTF-8 Mode `. - This means that: - - * :func:`sys.getfilesystemencoding()` returns ``'UTF-8'`` (the locale - encoding is ignored). - * :func:`locale.getpreferredencoding()` returns ``'UTF-8'`` (the locale - encoding is ignored, and the function's ``do_setlocale`` parameter has no - effect). - * :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` all use - UTF-8 as their text encoding, with the ``surrogateescape`` - :ref:`error handler ` being enabled for :data:`sys.stdin` - and :data:`sys.stdout` (:data:`sys.stderr` continues to use - ``backslashreplace`` as it does in the default locale-aware mode) - - As a consequence of the changes in those lower level APIs, other higher - level APIs also exhibit different default behaviours: - - * Command line arguments, environment variables and filenames are decoded - to text using the UTF-8 encoding. - * :func:`os.fsdecode()` and :func:`os.fsencode()` use the UTF-8 encoding. - * :func:`open()`, :func:`io.open()`, and :func:`codecs.open()` use the UTF-8 - encoding by default. However, they still use the strict error handler by - default so that attempting to open a binary file in text mode is likely - to raise an exception rather than producing nonsense data. - - Note that the standard stream settings in UTF-8 mode can be overridden by - :envvar:`PYTHONIOENCODING` (just as they can be in the default locale-aware - mode). - - If set to ``0``, the interpreter runs in its default locale-aware mode. + If set to ``0``, disable the :ref:`Python UTF-8 Mode `. Setting any other non-empty string causes an error during interpreter initialisation. - If this environment variable is not set at all, then the interpreter defaults - to using the current locale settings, *unless* the current locale is - identified as a legacy ASCII-based locale - (as described for :envvar:`PYTHONCOERCECLOCALE`), and locale coercion is - either disabled or fails. In such legacy locales, the interpreter will - default to enabling UTF-8 mode unless explicitly instructed not to do so. + .. versionadded:: 3.7 - Also available as the :option:`-X` ``utf8`` option. +.. envvar:: PYTHONWARNDEFAULTENCODING - .. versionadded:: 3.7 - See :pep:`540` for more details. + If this environment variable is set to a non-empty string, issue a + :class:`EncodingWarning` when the locale-specific default encoding is used. + + See :ref:`io-encoding-warning` for details. + + .. versionadded:: 3.10 Debug-mode variables ~~~~~~~~~~~~~~~~~~~~ -Setting these variables only has an effect in a debug build of Python. - .. envvar:: PYTHONTHREADDEBUG - If set, Python will print threading debug info. + If set, Python will print threading debug info into stdout. + + Need a :ref:`debug build of Python `. - Need Python configured with the ``--with-pydebug`` build option. + .. deprecated-removed:: 3.10 3.12 .. envvar:: PYTHONDUMPREFS @@ -984,4 +954,4 @@ Setting these variables only has an effect in a debug build of Python. If set, Python will dump objects and reference counts still alive after shutting down the interpreter. - Need Python configured with the ``--with-trace-refs`` build option. + Need Python configured with the :option:`--with-trace-refs` build option. diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst new file mode 100644 index 00000000..177f25f3 --- /dev/null +++ b/Doc/using/configure.rst @@ -0,0 +1,816 @@ +**************** +Configure Python +**************** + +.. _configure-options: + +Configure Options +================= + +List all ``./configure`` script options using:: + + ./configure --help + +See also the :file:`Misc/SpecialBuilds.txt` in the Python source distribution. + +General Options +--------------- + +.. cmdoption:: --enable-loadable-sqlite-extensions + + Support loadable extensions in the :mod:`_sqlite` extension module (default + is no). + + See the :meth:`sqlite3.Connection.enable_load_extension` method of the + :mod:`sqlite3` module. + + .. versionadded:: 3.6 + +.. cmdoption:: --disable-ipv6 + + Disable IPv6 support (enabled by default if supported), see the + :mod:`socket` module. + +.. cmdoption:: --enable-big-digits=[15|30] + + Define the size in bits of Python :class:`int` digits: 15 or 30 bits. + + By default, the number of bits is selected depending on ``sizeof(void*)``: + 30 bits if ``void*`` size is 64-bit or larger, 15 bits otherwise. + + Define the ``PYLONG_BITS_IN_DIGIT`` to ``15`` or ``30``. + + See :data:`sys.int_info.bits_per_digit `. + +.. cmdoption:: --with-cxx-main +.. cmdoption:: --with-cxx-main=COMPILER + + Compile the Python ``main()`` function and link Python executable with C++ + compiler: ``$CXX``, or *COMPILER* if specified. + +.. cmdoption:: --with-suffix=SUFFIX + + Set the Python executable suffix to *SUFFIX*. + + The default suffix is ``.exe`` on Windows and macOS (``python.exe`` + executable), and an empty string on other platforms (``python`` executable). + +.. cmdoption:: --with-tzpath= + + Select the default time zone search path for :data:`zoneinfo.TZPATH`. + See the :ref:`Compile-time configuration + ` of the :mod:`zoneinfo` module. + + Default: ``/usr/share/zoneinfo:/usr/lib/zoneinfo:/usr/share/lib/zoneinfo:/etc/zoneinfo``. + + See :data:`os.pathsep` path separator. + + .. versionadded:: 3.9 + +.. cmdoption:: --without-decimal-contextvar + + Build the ``_decimal`` extension module using a thread-local context rather + than a coroutine-local context (default), see the :mod:`decimal` module. + + See :data:`decimal.HAVE_CONTEXTVAR` and the :mod:`contextvars` module. + + .. versionadded:: 3.9 + +.. cmdoption:: --with-dbmliborder=db1:db2:... + + Override order to check db backends for the :mod:`dbm` module + + A valid value is a colon (``:``) separated string with the backend names: + + * ``ndbm``; + * ``gdbm``; + * ``bdb``. + +.. cmdoption:: --without-c-locale-coercion + + Disable C locale coercion to a UTF-8 based locale (enabled by default). + + Don't define the ``PY_COERCE_C_LOCALE`` macro. + + See :envvar:`PYTHONCOERCECLOCALE` and the :pep:`538`. + +.. cmdoption:: --with-platlibdir=DIRNAME + + Python library directory name (default is ``lib``). + + Fedora and SuSE use ``lib64`` on 64-bit platforms. + + See :data:`sys.platlibdir`. + + .. versionadded:: 3.9 + +.. cmdoption:: --with-wheel-pkg-dir=PATH + + Directory of wheel packages used by the :mod:`ensurepip` module + (none by default). + + Some Linux distribution packaging policies recommend against bundling + dependencies. For example, Fedora installs wheel packages in the + ``/usr/share/python-wheels/`` directory and don't install the + :mod:`ensurepip._bundled` package. + + .. versionadded:: 3.10 + + +Install Options +--------------- + +.. cmdoption:: --disable-test-modules + + Don't build nor install test modules, like the :mod:`test` package or the + :mod:`_testcapi` extension module (built and installed by default). + + .. versionadded:: 3.10 + +.. cmdoption:: --with-ensurepip=[upgrade|install|no] + + Select the :mod:`ensurepip` command run on Python installation: + + * ``upgrade`` (default): run ``python -m ensurepip --altinstall --upgrade`` + command. + * ``install``: run ``python -m ensurepip --altinstall`` command; + * ``no``: don't run ensurepip; + + .. versionadded:: 3.6 + + +Performance options +------------------- + +Configuring Python using ``--enable-optimizations --with-lto`` (PGO + LTO) is +recommended for best performance. + +.. cmdoption:: --enable-optimizations + + Enable Profile Guided Optimization (PGO) using :envvar:`PROFILE_TASK` + (disabled by default). + + The C compiler Clang requires ``llvm-profdata`` program for PGO. On + macOS, GCC also requires it: GCC is just an alias to Clang on macOS. + + Disable also semantic interposition in libpython if ``--enable-shared`` and + GCC is used: add ``-fno-semantic-interposition`` to the compiler and linker + flags. + + .. versionadded:: 3.6 + + .. versionchanged:: 3.10 + Use ``-fno-semantic-interposition`` on GCC. + +.. envvar:: PROFILE_TASK + + Environment variable used in the Makefile: Python command line arguments for + the PGO generation task. + + Default: ``-m test --pgo --timeout=$(TESTTIMEOUT)``. + + .. versionadded:: 3.8 + +.. cmdoption:: --with-lto + + Enable Link Time Optimization (LTO) in any build (disabled by default). + + The C compiler Clang requires ``llvm-ar`` for LTO (``ar`` on macOS), as well + as an LTO-aware linker (``ld.gold`` or ``lld``). + + .. versionadded:: 3.6 + +.. cmdoption:: --with-computed-gotos + + Enable computed gotos in evaluation loop (enabled by default on supported + compilers). + +.. cmdoption:: --without-pymalloc + + Disable the specialized Python memory allocator :ref:`pymalloc ` + (enabled by default). + + See also :envvar:`PYTHONMALLOC` environment variable. + +.. cmdoption:: --without-doc-strings + + Disable static documentation strings to reduce the memory footprint (enabled + by default). Documentation strings defined in Python are not affected. + + Don't define the ``WITH_DOC_STRINGS`` macro. + + See the ``PyDoc_STRVAR()`` macro. + +.. cmdoption:: --enable-profiling + + Enable C-level code profiling with ``gprof`` (disabled by default). + + +.. _debug-build: + +Python Debug Build +------------------ + +A debug build is Python built with the :option:`--with-pydebug` configure +option. + +Effects of a debug build: + +* Display all warnings by default: the list of default warning filters is empty + in the :mod:`warnings` module. +* Add ``d`` to :data:`sys.abiflags`. +* Add :func:`sys.gettotalrefcount` function. +* Add :option:`-X showrefcount <-X>` command line option. +* Add :envvar:`PYTHONTHREADDEBUG` environment variable. +* Add support for the ``__ltrace__`` variable: enable low-level tracing in the + bytecode evaluation loop if the variable is defined. +* Install :ref:`debug hooks on memory allocators ` + to detect buffer overflow and other memory errors. +* Define ``Py_DEBUG`` and ``Py_REF_DEBUG`` macros. +* Add runtime checks: code surroundeded by ``#ifdef Py_DEBUG`` and ``#endif``. + Enable ``assert(...)`` and ``_PyObject_ASSERT(...)`` assertions: don't set + the ``NDEBUG`` macro (see also the :option:`--with-assertions` configure + option). Main runtime checks: + + * Add sanity checks on the function arguments. + * Unicode and int objects are created with their memory filled with a pattern + to detect usage of uninitialized objects. + * Ensure that functions which can clear or replace the current exception are + not called with an exception raised. + * The garbage collector (:func:`gc.collect` function) runs some basic checks + on objects consistency. + * The :c:macro:`Py_SAFE_DOWNCAST()` macro checks for integer underflow and + overflow when downcasting from wide types to narrow types. + +See also the :ref:`Python Development Mode ` and the +:option:`--with-trace-refs` configure option. + +.. versionchanged:: 3.8 + Release builds and debug builds are now ABI compatible: defining the + ``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro (see the + :option:`--with-trace-refs` option), which introduces the only ABI + incompatibility. + + +Debug options +------------- + +.. cmdoption:: --with-pydebug + + :ref:`Build Python in debug mode `: define the ``Py_DEBUG`` + macro (disabled by default). + +.. cmdoption:: --with-trace-refs + + Enable tracing references for debugging purpose (disabled by default). + + Effects: + + * Define the ``Py_TRACE_REFS`` macro. + * Add :func:`sys.getobjects` function. + * Add :envvar:`PYTHONDUMPREFS` environment variable. + + This build is not ABI compatible with release build (default build) or debug + build (``Py_DEBUG`` and ``Py_REF_DEBUG`` macros). + + .. versionadded:: 3.8 + +.. cmdoption:: --with-assertions + + Build with C assertions enabled (default is no): ``assert(...);`` and + ``_PyObject_ASSERT(...);``. + + If set, the ``NDEBUG`` macro is not defined in the :envvar:`OPT` compiler + variable. + + See also the :option:`--with-pydebug` option (:ref:`debug build + `) which also enables assertions. + + .. versionadded:: 3.6 + +.. cmdoption:: --with-valgrind + + Enable Valgrind support (default is no). + +.. cmdoption:: --with-dtrace + + Enable DTrace support (default is no). + + See :ref:`Instrumenting CPython with DTrace and SystemTap + `. + + .. versionadded:: 3.6 + +.. cmdoption:: --with-address-sanitizer + + Enable AddressSanitizer memory error detector, ``asan`` (default is no). + + .. versionadded:: 3.6 + +.. cmdoption:: --with-memory-sanitizer + + Enable MemorySanitizer allocation error detector, ``msan`` (default is no). + + .. versionadded:: 3.6 + +.. cmdoption:: --with-undefined-behavior-sanitizer + + Enable UndefinedBehaviorSanitizer undefined behaviour detector, ``ubsan`` + (default is no). + + .. versionadded:: 3.6 + + +Linker options +-------------- + +.. cmdoption:: --enable-shared + + Enable building a shared Python library: ``libpython`` (default is no). + +.. cmdoption:: --without-static-libpython + + Do not build ``libpythonMAJOR.MINOR.a`` and do not install ``python.o`` + (built and enabled by default). + + .. versionadded:: 3.10 + + +Libraries options +----------------- + +.. cmdoption:: --with-libs='lib1 ...' + + Link against additional libraries (default is no). + +.. cmdoption:: --with-system-expat + + Build the :mod:`pyexpat` module using an installed ``expat`` library + (default is no). + +.. cmdoption:: --with-system-ffi + + Build the :mod:`_ctypes` extension module using an installed ``ffi`` + library, see the :mod:`ctypes` module (default is system-dependent). + +.. cmdoption:: --with-system-libmpdec + + Build the ``_decimal`` extension module using an installed ``mpdec`` + library, see the :mod:`decimal` module (default is no). + + .. versionadded:: 3.3 + +.. cmdoption:: --with-readline=editline + + Use ``editline`` library for backend of the :mod:`readline` module. + + Define the ``WITH_EDITLINE`` macro. + + .. versionadded:: 3.10 + +.. cmdoption:: --without-readline + + Don't build the :mod:`readline` module (built by default). + + Don't define the ``HAVE_LIBREADLINE`` macro. + + .. versionadded:: 3.10 + +.. cmdoption:: --with-tcltk-includes='-I...' + + Override search for Tcl and Tk include files. + +.. cmdoption:: --with-tcltk-libs='-L...' + + Override search for Tcl and Tk libraries. + +.. cmdoption:: --with-libm=STRING + + Override ``libm`` math library to *STRING* (default is system-dependent). + +.. cmdoption:: --with-libc=STRING + + Override ``libc`` C library to *STRING* (default is system-dependent). + +.. cmdoption:: --with-openssl=DIR + + Root of the OpenSSL directory. + + .. versionadded:: 3.7 + +.. cmdoption:: --with-openssl-rpath=[no|auto|DIR] + + Set runtime library directory (rpath) for OpenSSL libraries: + + * ``no`` (default): don't set rpath; + * ``auto``: auto-detect rpath from :option:`--with-openssl` and + ``pkg-config``; + * *DIR*: set an explicit rpath. + + .. versionadded:: 3.10 + + +Security Options +---------------- + +.. cmdoption:: --with-hash-algorithm=[fnv|siphash24] + + Select hash algorithm for use in ``Python/pyhash.c``: + + * ``siphash24`` (default). + * ``fnv``; + + .. versionadded:: 3.4 + +.. cmdoption:: --with-builtin-hashlib-hashes=md5,sha1,sha256,sha512,sha3,blake2 + + Built-in hash modules: + + * ``md5``; + * ``sha1``; + * ``sha256``; + * ``sha512``; + * ``sha3`` (with shake); + * ``blake2``. + + .. versionadded:: 3.9 + +.. cmdoption:: --with-ssl-default-suites=[python|openssl|STRING] + + Override the OpenSSL default cipher suites string: + + * ``python`` (default): use Python's preferred selection; + * ``openssl``: leave OpenSSL's defaults untouched; + * *STRING*: use a custom string + + See the :mod:`ssl` module. + + .. versionadded:: 3.7 + + .. versionchanged:: 3.10 + + The settings ``python`` and *STRING* also set TLS 1.2 as minimum + protocol version. + +macOS Options +------------- + +See ``Mac/README.rst``. + +.. cmdoption:: --enable-universalsdk +.. cmdoption:: --enable-universalsdk=SDKDIR + + Create a universal binary build. *SDKDIR* specifies which macOS SDK should + be used to perform the build (default is no). + +.. cmdoption:: --enable-framework +.. cmdoption:: --enable-framework=INSTALLDIR + + Create a Python.framework rather than a traditional Unix install. Optional + *INSTALLDIR* specifies the installation path (default is no). + +.. cmdoption:: --with-universal-archs=ARCH + + Specify the kind of universal binary that should be created. This option is + only valid when :option:`--enable-universalsdk` is set. + + Options: + + * ``universal2``; + * ``32-bit``; + * ``64-bit``; + * ``3-way``; + * ``intel``; + * ``intel-32``; + * ``intel-64``; + * ``all``. + +.. cmdoption:: --with-framework-name=FRAMEWORK + + Specify the name for the python framework on macOS only valid when + :option:`--enable-framework` is set (default: ``Python``). + + +Python Build System +=================== + +Main files of the build system +------------------------------ + +* :file:`configure.ac` => :file:`configure`; +* :file:`Makefile.pre.in` => :file:`Makefile` (created by :file:`configure`); +* :file:`pyconfig.h` (created by :file:`configure`); +* :file:`Modules/Setup`: C extensions built by the Makefile using + :file:`Module/makesetup` shell script; +* :file:`setup.py`: C extensions built using the :mod:`distutils` module. + +Main build steps +---------------- + +* C files (``.c``) are built as object files (``.o``). +* A static ``libpython`` library (``.a``) is created from objects files. +* ``python.o`` and the static ``libpython`` library are linked into the + final ``python`` program. +* C extensions are built by the Makefile (see :file:`Modules/Setup`) + and ``python setup.py build``. + +Main Makefile targets +--------------------- + +* ``make``: Build Python with the standard library. +* ``make platform:``: build the ``python`` program, but don't build the + standard library extension modules. +* ``make profile-opt``: build Python using Profile Guided Optimization (PGO). + You can use the configure :option:`--enable-optimizations` option to make + this the default target of the ``make`` command (``make all`` or just + ``make``). +* ``make buildbottest``: Build Python and run the Python test suite, the same + way than buildbots test Python. Set ``TESTTIMEOUT`` variable (in seconds) + to change the test timeout (1200 by default: 20 minutes). +* ``make install``: Build and install Python. +* ``make regen-all``: Regenerate (almost) all generated files; + ``make regen-stdlib-module-names`` and ``autoconf`` must be run separately + for the remaining generated files. +* ``make clean``: Remove built files. +* ``make distclean``: Same than ``make clean``, but remove also files created + by the configure script. + +C extensions +------------ + +Some C extensions are built as built-in modules, like the ``sys`` module. +They are built with the ``Py_BUILD_CORE_BUILTIN`` macro defined. +Built-in modules have no ``__file__`` attribute:: + + >>> import sys + >>> sys + + >>> sys.__file__ + Traceback (most recent call last): + File "", line 1, in + AttributeError: module 'sys' has no attribute '__file__' + +Other C extensins are built as dynamic libraires, like the ``_asyncio`` module. +They are built with the ``Py_BUILD_CORE_MODULE`` macro defined. +Example on Linux x86-64:: + + >>> import _asyncio + >>> _asyncio + + >>> _asyncio.__file__ + '/usr/lib64/python3.9/lib-dynload/_asyncio.cpython-39-x86_64-linux-gnu.so' + +:file:`Modules/Setup` is used to generate Makefile targets to build C extensions. +At the beginning of the files, C extensions are built as built-in modules. +Extensions defined after the ``*shared*`` marker are built as dynamic libraries. + +The :file:`setup.py` script only builds C extensions as shared libraries using +the :mod:`distutils` module. + +The :c:macro:`PyAPI_FUNC()`, :c:macro:`PyAPI_API()` and +:c:macro:`PyMODINIT_FUNC()` macros of :file:`Include/pyport.h` are defined +differently depending if the ``Py_BUILD_CORE_MODULE`` macro is defined: + +* Use ``Py_EXPORTED_SYMBOL`` if the ``Py_BUILD_CORE_MODULE`` is defined +* Use ``Py_IMPORTED_SYMBOL`` otherwise. + +If the ``Py_BUILD_CORE_BUILTIN`` macro is used by mistake on a C extension +built as a shared library, its ``PyInit_xxx()`` function is not exported, +causing an :exc:`ImportError` on import. + + +Compiler and linker flags +========================= + +Options set by the ``./configure`` script and environment variables and used by +``Makefile``. + +Preprocessor flags +------------------ + +.. envvar:: CONFIGURE_CPPFLAGS + + Value of :envvar:`CPPFLAGS` variable passed to the ``./configure`` script. + + .. versionadded:: 3.6 + +.. envvar:: CPPFLAGS + + (Objective) C/C++ preprocessor flags, e.g. ``-I`` if you have + headers in a nonstandard directory ````. + + Both :envvar:`CPPFLAGS` and :envvar:`LDFLAGS` need to contain the shell's + value for setup.py to be able to build extension modules using the + directories specified in the environment variables. + +.. envvar:: BASECPPFLAGS + + .. versionadded:: 3.4 + +.. envvar:: PY_CPPFLAGS + + Extra preprocessor flags added for building the interpreter object files. + + Default: ``$(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)``. + + .. versionadded:: 3.2 + +Compiler flags +-------------- + +.. envvar:: CC + + C compiler command. + + Example: ``gcc -pthread``. + +.. envvar:: MAINCC + + C compiler command used to build the ``main()`` function of programs like + ``python``. + + Variable set by the :option:`--with-cxx-main` option of the configure + script. + + Default: ``$(CC)``. + +.. envvar:: CXX + + C++ compiler command. + + Used if the :option:`--with-cxx-main` option is used. + + Example: ``g++ -pthread``. + +.. envvar:: CFLAGS + + C compiler flags. + +.. envvar:: CFLAGS_NODIST + + :envvar:`CFLAGS_NODIST` is used for building the interpreter and stdlib C + extensions. Use it when a compiler flag should *not* be part of the + distutils :envvar:`CFLAGS` once Python is installed (:issue:`21121`). + + .. versionadded:: 3.5 + +.. envvar:: EXTRA_CFLAGS + + Extra C compiler flags. + +.. envvar:: CONFIGURE_CFLAGS + + Value of :envvar:`CFLAGS` variable passed to the ``./configure`` + script. + + .. versionadded:: 3.2 + +.. envvar:: CONFIGURE_CFLAGS_NODIST + + Value of :envvar:`CFLAGS_NODIST` variable passed to the ``./configure`` + script. + + .. versionadded:: 3.5 + +.. envvar:: BASECFLAGS + + Base compiler flags. + +.. envvar:: OPT + + Optimization flags. + +.. envvar:: CFLAGS_ALIASING + + Strict or non-strict aliasing flags used to compile ``Python/dtoa.c``. + + .. versionadded:: 3.7 + +.. envvar:: CCSHARED + + Compiler flags used to build a shared library. + + For example, ``-fPIC`` is used on Linux and on BSD. + +.. envvar:: CFLAGSFORSHARED + + Extra C flags added for building the interpreter object files. + + Default: ``$(CCSHARED)`` when :option:`--enable-shared` is used, or an empty + string otherwise. + +.. envvar:: PY_CFLAGS + + Default: ``$(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)``. + +.. envvar:: PY_CFLAGS_NODIST + + Default: ``$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal``. + + .. versionadded:: 3.5 + +.. envvar:: PY_STDMODULE_CFLAGS + + C flags used for building the interpreter object files. + + Default: ``$(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED)``. + + .. versionadded:: 3.7 + +.. envvar:: PY_CORE_CFLAGS + + Default: ``$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE``. + + .. versionadded:: 3.2 + +.. envvar:: PY_BUILTIN_MODULE_CFLAGS + + Compiler flags to build a standard library extension module as a built-in + module, like the :mod:`posix` module. + + Default: ``$(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN``. + + .. versionadded:: 3.8 + +.. envvar:: PURIFY + + Purify command. Purify is a memory debugger program. + + Default: empty string (not used). + + +Linker flags +------------ + +.. envvar:: LINKCC + + Linker command used to build programs like ``python`` and ``_testembed``. + + Default: ``$(PURIFY) $(MAINCC)``. + +.. envvar:: CONFIGURE_LDFLAGS + + Value of :envvar:`LDFLAGS` variable passed to the ``./configure`` script. + + Avoid assigning :envvar:`CFLAGS`, :envvar:`LDFLAGS`, etc. so users can use + them on the command line to append to these values without stomping the + pre-set values. + + .. versionadded:: 3.2 + +.. envvar:: LDFLAGS_NODIST + + :envvar:`LDFLAGS_NODIST` is used in the same manner as + :envvar:`CFLAGS_NODIST`. Use it when a linker flag should *not* be part of + the distutils :envvar:`LDFLAGS` once Python is installed (:issue:`35257`). + +.. envvar:: CONFIGURE_LDFLAGS_NODIST + + Value of :envvar:`LDFLAGS_NODIST` variable passed to the ``./configure`` + script. + + .. versionadded:: 3.8 + +.. envvar:: LDFLAGS + + Linker flags, e.g. ``-L`` if you have libraries in a nonstandard + directory ````. + + Both :envvar:`CPPFLAGS` and :envvar:`LDFLAGS` need to contain the shell's + value for setup.py to be able to build extension modules using the + directories specified in the environment variables. + +.. envvar:: LIBS + + Linker flags to pass libraries to the linker when linking the Python + executable. + + Example: ``-lrt``. + +.. envvar:: LDSHARED + + Command to build a shared library. + + Default: ``@LDSHARED@ $(PY_LDFLAGS)``. + +.. envvar:: BLDSHARED + + Command to build ``libpython`` shared library. + + Default: ``@BLDSHARED@ $(PY_CORE_LDFLAGS)``. + +.. envvar:: PY_LDFLAGS + + Default: ``$(CONFIGURE_LDFLAGS) $(LDFLAGS)``. + +.. envvar:: PY_LDFLAGS_NODIST + + Default: ``$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST)``. + + .. versionadded:: 3.8 + +.. envvar:: PY_CORE_LDFLAGS + + Linker flags used for building the interpreter object files. + + .. versionadded:: 3.8 diff --git a/Doc/using/index.rst b/Doc/using/index.rst index 4a45121a..e1a3111f 100644 --- a/Doc/using/index.rst +++ b/Doc/using/index.rst @@ -15,6 +15,7 @@ interpreter and things that make working with Python easier. cmdline.rst unix.rst + configure.rst windows.rst mac.rst editors.rst diff --git a/Doc/using/mac.rst b/Doc/using/mac.rst index f7db0384..2f132a96 100644 --- a/Doc/using/mac.rst +++ b/Doc/using/mac.rst @@ -160,7 +160,7 @@ Distributing Python Applications on the Mac The standard tool for deploying standalone Python applications on the Mac is :program:`py2app`. More information on installing and using py2app can be found -at https://pypi.org/project/py2app/. +at http://undefined.org/python/#py2app. Other Resources diff --git a/Doc/using/unix.rst b/Doc/using/unix.rst index c0a5643f..0a183445 100644 --- a/Doc/using/unix.rst +++ b/Doc/using/unix.rst @@ -78,9 +78,9 @@ The build process consists of the usual commands:: make make install -Configuration options and caveats for specific Unix platforms are extensively -documented in the :source:`README.rst` file in the root of the Python source -tree. +:ref:`Configuration options ` and caveats for specific Unix +platforms are extensively documented in the :source:`README.rst` file in the +root of the Python source tree. .. warning:: @@ -134,3 +134,56 @@ some Unices may not have the :program:`env` command, so you may need to hardcode ``/usr/bin/python3`` as the interpreter path. To use shell commands in your Python scripts, look at the :mod:`subprocess` module. + +.. _unix_custom_openssl: + +Custom OpenSSL +============== + +1. To use your vendor's OpenSSL configuration and system trust store, locate + the directory with ``openssl.cnf`` file or symlink in ``/etc``. On most + distribution the file is either in ``/etc/ssl`` or ``/etc/pki/tls``. The + directory should also contain a ``cert.pem`` file and/or a ``certs`` + directory. + + .. code-block:: shell-session + + $ find /etc/ -name openssl.cnf -printf "%h\n" + /etc/ssl + +2. Download, build, and install OpenSSL. Make sure you use ``install_sw`` and + not ``install``. The ``install_sw`` target does not override + ``openssl.cnf``. + + .. code-block:: shell-session + + $ curl -O https://www.openssl.org/source/openssl-VERSION.tar.gz + $ tar xzf openssl-VERSION + $ pushd openssl-VERSION + $ ./config \ + --prefix=/usr/local/custom-openssl \ + --libdir=lib \ + --openssldir=/etc/ssl + $ make -j1 depend + $ make -j8 + $ make install_sw + $ popd + +3. Build Python with custom OpenSSL + (see the configure `--with-openssl` and `--with-openssl-rpath` options) + + .. code-block:: shell-session + + $ pushd python-3.x.x + $ ./configure -C \ + --with-openssl=/usr/local/custom-openssl \ + --with-openssl-rpath=auto \ + --prefix=/usr/local/python-3.x.x + $ make -j8 + $ make altinstall + +.. note:: + + Patch releases of OpenSSL have a backwards compatible ABI. You don't need + to recompile Python to update OpenSSL. It's sufficient to replace the + custom OpenSSL installation with a newer version. diff --git a/Doc/using/win_installer.png b/Doc/using/win_installer.png index 03bf2d7b16c599b1f2d1d2cea577ba60fbc4570f..9c18ff19cf5e81f8fadf55aac01ce1e41148c846 100644 GIT binary patch literal 95096 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

L4l#aZb2>Nv6T9|FSv^Ke9bXW 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

6Bh#M+;fY#b4w0{$2XkD^MHXuL}9s60( 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 diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index abb74637..68ee09c5 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -129,8 +129,8 @@ suppressing the UI in order to change some of the defaults. To completely hide the installer UI and install Python silently, pass the ``/quiet`` option. To skip past the user interaction but still display progress and errors, pass the ``/passive`` option. The ``/uninstall`` -option may be passed to immediately begin removing Python - no confirmation -prompt will be displayed. +option may be passed to immediately begin removing Python - no prompt will be +displayed. All other options are passed as ``name=value``, where the value is usually ``0`` to disable a feature, ``1`` to enable a feature, or a path. The full list @@ -374,9 +374,7 @@ may be changed from ``.``, and the package will be installed into a subdirectory. By default, the subdirectory is named the same as the package, and without the ``-ExcludeVersion`` option this name will include the specific version installed. Inside the subdirectory is a ``tools`` directory that -contains the Python installation: - -.. code-block:: doscon +contains the Python installation:: # Without -ExcludeVersion > .\python.3.5.2\tools\python.exe -V @@ -423,7 +421,7 @@ dependants, such as Idle), pip and the Python documentation are not included. .. note:: The embedded distribution does not include the `Microsoft C Runtime - `_ and it is + `_ and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding @@ -557,22 +555,27 @@ System variables, you need non-restricted access to your machine Windows will concatenate User variables *after* System variables, which may cause unexpected results when modifying :envvar:`PATH`. - The :envvar:`PYTHONPATH` variable is used by all versions of Python, - so you should not permanently configure it unless the listed paths - only include code that is compatible with all of your installed Python + The :envvar:`PYTHONPATH` variable is used by all versions of Python 2 and + Python 3, so you should not permanently configure this variable unless it + only includes code that is compatible with all of your installed Python versions. .. seealso:: - https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables - Overview of environment variables on Windows + https://www.microsoft.com/en-us/wdsi/help/folder-variables + Environment variables in Windows NT - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1 - The ``set`` command, for temporarily modifying environment variables + https://technet.microsoft.com/en-us/library/cc754250.aspx + The SET command, for temporarily modifying environment variables - https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx - The ``setx`` command, for permanently modifying environment variables + https://technet.microsoft.com/en-us/library/cc755104.aspx + The SETX command, for permanently modifying environment variables + https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp + How To Manage Environment Variables in Windows XP + + https://www.chem.gla.ac.uk/~louis/software/faq/q1.html + Setting Environment variables, Louis J. Farrugia .. _windows-path-mod: @@ -616,21 +619,14 @@ Page). Python uses it for the default encoding of text files (e.g. This may cause issues because UTF-8 is widely used on the internet and most Unix systems, including WSL (Windows Subsystem for Linux). -You can use UTF-8 mode to change the default text encoding to UTF-8. -You can enable UTF-8 mode via the ``-X utf8`` command line option, or -the ``PYTHONUTF8=1`` environment variable. See :envvar:`PYTHONUTF8` for -enabling UTF-8 mode, and :ref:`setting-envvars` for how to modify -environment variables. - -When UTF-8 mode is enabled: +You can use the :ref:`Python UTF-8 Mode ` to change the default text +encoding to UTF-8. You can enable the :ref:`Python UTF-8 Mode ` via +the ``-X utf8`` command line option, or the ``PYTHONUTF8=1`` environment +variable. See :envvar:`PYTHONUTF8` for enabling UTF-8 mode, and +:ref:`setting-envvars` for how to modify environment variables. -* :func:`locale.getpreferredencoding` returns ``'UTF-8'`` instead of - the system encoding. This function is used for the default text - encoding in many places, including :func:`open`, :class:`Popen`, - :meth:`Path.read_text`, etc. -* :data:`sys.stdin`, :data:`sys.stdout`, and :data:`sys.stderr` - all use UTF-8 as their text encoding. -* You can still use the system encoding via the "mbcs" codec. +When the :ref:`Python UTF-8 Mode ` is enabled, you can still use the +system encoding (the ANSI Code Page) via the "mbcs" codec. Note that adding ``PYTHONUTF8=1`` to the default environment variables will affect all Python 3.7+ applications on your system. @@ -643,7 +639,8 @@ temporarily or use the ``-X utf8`` command line option. on Windows for: * Console I/O including standard I/O (see :pep:`528` for details). - * The filesystem encoding (see :pep:`529` for details). + * The :term:`filesystem encoding ` + (see :pep:`529` for details). .. _launcher: @@ -676,7 +673,9 @@ From the command-line System-wide installations of Python 3.3 and later will put the launcher on your :envvar:`PATH`. The launcher is compatible with all available versions of Python, so it does not matter which version is installed. To check that the -launcher is available, execute the following command in Command Prompt:: +launcher is available, execute the following command in Command Prompt: + +:: py @@ -684,20 +683,26 @@ You should find that the latest version of Python you have installed is started - it can be exited as normal, and any additional command-line arguments specified will be sent directly to Python. -If you have multiple versions of Python installed (e.g., 3.7 and |version|) you -will have noticed that Python |version| was started - to launch Python 3.7, try -the command:: +If you have multiple versions of Python installed (e.g., 2.7 and |version|) you +will have noticed that Python |version| was started - to launch Python 2.7, try +the command: - py -3.7 +:: -If you want the latest version of Python 2 you have installed, try the -command:: + py -2.7 + +If you want the latest version of Python 2.x you have installed, try the +command: + +:: py -2 -You should find the latest version of Python 3.x starts. +You should find the latest version of Python 2.x starts. -If you see the following error, you do not have the launcher installed:: +If you see the following error, you do not have the launcher installed: + +:: 'py' is not recognized as an internal or external command, operable program or batch file. @@ -705,12 +710,6 @@ If you see the following error, you do not have the launcher installed:: Per-user installations of Python do not add the launcher to :envvar:`PATH` unless the option was selected on installation. -The command:: - - py --list - -displays the currently installed version(s) of Python. - Virtual environments ^^^^^^^^^^^^^^^^^^^^ @@ -735,7 +734,9 @@ following contents import sys sys.stdout.write("hello from Python %s\n" % (sys.version,)) -From the directory in which hello.py lives, execute the command:: +From the directory in which hello.py lives, execute the command: + +:: py hello.py @@ -748,9 +749,9 @@ is printed. Now try changing the first line to be: Re-executing the command should now print the latest Python 3.x information. As with the above command-line examples, you can specify a more explicit -version qualifier. Assuming you have Python 3.7 installed, try changing -the first line to ``#! python3.7`` and you should find the |version| -version information printed. +version qualifier. Assuming you have Python 2.6 installed, try changing the +first line to ``#! python2.6`` and you should find the 2.6 version +information printed. Note that unlike interactive use, a bare "python" will use the latest version of Python 2.x that you have installed. This is for backward @@ -803,8 +804,8 @@ shebang lines starting with ``/usr``. Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the -minor version. I.e. ``/usr/bin/python3.7-32`` will request usage of the -32-bit python 3.7. +minor version. I.e. ``/usr/bin/python2.7-32`` will request usage of the +32-bit python 2.7. .. versionadded:: 3.7 @@ -890,19 +891,19 @@ Examples: ``python2`` will use the latest Python 2.x version installed and the command ``python3`` will use the latest Python 3.x installed. -* The command ``python3.7`` will not consult any +* The commands ``python3.1`` and ``python2.7`` will not consult any options at all as the versions are fully specified. * If ``PY_PYTHON=3``, the commands ``python`` and ``python3`` will both use the latest installed Python 3 version. -* If ``PY_PYTHON=3.7-32``, the command ``python`` will use the 32-bit - implementation of 3.7 whereas the command ``python3`` will use the latest +* If ``PY_PYTHON=3.1-32``, the command ``python`` will use the 32-bit + implementation of 3.1 whereas the command ``python3`` will use the latest installed Python (PY_PYTHON was not considered at all as a major version was specified.) -* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7``, the commands - ``python`` and ``python3`` will both use specifically 3.7 +* If ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1``, the commands + ``python`` and ``python3`` will both use specifically 3.1 In addition to environment variables, the same settings can be configured in the .INI file used by the launcher. The section in the INI file is @@ -913,21 +914,21 @@ an environment variable will override things specified in the INI file. For example: -* Setting ``PY_PYTHON=3.7`` is equivalent to the INI file containing: +* Setting ``PY_PYTHON=3.1`` is equivalent to the INI file containing: .. code-block:: ini [defaults] - python=3.7 + python=3.1 -* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.7`` is equivalent to the INI file +* Setting ``PY_PYTHON=3`` and ``PY_PYTHON3=3.1`` is equivalent to the INI file containing: .. code-block:: ini [defaults] python=3 - python3=3.7 + python3=3.1 Diagnostics ----------- @@ -1081,14 +1082,13 @@ is a collection of modules for advanced Windows-specific support. This includes utilities for: * `Component Object Model - `_ + `_ (COM) * Win32 API calls * Registry * Event log -* `Microsoft Foundation Classes - `_ - (MFC) user interfaces +* `Microsoft Foundation Classes `_ (MFC) + user interfaces `PythonWin `_ is a sample MFC application @@ -1099,7 +1099,7 @@ shipped with PyWin32. It is an embeddable IDE with a built-in debugger. `Win32 How Do I...? `_ by Tim Golden - `Python and COM `_ + `Python and COM `_ by David and Paul Boddie @@ -1113,6 +1113,18 @@ you can distribute your application without requiring your users to install Python. +WConio +------ + +Since Python's advanced terminal handling layer, :mod:`curses`, is restricted to +Unix-like systems, there is a library exclusive to Windows as well: Windows +Console I/O for Python. + +`WConio `_ is a wrapper for +Turbo-C's :file:`CONIO.H`, used to create text user interfaces. + + + Compiling Python on Windows =========================== @@ -1122,13 +1134,21 @@ latest release's source or just grab a fresh `checkout `_. The source tree contains a build solution and project files for Microsoft -Visual Studio, which is the compiler used to build the official Python +Visual Studio 2015, which is the compiler used to build the official Python releases. These files are in the :file:`PCbuild` directory. Check :file:`PCbuild/readme.txt` for general information on the build process. + For extension modules, consult :ref:`building-on-windows`. +.. seealso:: + + `Python + Windows + distutils + SWIG + gcc MinGW `_ + or "Creating Python extensions in C/C++ with SWIG and compiling them with + MinGW gcc under Windows" or "Installing Python extension with distutils + and without Microsoft Visual C++" by Sébastien Sauvage, 2003 + Other Platforms =============== @@ -1137,12 +1157,12 @@ With ongoing development of Python, some platforms that used to be supported earlier are no longer supported (due to the lack of users or developers). Check :pep:`11` for details on all unsupported platforms. -* `Windows CE `_ is - `no longer supported `__ - since Python 3 (if it ever was). -* The `Cygwin `_ installer offers to install the - `Python interpreter `__ - as well +* `Windows CE `_ is still supported. +* The `Cygwin `_ installer offers to install the Python + interpreter as well (cf. `Cygwin package source + `_, `Maintainer releases + `_) See `Python for Windows `_ for detailed information about platforms with pre-compiled installers. diff --git a/Doc/whatsnew/2.0.rst b/Doc/whatsnew/2.0.rst index dd49da8f..0e1cf1fd 100644 --- a/Doc/whatsnew/2.0.rst +++ b/Doc/whatsnew/2.0.rst @@ -108,7 +108,7 @@ usually easy compared to the earlier task of coming up with a good design. Discussions of new features can often explode into lengthy mailing list threads, making the discussion hard to follow, and no one can read every posting to python-dev. Therefore, a relatively formal process has been set up to write -Python Enhancement Proposals (PEPs), modelled on the Internet RFC process. PEPs +Python Enhancement Proposals (PEPs), modelled on the internet RFC process. PEPs are draft documents that describe a proposed new feature, and are continually revised until the community reaches a consensus, either accepting or rejecting the proposal. Quoting from the introduction to :pep:`1`, "PEP Purpose and @@ -768,7 +768,7 @@ Vladimir Marangozov's long-awaited malloc restructuring was completed, to make it easy to have the Python interpreter use a custom allocator instead of C's standard :func:`malloc`. For documentation, read the comments in :file:`Include/pymem.h` and :file:`Include/objimpl.h`. For the lengthy -discussions during which the interface was hammered out, see the Web archives of +discussions during which the interface was hammered out, see the web archives of the 'patches' and 'python-dev' lists at python.org. Recent versions of the GUSI development environment for MacOS support POSIX @@ -1002,7 +1002,7 @@ Relationship to PyXML --------------------- The XML Special Interest Group has been working on XML-related Python code for a -while. Its code distribution, called PyXML, is available from the SIG's Web +while. Its code distribution, called PyXML, is available from the SIG's web pages at https://www.python.org/community/sigs/current/xml-sig. The PyXML distribution also used the package name ``xml``. If you've written programs that used PyXML, you're probably wondering about its compatibility with the 2.0 :mod:`xml` package. @@ -1109,7 +1109,7 @@ module. Prescod.) * :mod:`robotparser`: Parse a :file:`robots.txt` file, which is used for writing - Web spiders that politely avoid certain areas of a Web site. The parser accepts + web spiders that politely avoid certain areas of a web site. The parser accepts the contents of a :file:`robots.txt` file, builds a set of rules from it, and can then answer questions about the fetchability of a given URL. (Contributed by Skip Montanaro.) diff --git a/Doc/whatsnew/2.1.rst b/Doc/whatsnew/2.1.rst index 8b1eac96..b690f90c 100644 --- a/Doc/whatsnew/2.1.rst +++ b/Doc/whatsnew/2.1.rst @@ -425,7 +425,7 @@ PEP 232: Function Attributes In Python 2.1, functions can now have arbitrary information attached to them. People were often using docstrings to hold information about functions and methods, because the ``__doc__`` attribute was the only way of attaching any -information to a function. For example, in the Zope Web application server, +information to a function. For example, in the Zope web application server, functions are marked as safe for public access by having a docstring, and in John Aycock's SPARK parsing framework, docstrings hold parts of the BNF grammar to be parsed. This overloading is unfortunate, since docstrings are really diff --git a/Doc/whatsnew/2.2.rst b/Doc/whatsnew/2.2.rst index b4cd4341..9355c1ba 100644 --- a/Doc/whatsnew/2.2.rst +++ b/Doc/whatsnew/2.2.rst @@ -49,7 +49,7 @@ amazing new capabilities. Before beginning this, the longest and most complicated section of this article, I'll provide an overview of the changes and offer some comments. -A long time ago I wrote a Web page listing flaws in Python's design. One of the +A long time ago I wrote a web page listing flaws in Python's design. One of the most significant flaws was that it's impossible to subclass Python types implemented in C. In particular, it's not possible to subclass built-in types, so you can't just subclass, say, lists in order to add a single useful method to diff --git a/Doc/whatsnew/2.3.rst b/Doc/whatsnew/2.3.rst index dac0e636..cf555206 100644 --- a/Doc/whatsnew/2.3.rst +++ b/Doc/whatsnew/2.3.rst @@ -1650,7 +1650,7 @@ complete list of changes, or look through the CVS logs for all the details. * The new :mod:`DocXMLRPCServer` module allows writing self-documenting XML-RPC servers. Run it in demo mode (as a program) to see it in action. Pointing the - Web browser to the RPC server produces pydoc-style documentation; pointing + web browser to the RPC server produces pydoc-style documentation; pointing xmlrpclib to the server allows invoking the actual methods. (Contributed by Brian Quinlan.) diff --git a/Doc/whatsnew/2.5.rst b/Doc/whatsnew/2.5.rst index 5816380e..4e85abae 100644 --- a/Doc/whatsnew/2.5.rst +++ b/Doc/whatsnew/2.5.rst @@ -1767,7 +1767,7 @@ included. The rest of this section will provide a brief overview of using ElementTree. Full documentation for ElementTree is available at -https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm. +http://effbot.org/zone/element-index.htm. ElementTree represents an XML document as a tree of element nodes. The text content of the document is stored as the :attr:`text` and :attr:`tail` @@ -1865,7 +1865,7 @@ read the package's official documentation for more details. .. seealso:: - https://web.archive.org/web/20201124024954/http://effbot.org/zone/element-index.htm + http://effbot.org/zone/element-index.htm Official documentation for ElementTree. .. ====================================================================== diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst index 6d704586..abb65222 100644 --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -2089,7 +2089,7 @@ version 1.3. Some of the new features are: Fredrik Lundh develops ElementTree and produced the 1.3 version; you can read his article describing 1.3 at -https://web.archive.org/web/20200703234532/http://effbot.org/zone/elementtree-13-intro.htm. +http://effbot.org/zone/elementtree-13-intro.htm. Florent Xicluna updated the version included with Python, after discussions on python-dev and in :issue:`6472`.) diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst new file mode 100644 index 00000000..c11fe416 --- /dev/null +++ b/Doc/whatsnew/3.10.rst @@ -0,0 +1,2311 @@ +**************************** + What's New In Python 3.10 +**************************** + +:Release: |release| +:Date: |today| +:Editor: Pablo Galindo Salgado + +.. Rules for maintenance: + + * Anyone can add text to this document. Do not spend very much time + on the wording of your changes, because your text will probably + get rewritten to some degree. + + * The maintainer will go through Misc/NEWS periodically and add + changes; it's therefore more important to add your changes to + Misc/NEWS than to this file. + + * This is not a complete list of every single change; completeness + is the purpose of Misc/NEWS. Some changes I consider too small + or esoteric to include. If such a change is added to the text, + I'll just remove it. (This is another reason you shouldn't spend + too much time on writing your addition.) + + * If you want to draw your new text to the attention of the + maintainer, add 'XXX' to the beginning of the paragraph or + section. + + * It's OK to just add a fragmentary note about a change. For + example: "XXX Describe the transmogrify() function added to the + socket module." The maintainer will research the change and + write the necessary text. + + * You can comment out your additions if you like, but it's not + necessary (especially when a final release is some months away). + + * Credit the author of a patch or bugfix. Just the name is + sufficient; the e-mail address isn't necessary. + + * It's helpful to add the bug/patch number as a comment: + + XXX Describe the transmogrify() function added to the socket + module. + (Contributed by P.Y. Developer in :issue:`12345`.) + + This saves the maintainer the effort of going through the git log + when researching a change. + +This article explains the new features in Python 3.10, compared to 3.9. + +For full details, see the :ref:`changelog `. + +.. note:: + + Prerelease users should be aware that this document is currently in draft + form. It will be updated substantially as Python 3.10 moves towards release, + so it's worth checking back even after reading earlier versions. + + +Summary -- Release highlights +============================= + +.. This section singles out the most important changes in Python 3.10. + Brevity is key. + + +.. PEP-sized items next. + +New syntax features: + +* :pep:`634`, Structural Pattern Matching: Specification +* :pep:`635`, Structural Pattern Matching: Motivation and Rationale +* :pep:`636`, Structural Pattern Matching: Tutorial +* :issue:`12782`, Parenthesized context managers are now officially allowed. + +New features in the standard library: + +* :pep:`618`, Add Optional Length-Checking To zip. + +Interpreter improvements: + +* :pep:`626`, Precise line numbers for debugging and other tools. + +New typing features: + +* :pep:`604`, Allow writing union types as X | Y +* :pep:`613`, Explicit Type Aliases +* :pep:`612`, Parameter Specification Variables + +Important deprecations, removals or restrictions: + +* :pep:`644`, Require OpenSSL 1.1.1 or newer +* :pep:`632`, Deprecate distutils module. +* :pep:`623`, Deprecate and prepare for the removal of the wstr member in PyUnicodeObject. +* :pep:`624`, Remove Py_UNICODE encoder APIs +* :pep:`597`, Add optional EncodingWarning + + +New Features +============ + +.. _whatsnew310-pep563: + +Parenthesized context managers +------------------------------ + +Using enclosing parentheses for continuation across multiple lines +in context managers is now supported. This allows formatting a long +collection of context managers in multiple lines in a similar way +as it was previously possible with import statements. For instance, +all these examples are now valid: + +.. code-block:: python + + with (CtxManager() as example): + ... + + with ( + CtxManager1(), + CtxManager2() + ): + ... + + with (CtxManager1() as example, + CtxManager2()): + ... + + with (CtxManager1(), + CtxManager2() as example): + ... + + with ( + CtxManager1() as example1, + CtxManager2() as example2 + ): + ... + +it is also possible to use a trailing comma at the end of the +enclosed group: + +.. code-block:: python + + with ( + CtxManager1() as example1, + CtxManager2() as example2, + CtxManager3() as example3, + ): + ... + +This new syntax uses the non LL(1) capacities of the new parser. +Check :pep:`617` for more details. + +(Contributed by Guido van Rossum, Pablo Galindo and Lysandros Nikolaou +in :issue:`12782` and :issue:`40334`.) + + +Better error messages +--------------------- + +SyntaxErrors +~~~~~~~~~~~~ + +When parsing code that contains unclosed parentheses or brackets the interpreter +now includes the location of the unclosed bracket of parentheses instead of displaying +*SyntaxError: unexpected EOF while parsing* or pointing to some incorrect location. +For instance, consider the following code (notice the unclosed '{'): + +.. code-block:: python + + expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, + 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6, + some_other_code = foo() + +Previous versions of the interpreter reported confusing places as the location of +the syntax error: + +.. code-block:: python + + File "example.py", line 3 + some_other_code = foo() + ^ + SyntaxError: invalid syntax + +but in Python 3.10 a more informative error is emitted: + +.. code-block:: python + + File "example.py", line 1 + expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, + ^ + SyntaxError: '{' was never closed + + +In a similar way, errors involving unclosed string literals (single and triple +quoted) now point to the start of the string instead of reporting EOF/EOL. + +These improvements are inspired by previous work in the PyPy interpreter. + +(Contributed by Pablo Galindo in :issue:`42864` and Batuhan Taskaya in +:issue:`40176`.) + +:exc:`SyntaxError` exceptions raised by the interpreter will now highlight the +full error range of the expression that constitutes the syntax error itself, +instead of just where the problem is detected. In this way, instead of displaying +(before Python 3.10): + +.. code-block:: python + + >>> foo(x, z for z in range(10), t, w) + File "", line 1 + foo(x, z for z in range(10), t, w) + ^ + SyntaxError: Generator expression must be parenthesized + +now Python 3.10 will display the exception as: + +.. code-block:: python + + >>> foo(x, z for z in range(10), t, w) + File "", line 1 + foo(x, z for z in range(10), t, w) + ^^^^^^^^^^^^^^^^^^^^ + SyntaxError: Generator expression must be parenthesized + +This improvement was contributed by Pablo Galindo in :issue:`43914`. + +A considerable amount of new specialized messages for :exc:`SyntaxError` exceptions +have been incorporated. Some of the most notable ones are as follows: + +* Missing ``:`` before blocks: + + .. code-block:: python + + >>> if rocket.position > event_horizon + File "", line 1 + if rocket.position > event_horizon + ^ + SyntaxError: expected ':' + + (Contributed by Pablo Galindo in :issue:`42997`) + +* Unparenthesised tuples in comprehensions targets: + + .. code-block:: python + + >>> {x,y for x,y in zip('abcd', '1234')} + File "", line 1 + {x,y for x,y in zip('abcd', '1234')} + ^ + SyntaxError: did you forget parentheses around the comprehension target? + + (Contributed by Pablo Galindo in :issue:`43017`) + +* Missing commas in collection literals and between expressions: + + .. code-block:: python + + >>> items = { + ... x: 1, + ... y: 2 + ... z: 3, + File "", line 3 + y: 2 + ^ + SyntaxError: invalid syntax. Perhaps you forgot a comma? + + (Contributed by Pablo Galindo in :issue:`43822`) + +* Multiple Exception types without parentheses: + + .. code-block:: python + + >>> try: + ... build_dyson_sphere() + ... except NotEnoughScienceError, NotEnoughResourcesError: + File "", line 3 + except NotEnoughScienceError, NotEnoughResourcesError: + ^ + SyntaxError: multiple exception types must be parenthesized + + (Contributed by Pablo Galindo in :issue:`43149`) + +* Missing ``:`` and values in dictionary literals: + + .. code-block:: python + + >>> values = { + ... x: 1, + ... y: 2, + ... z: + ... } + File "", line 4 + z: + ^ + SyntaxError: expression expected after dictionary key and ':' + + >>> values = {x:1, y:2, z w:3} + File "", line 1 + values = {x:1, y:2, z w:3} + ^ + SyntaxError: ':' expected after dictionary key + + (Contributed by Pablo Galindo in :issue:`43823`) + +* ``try`` blocks without ``except`` or ``finally`` blocks: + + .. code-block:: python + + >>> try: + ... x = 2 + ... something = 3 + File "", line 3 + something = 3 + ^^^^^^^^^ + SyntaxError: expected 'except' or 'finally' block + + (Contributed by Pablo Galindo in :issue:`44305`) + +* Usage of ``=`` instead of ``==`` in comparisons: + + .. code-block:: python + + >>> if rocket.position = event_horizon: + File "", line 1 + if rocket.position = event_horizon: + ^ + SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='? + + (Contributed by Pablo Galindo in :issue:`43797`) + +* Usage of ``*`` in f-strings: + + .. code-block:: python + + >>> f"Black holes {*all_black_holes} and revelations" + File "", line 1 + (*all_black_holes) + ^ + SyntaxError: f-string: cannot use starred expression here + + (Contributed by Pablo Galindo in :issue:`41064`) + +IndentationErrors +~~~~~~~~~~~~~~~~~ + +Many :exc:`IndentationError` exceptions now have more context regarding what kind of block +was expecting an indentation, including the location of the statement: + +.. code-block:: python + + >>> def foo(): + ... if lel: + ... x = 2 + File "", line 3 + x = 2 + ^ + IndentationError: expected an indented block after 'if' statement in line 2 + + +AttributeErrors +~~~~~~~~~~~~~~~ + +When printing :exc:`AttributeError`, :c:func:`PyErr_Display` will offer +suggestions of similar attribute names in the object that the exception was +raised from: + +.. code-block:: python + + >>> collections.namedtoplo + Traceback (most recent call last): + File "", line 1, in + AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple? + +(Contributed by Pablo Galindo in :issue:`38530`.) + + .. warning:: + Notice this won't work if :c:func:`PyErr_Display` is not called to display the error + which can happen if some other custom error display function is used. This is a common + scenario in some REPLs like IPython. + +NameErrors +~~~~~~~~~~ + +When printing :exc:`NameError` raised by the interpreter, :c:func:`PyErr_Display` +will offer suggestions of similar variable names in the function that the exception +was raised from: + +.. code-block:: python + + >>> schwarzschild_black_hole = None + >>> schwarschild_black_hole + Traceback (most recent call last): + File "", line 1, in + NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole? + +(Contributed by Pablo Galindo in :issue:`38530`.) + + .. warning:: + Notice this won't work if :c:func:`PyErr_Display` is not called to display the error, + which can happen if some other custom error display function is used. This is a common + scenario in some REPLs like IPython. + + +PEP 626: Precise line numbers for debugging and other tools +----------------------------------------------------------- + +PEP 626 brings more precise and reliable line numbers for debugging, profiling and coverage tools. +Tracing events, with the correct line number, are generated for all lines of code executed and only for lines of code that are executed. + +The ``f_lineno`` attribute of frame objects will always contain the expected line number. + +The ``co_lnotab`` attribute of code objects is deprecated and will be removed in 3.12. +Code that needs to convert from offset to line number should use the new ``co_lines()`` method instead. + +PEP 634: Structural Pattern Matching +------------------------------------ + +Structural pattern matching has been added in the form of a *match statement* +and *case statements* of patterns with associated actions. Patterns +consist of sequences, mappings, primitive data types as well as class instances. +Pattern matching enables programs to extract information from complex data types, +branch on the structure of data, and apply specific actions based on different +forms of data. + +Syntax and operations +~~~~~~~~~~~~~~~~~~~~~ + +The generic syntax of pattern matching is:: + + match subject: + case : + + case : + + case : + + case _: + + +A match statement takes an expression and compares its value to successive +patterns given as one or more case blocks. Specifically, pattern matching +operates by: + + 1. using data with type and shape (the ``subject``) + 2. evaluating the ``subject`` in the ``match`` statement + 3. comparing the subject with each pattern in a ``case`` statement + from top to bottom until a match is confirmed. + 4. executing the action associated with the pattern of the confirmed + match + 5. If an exact match is not confirmed, the last case, a wildcard ``_``, + if provided, will be used as the matching case. If an exact match is + not confirmed and a wildcard case does not exist, the entire match + block is a no-op. + +Declarative approach +~~~~~~~~~~~~~~~~~~~~ + +Readers may be aware of pattern matching through the simple example of matching +a subject (data object) to a literal (pattern) with the switch statement found +in C, Java or JavaScript (and many other languages). Often the switch statement +is used for comparison of an object/expression with case statements containing +literals. + +More powerful examples of pattern matching can be found in languages such as +Scala and Elixir. With structural pattern matching, the approach is "declarative" and +explicitly states the conditions (the patterns) for data to match. + +While an "imperative" series of instructions using nested "if" statements +could be used to accomplish something similar to structural pattern matching, +it is less clear than the "declarative" approach. Instead the "declarative" +approach states the conditions to meet for a match and is more readable through +its explicit patterns. While structural pattern matching can be used in its +simplest form comparing a variable to a literal in a case statement, its +true value for Python lies in its handling of the subject's type and shape. + +Simple pattern: match to a literal +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Let's look at this example as pattern matching in its simplest form: a value, +the subject, being matched to several literals, the patterns. In the example +below, ``status`` is the subject of the match statement. The patterns are +each of the case statements, where literals represent request status codes. +The associated action to the case is executed after a match:: + + def http_error(status): + match status: + case 400: + return "Bad request" + case 404: + return "Not found" + case 418: + return "I'm a teapot" + case _: + return "Something's wrong with the internet" + +If the above function is passed a ``status`` of 418, "I'm a teapot" is returned. +If the above function is passed a ``status`` of 500, the case statement with +``_`` will match as a wildcard, and "Something's wrong with the internet" is +returned. +Note the last block: the variable name, ``_``, acts as a *wildcard* and insures +the subject will always match. The use of ``_`` is optional. + +You can combine several literals in a single pattern using ``|`` ("or"):: + + case 401 | 403 | 404: + return "Not allowed" + +Behavior without the wildcard +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If we modify the above example by removing the last case block, the example +becomes:: + + def http_error(status): + match status: + case 400: + return "Bad request" + case 404: + return "Not found" + case 418: + return "I'm a teapot" + +Without the use of ``_`` in a case statement, a match may not exist. If no +match exists, the behavior is a no-op. For example, if ``status`` of 500 is +passed, a no-op occurs. + +Patterns with a literal and variable +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Patterns can look like unpacking assignments, and a pattern may be used to bind +variables. In this example, a data point can be unpacked to its x-coordinate +and y-coordinate:: + + # point is an (x, y) tuple + match point: + case (0, 0): + print("Origin") + case (0, y): + print(f"Y={y}") + case (x, 0): + print(f"X={x}") + case (x, y): + print(f"X={x}, Y={y}") + case _: + raise ValueError("Not a point") + +The first pattern has two literals, ``(0, 0)``, and may be thought of as an +extension of the literal pattern shown above. The next two patterns combine a +literal and a variable, and the variable *binds* a value from the subject +(``point``). The fourth pattern captures two values, which makes it +conceptually similar to the unpacking assignment ``(x, y) = point``. + +Patterns and classes +~~~~~~~~~~~~~~~~~~~~ + +If you are using classes to structure your data, you can use as a pattern +the class name followed by an argument list resembling a constructor. This +pattern has the ability to capture class attributes into variables:: + + class Point: + x: int + y: int + + def location(point): + match point: + case Point(x=0, y=0): + print("Origin is the point's location.") + case Point(x=0, y=y): + print(f"Y={y} and the point is on the y-axis.") + case Point(x=x, y=0): + print(f"X={x} and the point is on the x-axis.") + case Point(): + print("The point is located somewhere else on the plane.") + case _: + print("Not a point") + +Patterns with positional parameters +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can use positional parameters with some builtin classes that provide an +ordering for their attributes (e.g. dataclasses). You can also define a specific +position for attributes in patterns by setting the ``__match_args__`` special +attribute in your classes. If it's set to ("x", "y"), the following patterns +are all equivalent (and all bind the ``y`` attribute to the ``var`` variable):: + + Point(1, var) + Point(1, y=var) + Point(x=1, y=var) + Point(y=var, x=1) + +Nested patterns +~~~~~~~~~~~~~~~ + +Patterns can be arbitrarily nested. For example, if our data is a short +list of points, it could be matched like this:: + + match points: + case []: + print("No points in the list.") + case [Point(0, 0)]: + print("The origin is the only point in the list.") + case [Point(x, y)]: + print(f"A single point {x}, {y} is in the list.") + case [Point(0, y1), Point(0, y2)]: + print(f"Two points on the Y axis at {y1}, {y2} are in the list.") + case _: + print("Something else is found in the list.") + +Complex patterns and the wildcard +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To this point, the examples have used ``_`` alone in the last case statement. +A wildcard can be used in more complex patterns, such as ``('error', code, _)``. +For example:: + + match test_variable: + case ('warning', code, 40): + print("A warning has been received.") + case ('error', code, _): + print(f"An error {code} occurred.") + +In the above case, ``test_variable`` will match for ('error', code, 100) and +('error', code, 800). + +Guard +~~~~~ + +We can add an ``if`` clause to a pattern, known as a "guard". If the +guard is false, ``match`` goes on to try the next case block. Note +that value capture happens before the guard is evaluated:: + + match point: + case Point(x, y) if x == y: + print(f"The point is located on the diagonal Y=X at {x}.") + case Point(x, y): + print(f"Point is not on the diagonal.") + +Other Key Features +~~~~~~~~~~~~~~~~~~ + +Several other key features: + +- Like unpacking assignments, tuple and list patterns have exactly the + same meaning and actually match arbitrary sequences. Technically, + the subject must be a sequence. + Therefore, an important exception is that patterns don't match iterators. + Also, to prevent a common mistake, sequence patterns don't match strings. + +- Sequence patterns support wildcards: ``[x, y, *rest]`` and ``(x, y, + *rest)`` work similar to wildcards in unpacking assignments. The + name after ``*`` may also be ``_``, so ``(x, y, *_)`` matches a sequence + of at least two items without binding the remaining items. + +- Mapping patterns: ``{"bandwidth": b, "latency": l}`` captures the + ``"bandwidth"`` and ``"latency"`` values from a dict. Unlike sequence + patterns, extra keys are ignored. A wildcard ``**rest`` is also + supported. (But ``**_`` would be redundant, so is not allowed.) + +- Subpatterns may be captured using the ``as`` keyword:: + + case (Point(x1, y1), Point(x2, y2) as p2): ... + + This binds x1, y1, x2, y2 like you would expect without the ``as`` clause, + and p2 to the entire second item of the subject. + +- Most literals are compared by equality. However, the singletons ``True``, + ``False`` and ``None`` are compared by identity. + +- Named constants may be used in patterns. These named constants must be + dotted names to prevent the constant from being interpreted as a capture + variable:: + + from enum import Enum + class Color(Enum): + RED = 0 + GREEN = 1 + BLUE = 2 + + match color: + case Color.RED: + print("I see red!") + case Color.GREEN: + print("Grass is green") + case Color.BLUE: + print("I'm feeling the blues :(") + +For the full specification see :pep:`634`. Motivation and rationale +are in :pep:`635`, and a longer tutorial is in :pep:`636`. + + +.. _whatsnew310-pep597: + +Optional ``EncodingWarning`` and ``encoding="locale"`` option +------------------------------------------------------------- + +The default encoding of :class:`TextIOWrapper` and :func:`open` is +platform and locale dependent. Since UTF-8 is used on most Unix +platforms, omitting ``encoding`` option when opening UTF-8 files +(e.g. JSON, YAML, TOML, Markdown) is a very common bug. For example:: + + # BUG: "rb" mode or encoding="utf-8" should be used. + with open("data.json") as f: + data = json.load(f) + +To find this type of bug, an optional ``EncodingWarning`` is added. +It is emitted when :data:`sys.flags.warn_default_encoding ` +is true and locale-specific default encoding is used. + +``-X warn_default_encoding`` option and :envvar:`PYTHONWARNDEFAULTENCODING` +are added to enable the warning. + +See :ref:`io-text-encoding` for more information. + + +New Features Related to Type Hints +================================== + +This section covers major changes affecting :pep:`484` type hints and +the :mod:`typing` module. + + +PEP 604: New Type Union Operator +-------------------------------- + +A new type union operator was introduced which enables the syntax ``X | Y``. +This provides a cleaner way of expressing 'either type X or type Y' instead of +using :data:`typing.Union`, especially in type hints. + +In previous versions of Python, to apply a type hint for functions accepting +arguments of multiple types, :data:`typing.Union` was used:: + + def square(number: Union[int, float]) -> Union[int, float]: + return number ** 2 + + +Type hints can now be written in a more succinct manner:: + + def square(number: int | float) -> int | float: + return number ** 2 + + +This new syntax is also accepted as the second argument to :func:`isinstance` +and :func:`issubclass`:: + + >>> isinstance(1, int | str) + True + +See :ref:`types-union` and :pep:`604` for more details. + +(Contributed by Maggie Moss and Philippe Prados in :issue:`41428`, +with additions by Yurii Karabas and Serhiy Storchaka in :issue:`44490`.) + + +PEP 612: Parameter Specification Variables +------------------------------------------ + +Two new options to improve the information provided to static type checkers for +:pep:`484`\ 's ``Callable`` have been added to the :mod:`typing` module. + +The first is the parameter specification variable. They are used to forward the +parameter types of one callable to another callable -- a pattern commonly +found in higher order functions and decorators. Examples of usage can be found +in :class:`typing.ParamSpec`. Previously, there was no easy way to type annotate +dependency of parameter types in such a precise manner. + +The second option is the new ``Concatenate`` operator. It's used in conjunction +with parameter specification variables to type annotate a higher order callable +which adds or removes parameters of another callable. Examples of usage can +be found in :class:`typing.Concatenate`. + +See :class:`typing.Callable`, :class:`typing.ParamSpec`, +:class:`typing.Concatenate`, :class:`typing.ParamSpecArgs`, +:class:`typing.ParamSpecKwargs`, and :pep:`612` for more details. + +(Contributed by Ken Jin in :issue:`41559`, with minor enhancements by Jelle +Zijlstra in :issue:`43783`. PEP written by Mark Mendoza.) + + +PEP 613: TypeAlias +------------------ + +:pep:`484` introduced the concept of type aliases, only requiring them to be +top-level unannotated assignments. This simplicity sometimes made it difficult +for type checkers to distinguish between type aliases and ordinary assignments, +especially when forward references or invalid types were involved. Compare:: + + StrCache = 'Cache[str]' # a type alias + LOG_PREFIX = 'LOG[DEBUG]' # a module constant + +Now the :mod:`typing` module has a special value :data:`TypeAlias` +which lets you declare type aliases more explicitly:: + + StrCache: TypeAlias = 'Cache[str]' # a type alias + LOG_PREFIX = 'LOG[DEBUG]' # a module constant + +See :pep:`613` for more details. + +(Contributed by Mikhail Golubev in :issue:`41923`.) + +PEP 647: User-Defined Type Guards +--------------------------------- + +:data:`TypeGuard` has been added to the :mod:`typing` module to annotate +type guard functions and improve information provided to static type checkers +during type narrowing. For more information, please see :data:`TypeGuard`\ 's +documentation, and :pep:`647`. + +(Contributed by Ken Jin and Guido van Rossum in :issue:`43766`. +PEP written by Eric Traut.) + +Other Language Changes +====================== + +* The :class:`int` type has a new method :meth:`int.bit_count`, returning the + number of ones in the binary expansion of a given integer, also known + as the population count. (Contributed by Niklas Fiekas in :issue:`29882`.) + +* The views returned by :meth:`dict.keys`, :meth:`dict.values` and + :meth:`dict.items` now all have a ``mapping`` attribute that gives a + :class:`types.MappingProxyType` object wrapping the original + dictionary. (Contributed by Dennis Sweeney in :issue:`40890`.) + +* :pep:`618`: The :func:`zip` function now has an optional ``strict`` flag, used + to require that all the iterables have an equal length. + +* Builtin and extension functions that take integer arguments no longer accept + :class:`~decimal.Decimal`\ s, :class:`~fractions.Fraction`\ s and other + objects that can be converted to integers only with a loss (e.g. that have + the :meth:`~object.__int__` method but do not have the + :meth:`~object.__index__` method). + (Contributed by Serhiy Storchaka in :issue:`37999`.) + +* If :func:`object.__ipow__` returns :const:`NotImplemented`, the operator will + correctly fall back to :func:`object.__pow__` and :func:`object.__rpow__` as expected. + (Contributed by Alex Shkop in :issue:`38302`.) + +* Assignment expressions can now be used unparenthesized within set literals + and set comprehensions, as well as in sequence indexes (but not slices). + +* Functions have a new ``__builtins__`` attribute which is used to look for + builtin symbols when a function is executed, instead of looking into + ``__globals__['__builtins__']``. The attribute is initialized from + ``__globals__["__builtins__"]`` if it exists, else from the current builtins. + (Contributed by Mark Shannon in :issue:`42990`.) + +* Two new builtin functions -- :func:`aiter` and :func:`anext` have been added + to provide asynchronous counterparts to :func:`iter` and :func:`next`, + respectively. + (Contributed by Joshua Bronson, Daniel Pope, and Justin Wang in :issue:`31861`.) + +* Static methods (:func:`@staticmethod `) and class methods + (:func:`@classmethod `) now inherit the method attributes + (``__module__``, ``__name__``, ``__qualname__``, ``__doc__``, + ``__annotations__``) and have a new ``__wrapped__`` attribute. + Moreover, static methods are now callable as regular functions. + (Contributed by Victor Stinner in :issue:`43682`.) + +* Annotations for complex targets (everything beside ``simple name`` targets + defined by :pep:`526`) no longer cause any runtime effects with ``from __future__ import annotations``. + (Contributed by Batuhan Taskaya in :issue:`42737`.) + +* Class and module objects now lazy-create empty annotations dicts on demand. + The annotations dicts are stored in the object’s ``__dict__`` for + backwards compatibility. This improves the best practices for working + with ``__annotations__``; for more information, please see + :ref:`annotations-howto`. + (Contributed by Larry Hastings in :issue:`43901`.) + +* Annotations consist of ``yield``, ``yield from``, ``await`` or named expressions + are now forbidden under ``from __future__ import annotations`` due to their side + effects. + (Contributed by Batuhan Taskaya in :issue:`42725`.) + +* Usage of unbound variables, ``super()`` and other expressions that might + alter the processing of symbol table as annotations are now rendered + effectless under ``from __future__ import annotations``. + (Contributed by Batuhan Taskaya in :issue:`42725`.) + +* Hashes of NaN values of both :class:`float` type and + :class:`decimal.Decimal` type now depend on object identity. Formerly, they + always hashed to ``0`` even though NaN values are not equal to one another. + This caused potentially quadratic runtime behavior due to excessive hash + collisions when creating dictionaries and sets containing multiple NaNs. + (Contributed by Raymond Hettinger in :issue:`43475`.) + +* A :exc:`SyntaxError` (instead of a :exc:`NameError`) will be raised when deleting + the :const:`__debug__` constant. (Contributed by Dong-hee Na in :issue:`45000`.) + +* :exc:`SyntaxError` exceptions now have ``end_lineno`` and + ``end_offset`` attributes. They will be ``None`` if not determined. + (Contributed by Pablo Galindo in :issue:`43914`.) + +New Modules +=========== + +* None yet. + + +Improved Modules +================ + +asyncio +------- + +Add missing :meth:`~asyncio.events.AbstractEventLoop.connect_accepted_socket` +method. +(Contributed by Alex Grönholm in :issue:`41332`.) + +argparse +-------- + +Misleading phrase "optional arguments" was replaced with "options" in argparse help. Some tests might require adaptation if they rely on exact output match. +(Contributed by Raymond Hettinger in :issue:`9694`.) + +array +----- + +The :meth:`~array.array.index` method of :class:`array.array` now has +optional *start* and *stop* parameters. +(Contributed by Anders Lorentsen and Zackery Spytz in :issue:`31956`.) + +asynchat, asyncore, smtpd +------------------------- +These modules have been marked as deprecated in their module documentation +since Python 3.6. An import-time :class:`DeprecationWarning` has now been +added to all three of these modules. + +base64 +------ + +Add :func:`base64.b32hexencode` and :func:`base64.b32hexdecode` to support the +Base32 Encoding with Extended Hex Alphabet. + +bdb +--- + +Add :meth:`~bdb.Breakpoint.clearBreakpoints` to reset all set breakpoints. +(Contributed by Irit Katriel in :issue:`24160`.) + +bisect +------ + +Added the possibility of providing a *key* function to the APIs in the :mod:`bisect` +module. (Contributed by Raymond Hettinger in :issue:`4356`.) + +codecs +------ + +Add a :func:`codecs.unregister` function to unregister a codec search function. +(Contributed by Hai Shi in :issue:`41842`.) + +collections.abc +--------------- + +The ``__args__`` of the :ref:`parameterized generic ` for +:class:`collections.abc.Callable` are now consistent with :data:`typing.Callable`. +:class:`collections.abc.Callable` generic now flattens type parameters, similar +to what :data:`typing.Callable` currently does. This means that +``collections.abc.Callable[[int, str], str]`` will have ``__args__`` of +``(int, str, str)``; previously this was ``([int, str], str)``. To allow this +change, :class:`types.GenericAlias` can now be subclassed, and a subclass will +be returned when subscripting the :class:`collections.abc.Callable` type. Note +that a :exc:`TypeError` may be raised for invalid forms of parameterizing +:class:`collections.abc.Callable` which may have passed silently in Python 3.9. +(Contributed by Ken Jin in :issue:`42195`.) + +contextlib +---------- + +Add a :func:`contextlib.aclosing` context manager to safely close async generators +and objects representing asynchronously released resources. +(Contributed by Joongi Kim and John Belmonte in :issue:`41229`.) + +Add asynchronous context manager support to :func:`contextlib.nullcontext`. +(Contributed by Tom Gringauz in :issue:`41543`.) + +Add :class:`AsyncContextDecorator`, for supporting usage of async context managers +as decorators. + +curses +------ + +The extended color functions added in ncurses 6.1 will be used transparently +by :func:`curses.color_content`, :func:`curses.init_color`, +:func:`curses.init_pair`, and :func:`curses.pair_content`. A new function, +:func:`curses.has_extended_color_support`, indicates whether extended color +support is provided by the underlying ncurses library. +(Contributed by Jeffrey Kintscher and Hans Petter Jansson in :issue:`36982`.) + +The ``BUTTON5_*`` constants are now exposed in the :mod:`curses` module if +they are provided by the underlying curses library. +(Contributed by Zackery Spytz in :issue:`39273`.) + +dataclasses +----------- + +__slots__ +~~~~~~~~~ + +Added ``slots`` parameter in :func:`dataclasses.dataclass` decorator. +(Contributed by Yurii Karabas in :issue:`42269`) + +Keyword-only fields +~~~~~~~~~~~~~~~~~~~ + +dataclassses now supports fields that are keyword-only in the +generated __init__ method. There are a number of ways of specifying +keyword-only fields. + +You can say that every field is keyword-only: + +.. code-block:: python + + from dataclasses import dataclass + + @dataclass(kw_only=True) + class Birthday: + name: str + birthday: datetime.date + +Both ``name`` and ``birthday`` are keyword-only parameters to the +generated __init__ method. + +You can specify keyword-only on a per-field basis: + +.. code-block:: python + + from dataclasses import dataclass + + @dataclass + class Birthday: + name: str + birthday: datetime.date = field(kw_only=True) + +Here only ``birthday`` is keyword-only. If you set ``kw_only`` on +individual fields, be aware that there are rules about re-ordering +fields due to keyword-only fields needing to follow non-keyword-only +fields. See the full dataclasses documentation for details. + +You can also specify that all fields following a KW_ONLY marker are +keyword-only. This will probably be the most common usage: + +.. code-block:: python + + from dataclasses import dataclass, KW_ONLY + + @dataclass + class Point: + x: float + y: float + _: KW_ONLY + z: float = 0.0 + t: float = 0.0 + +Here, ``z`` and ``t`` are keyword-only parameters, while ``x`` and +``y`` are not. +(Contributed by Eric V. Smith in :issue:`43532`) + +.. _distutils-deprecated: + +distutils +--------- + +The entire ``distutils`` package is deprecated, to be removed in Python +3.12. Its functionality for specifying package builds has already been +completely replaced by third-party packages ``setuptools`` and +``packaging``, and most other commonly used APIs are available elsewhere +in the standard library (such as :mod:`platform`, :mod:`shutil`, +:mod:`subprocess` or :mod:`sysconfig`). There are no plans to migrate +any other functionality from ``distutils``, and applications that are +using other functions should plan to make private copies of the code. +Refer to :pep:`632` for discussion. + +The ``bdist_wininst`` command deprecated in Python 3.8 has been removed. +The ``bdist_wheel`` command is now recommended to distribute binary packages +on Windows. +(Contributed by Victor Stinner in :issue:`42802`.) + +doctest +------- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + +encodings +--------- + +:func:`encodings.normalize_encoding` now ignores non-ASCII characters. +(Contributed by Hai Shi in :issue:`39337`.) + +fileinput +--------- + +Add *encoding* and *errors* parameters in :func:`fileinput.input` and +:class:`fileinput.FileInput`. +(Contributed by Inada Naoki in :issue:`43712`.) + +:func:`fileinput.hook_compressed` now returns :class:`TextIOWrapper` object +when *mode* is "r" and file is compressed, like uncompressed files. +(Contributed by Inada Naoki in :issue:`5758`.) + +faulthandler +------------ + +The :mod:`faulthandler` module now detects if a fatal error occurs during a +garbage collector collection. +(Contributed by Victor Stinner in :issue:`44466`.) + +gc +-- + +Add audit hooks for :func:`gc.get_objects`, :func:`gc.get_referrers` and +:func:`gc.get_referents`. (Contributed by Pablo Galindo in :issue:`43439`.) + +glob +---- + +Add the *root_dir* and *dir_fd* parameters in :func:`~glob.glob` and +:func:`~glob.iglob` which allow to specify the root directory for searching. +(Contributed by Serhiy Storchaka in :issue:`38144`.) + +hashlib +------- + +The hashlib module requires OpenSSL 1.1.1 or newer. +(Contributed by Christian Heimes in :pep:`644` and :issue:`43669`.) + +The hashlib module has preliminary support for OpenSSL 3.0.0. +(Contributed by Christian Heimes in :issue:`38820` and other issues.) + +The pure-Python fallback of :func:`~hashlib.pbkdf2_hmac` is deprecated. In +the future PBKDF2-HMAC will only be available when Python has been built with +OpenSSL support. +(Contributed by Christian Heimes in :issue:`43880`.) + +hmac +---- + +The hmac module now uses OpenSSL's HMAC implementation internally. +(Contributed by Christian Heimes in :issue:`40645`.) + +IDLE and idlelib +---------------- + +Make IDLE invoke :func:`sys.excepthook` (when started without '-n'). +User hooks were previously ignored. (Patch by Ken Hilton in +:issue:`43008`.) + +This change was backported to a 3.9 maintenance release. + +Add a Shell sidebar. Move the primary prompt ('>>>') to the sidebar. +Add secondary prompts ('...') to the sidebar. Left click and optional +drag selects one or more lines of text, as with the editor +line number sidebar. Right click after selecting text lines displays +a context menu with 'copy with prompts'. This zips together prompts +from the sidebar with lines from the selected text. This option also +appears on the context menu for the text. (Contributed by Tal Einat +in :issue:`37903`.) + +Use spaces instead of tabs to indent interactive code. This makes +interactive code entries 'look right'. Making this feasible was a +major motivation for adding the shell sidebar. Contributed by +Terry Jan Reedy in :issue:`37892`.) + +We expect to backport these shell changes to a future 3.9 maintenance +release. + +Highlight the new :ref:`soft keywords ` :keyword:`match`, +:keyword:`case `, and :keyword:`_ ` in +pattern-matching statements. However, this highlighting is not perfect +and will be incorrect in some rare cases, including some ``_``-s in +``case`` patterns. (Contributed by Tal Einat in bpo-44010.) + +importlib.metadata +------------------ + +Feature parity with ``importlib_metadata`` 4.6 +(`history `_). + +:ref:`importlib.metadata entry points ` +now provides a nicer experience +for selecting entry points by group and name through a new +:class:`importlib.metadata.EntryPoints` class. See the Compatibility +Note in the docs for more info on the deprecation and usage. + +Added :func:`importlib.metadata.packages_distributions` for resolving +top-level Python modules and packages to their +:class:`importlib.metadata.Distribution`. + +inspect +------- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + +Add :func:`inspect.get_annotations`, which safely computes the annotations +defined on an object. It works around the quirks of accessing the annotations +on various types of objects, and makes very few assumptions about the object +it examines. :func:`inspect.get_annotations` can also correctly un-stringize +stringized annotations. :func:`inspect.get_annotations` is now considered +best practice for accessing the annotations dict defined on any Python object; +for more information on best practices for working with annotations, please see +:ref:`annotations-howto`. +Relatedly, :func:`inspect.signature`, +:func:`inspect.Signature.from_callable`, and :func:`inspect.Signature.from_function` +now call :func:`inspect.get_annotations` to retrieve annotations. This means +:func:`inspect.signature` and :func:`inspect.Signature.from_callable` can +also now un-stringize stringized annotations. +(Contributed by Larry Hastings in :issue:`43817`.) + +linecache +--------- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + +os +-- + +Add :func:`os.cpu_count()` support for VxWorks RTOS. +(Contributed by Peixing Xin in :issue:`41440`.) + +Add a new function :func:`os.eventfd` and related helpers to wrap the +``eventfd2`` syscall on Linux. +(Contributed by Christian Heimes in :issue:`41001`.) + +Add :func:`os.splice()` that allows to move data between two file +descriptors without copying between kernel address space and user +address space, where one of the file descriptors must refer to a +pipe. (Contributed by Pablo Galindo in :issue:`41625`.) + +Add :data:`~os.O_EVTONLY`, :data:`~os.O_FSYNC`, :data:`~os.O_SYMLINK` +and :data:`~os.O_NOFOLLOW_ANY` for macOS. +(Contributed by Dong-hee Na in :issue:`43106`.) + +os.path +------- + +:func:`os.path.realpath` now accepts a *strict* keyword-only argument. When set +to ``True``, :exc:`OSError` is raised if a path doesn't exist or a symlink loop +is encountered. +(Contributed by Barney Gale in :issue:`43757`.) + +pathlib +------- + +Add slice support to :attr:`PurePath.parents `. +(Contributed by Joshua Cannon in :issue:`35498`) + +Add negative indexing support to :attr:`PurePath.parents +`. +(Contributed by Yaroslav Pankovych in :issue:`21041`) + +Add :meth:`Path.hardlink_to ` method that +supersedes :meth:`~pathlib.Path.link_to`. The new method has the same argument +order as :meth:`~pathlib.Path.symlink_to`. +(Contributed by Barney Gale in :issue:`39950`.) + +:meth:`pathlib.Path.stat` and :meth:`~pathlib.Path.chmod` now accept a +*follow_symlinks* keyword-only argument for consistency with corresponding +functions in the :mod:`os` module. +(Contributed by Barney Gale in :issue:`39906`.) + +platform +-------- + +Add :func:`platform.freedesktop_os_release()` to retrieve operation system +identification from `freedesktop.org os-release +`_ standard file. +(Contributed by Christian Heimes in :issue:`28468`) + +pprint +------ + +:func:`pprint.pprint` now accepts a new ``underscore_numbers`` keyword argument. +(Contributed by sblondon in :issue:`42914`.) + +:mod:`pprint` can now pretty-print :class:`dataclasses.dataclass` instances. +(Contributed by Lewis Gaul in :issue:`43080`.) + +py_compile +---------- + +Add ``--quiet`` option to command-line interface of :mod:`py_compile`. +(Contributed by Gregory Schevchenko in :issue:`38731`.) + +pyclbr +------ + +Add an ``end_lineno`` attribute to the ``Function`` and ``Class`` +objects in the tree returned by :func:`pyclbr.readline` and +:func:`pyclbr.readline_ex`. It matches the existing (start) ``lineno``. +(Contributed by Aviral Srivastava in :issue:`38307`.) + +shelve +------ + +The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default +instead of :mod:`pickle` protocol ``3`` when creating shelves. +(Contributed by Zackery Spytz in :issue:`34204`.) + +statistics +---------- + +Add :func:`~statistics.covariance`, Pearson's +:func:`~statistics.correlation`, and simple +:func:`~statistics.linear_regression` functions. +(Contributed by Tymoteusz Wołodźko in :issue:`38490`.) + +site +---- + +When a module does not define ``__loader__``, fall back to ``__spec__.loader``. +(Contributed by Brett Cannon in :issue:`42133`.) + +socket +------ + +The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. +(Contributed by Christian Heimes in :issue:`42413`.) + +Add option to create MPTCP sockets with ``IPPROTO_MPTCP`` +(Contributed by Rui Cunha in :issue:`43571`.) + +Add ``IP_RECVTOS`` option to receive the type of service (ToS) or DSCP/ECN fields +(Contributed by Georg Sauthoff in :issue:`44077`.) + +ssl +--- + +The ssl module requires OpenSSL 1.1.1 or newer. +(Contributed by Christian Heimes in :pep:`644` and :issue:`43669`.) + +The ssl module has preliminary support for OpenSSL 3.0.0 and new option +:data:`~ssl.OP_IGNORE_UNEXPECTED_EOF`. +(Contributed by Christian Heimes in :issue:`38820`, :issue:`43794`, +:issue:`43788`, :issue:`43791`, :issue:`43799`, :issue:`43920`, +:issue:`43789`, and :issue:`43811`.) + +Deprecated function and use of deprecated constants now result in +a :exc:`DeprecationWarning`. :attr:`ssl.SSLContext.options` has +:data:`~ssl.OP_NO_SSLv2` and :data:`~ssl.OP_NO_SSLv3` set by default and +therefore cannot warn about setting the flag again. The +:ref:`deprecation section ` has a list of deprecated +features. +(Contributed by Christian Heimes in :issue:`43880`.) + +The ssl module now has more secure default settings. Ciphers without forward +secrecy or SHA-1 MAC are disabled by default. Security level 2 prohibits +weak RSA, DH, and ECC keys with less than 112 bits of security. +:class:`~ssl.SSLContext` defaults to minimum protocol version TLS 1.2. +Settings are based on Hynek Schlawack's research. +(Contributed by Christian Heimes in :issue:`43998`.) + +The deprecated protocols SSL 3.0, TLS 1.0, and TLS 1.1 are no longer +officially supported. Python does not block them actively. However +OpenSSL build options, distro configurations, vendor patches, and cipher +suites may prevent a successful handshake. + +Add a *timeout* parameter to the :func:`ssl.get_server_certificate` function. +(Contributed by Zackery Spytz in :issue:`31870`.) + +The ssl module uses heap-types and multi-phase initialization. +(Contributed by Christian Heimes in :issue:`42333`.) + +A new verify flag :data:`~ssl.VERIFY_X509_PARTIAL_CHAIN` has been added. +(Contributed by l0x in :issue:`40849`.) + +sqlite3 +------- + +Add audit events for :func:`~sqlite3.connect/handle`, +:meth:`~sqlite3.Connection.enable_load_extension`, and +:meth:`~sqlite3.Connection.load_extension`. +(Contributed by Erlend E. Aasland in :issue:`43762`.) + +sys +--- + +Add :data:`sys.orig_argv` attribute: the list of the original command line +arguments passed to the Python executable. +(Contributed by Victor Stinner in :issue:`23427`.) + +Add :data:`sys.stdlib_module_names`, containing the list of the standard library +module names. +(Contributed by Victor Stinner in :issue:`42955`.) + +_thread +------- + +:func:`_thread.interrupt_main` now takes an optional signal number to +simulate (the default is still :data:`signal.SIGINT`). +(Contributed by Antoine Pitrou in :issue:`43356`.) + +threading +--------- + +Add :func:`threading.gettrace` and :func:`threading.getprofile` to +retrieve the functions set by :func:`threading.settrace` and +:func:`threading.setprofile` respectively. +(Contributed by Mario Corchero in :issue:`42251`.) + +Add :data:`threading.__excepthook__` to allow retrieving the original value +of :func:`threading.excepthook` in case it is set to a broken or a different +value. +(Contributed by Mario Corchero in :issue:`42308`.) + +traceback +--------- + +The :func:`~traceback.format_exception`, +:func:`~traceback.format_exception_only`, and +:func:`~traceback.print_exception` functions can now take an exception object +as a positional-only argument. +(Contributed by Zackery Spytz and Matthias Bussonnier in :issue:`26389`.) + +types +----- + +Reintroduce the :data:`types.EllipsisType`, :data:`types.NoneType` +and :data:`types.NotImplementedType` classes, providing a new set +of types readily interpretable by type checkers. +(Contributed by Bas van Beek in :issue:`41810`.) + +typing +------ + +For major changes, see `New Features Related to Type Hints`_. + +The behavior of :class:`typing.Literal` was changed to conform with :pep:`586` +and to match the behavior of static type checkers specified in the PEP. + +1. ``Literal`` now de-duplicates parameters. +2. Equality comparisons between ``Literal`` objects are now order independent. +3. ``Literal`` comparisons now respects types. For example, + ``Literal[0] == Literal[False]`` previously evaluated to ``True``. It is + now ``False``. To support this change, the internally used type cache now + supports differentiating types. +4. ``Literal`` objects will now raise a :exc:`TypeError` exception during + equality comparisons if any of their parameters are not :term:`hashable`. + Note that declaring ``Literal`` with unhashable parameters will not throw + an error:: + + >>> from typing import Literal + >>> Literal[{0}] + >>> Literal[{0}] == Literal[{False}] + Traceback (most recent call last): + File "", line 1, in + TypeError: unhashable type: 'set' + +(Contributed by Yurii Karabas in :issue:`42345`.) + +Add new function :func:`typing.is_typeddict` to introspect if an annotation +is a :class:`typing.TypedDict`. +(Contributed by Patrick Reader in :issue:`41792`) + +Subclasses of ``typing.Protocol`` which only have data variables declared +will now raise a ``TypeError`` when checked with ``isinstance`` unless they +are decorated with :func:`runtime_checkable`. Previously, these checks +passed silently. Users should decorate their +subclasses with the :func:`runtime_checkable` decorator +if they want runtime protocols. +(Contributed by Yurii Karabas in :issue:`38908`) + +Importing from the ``typing.io`` and ``typing.re`` submodules will now emit +:exc:`DeprecationWarning`. These submodules have been deprecated since +Python 3.8 and will be removed in a future version of Python. Anything +belonging to those submodules should be imported directly from +:mod:`typing` instead. +(Contributed by Sebastian Rittau in :issue:`38291`) + +unittest +-------- + +Add new method :meth:`~unittest.TestCase.assertNoLogs` to complement the +existing :meth:`~unittest.TestCase.assertLogs`. (Contributed by Kit Yan Choi +in :issue:`39385`.) + +urllib.parse +------------ + +Python versions earlier than Python 3.10 allowed using both ``;`` and ``&`` as +query parameter separators in :func:`urllib.parse.parse_qs` and +:func:`urllib.parse.parse_qsl`. Due to security concerns, and to conform with +newer W3C recommendations, this has been changed to allow only a single +separator key, with ``&`` as the default. This change also affects +:func:`cgi.parse` and :func:`cgi.parse_multipart` as they use the affected +functions internally. For more details, please see their respective +documentation. +(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) + +The presence of newline or tab characters in parts of a URL allows for some +forms of attacks. Following the WHATWG specification that updates :rfc:`3986`, +ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the +URL by the parser in :mod:`urllib.parse` preventing such attacks. The removal +characters are controlled by a new module level variable +``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :issue:`43882`) + +xml +--- + +Add a :class:`~xml.sax.handler.LexicalHandler` class to the +:mod:`xml.sax.handler` module. +(Contributed by Jonathan Gossage and Zackery Spytz in :issue:`35018`.) + +zipimport +--------- +Add methods related to :pep:`451`: :meth:`~zipimport.zipimporter.find_spec`, +:meth:`zipimport.zipimporter.create_module`, and +:meth:`zipimport.zipimporter.exec_module`. +(Contributed by Brett Cannon in :issue:`42131`.) + +Add :meth:`~zipimport.zipimporter.invalidate_caches` method. +(Contributed by Desmond Cheong in :issue:`14678`.) + + +Optimizations +============= + +* Constructors :func:`str`, :func:`bytes` and :func:`bytearray` are now faster + (around 30--40% for small objects). + (Contributed by Serhiy Storchaka in :issue:`41334`.) + +* The :mod:`runpy` module now imports fewer modules. + The ``python3 -m module-name`` command startup time is 1.4x faster in + average. On Linux, ``python3 -I -m module-name`` imports 69 modules on Python + 3.9, whereas it only imports 51 modules (-18) on Python 3.10. + (Contributed by Victor Stinner in :issue:`41006` and :issue:`41718`.) + +* The ``LOAD_ATTR`` instruction now uses new "per opcode cache" mechanism. It + is about 36% faster now for regular attributes and 44% faster for slots. + (Contributed by Pablo Galindo and Yury Selivanov in :issue:`42093` and Guido + van Rossum in :issue:`42927`, based on ideas implemented originally in PyPy + and MicroPython.) + +* When building Python with :option:`--enable-optimizations` now + ``-fno-semantic-interposition`` is added to both the compile and link line. + This speeds builds of the Python interpreter created with :option:`--enable-shared` + with ``gcc`` by up to 30%. See `this article + `_ + for more details. (Contributed by Victor Stinner and Pablo Galindo in + :issue:`38980`.) + +* Use a new output buffer management code for :mod:`bz2` / :mod:`lzma` / + :mod:`zlib` modules, and add ``.readall()`` function to + ``_compression.DecompressReader`` class. bz2 decompression is now 1.09x ~ 1.17x + faster, lzma decompression 1.20x ~ 1.32x faster, ``GzipFile.read(-1)`` 1.11x + ~ 1.18x faster. (Contributed by Ma Lin, reviewed by Gregory P. Smith, in :issue:`41486`) + +* When using stringized annotations, annotations dicts for functions are no longer + created when the function is created. Instead, they are stored as a tuple of + strings, and the function object lazily converts this into the annotations dict + on demand. This optimization cuts the CPU time needed to define an annotated + function by half. + (Contributed by Yurii Karabas and Inada Naoki in :issue:`42202`) + +* Substring search functions such as ``str1 in str2`` and ``str2.find(str1)`` + now sometimes use Crochemore & Perrin's "Two-Way" string searching + algorithm to avoid quadratic behavior on long strings. (Contributed + by Dennis Sweeney in :issue:`41972`) + +* Add micro-optimizations to ``_PyType_Lookup()`` to improve type attribute cache lookup + performance in the common case of cache hits. This makes the interpreter 1.04 times faster + on average. (Contributed by Dino Viehland in :issue:`43452`) + +* The following built-in functions now support the faster :pep:`590` vectorcall calling convention: + :func:`map`, :func:`filter`, :func:`reversed`, :func:`bool` and :func:`float`. + (Contributed by Dong-hee Na and Jeroen Demeyer in :issue:`43575`, :issue:`43287`, :issue:`41922`, :issue:`41873` and :issue:`41870`) + +* :class:`BZ2File` performance is improved by removing internal ``RLock``. + This makes :class:`BZ2File` thread unsafe in the face of multiple simultaneous + readers or writers, just like its equivalent classes in :mod:`gzip` and + :mod:`lzma` have always been. (Contributed by Inada Naoki in :issue:`43785`). + +.. _whatsnew310-deprecated: + +Deprecated +========== + +* Currently Python accepts numeric literals immediately followed by keywords, + for example ``0in x``, ``1or x``, ``0if 1else 2``. It allows confusing + and ambigious expressions like ``[0x1for x in y]`` (which can be + interpreted as ``[0x1 for x in y]`` or ``[0x1f or x in y]``). Starting in + this release, a deprecation warning is raised if the numeric literal is + immediately followed by one of keywords :keyword:`and`, :keyword:`else`, + :keyword:`for`, :keyword:`if`, :keyword:`in`, :keyword:`is` and :keyword:`or`. + If future releases it will be changed to syntax warning, and finally to + syntax error. + (Contributed by Serhiy Storchaka in :issue:`43833`). + +* Starting in this release, there will be a concerted effort to begin + cleaning up old import semantics that were kept for Python 2.7 + compatibility. Specifically, + :meth:`~importlib.abc.PathEntryFinder.find_loader`/:meth:`~importlib.abc.Finder.find_module` + (superseded by :meth:`~importlib.abc.Finder.find_spec`), + :meth:`~importlib.abc.Loader.load_module` + (superseded by :meth:`~importlib.abc.Loader.exec_module`), + :meth:`~importlib.abc.Loader.module_repr` (which the import system + takes care of for you), the ``__package__`` attribute + (superseded by ``__spec__.parent``), the ``__loader__`` attribute + (superseded by ``__spec__.loader``), and the ``__cached__`` attribute + (superseded by ``__spec__.cached``) will slowly be removed (as well + as other classes and methods in :mod:`importlib`). + :exc:`ImportWarning` and/or :exc:`DeprecationWarning` will be raised + as appropriate to help identify code which needs updating during + this transition. + +* The entire ``distutils`` namespace is deprecated, to be removed in + Python 3.12. Refer to the :ref:`module changes ` + section for more information. + +* Non-integer arguments to :func:`random.randrange` are deprecated. + The :exc:`ValueError` is deprecated in favor of a :exc:`TypeError`. + (Contributed by Serhiy Storchaka and Raymond Hettinger in :issue:`37319`.) + +* The various ``load_module()`` methods of :mod:`importlib` have been + documented as deprecated since Python 3.6, but will now also trigger + a :exc:`DeprecationWarning`. Use + :meth:`~importlib.abc.Loader.exec_module` instead. + (Contributed by Brett Cannon in :issue:`26131`.) + +* :meth:`zimport.zipimporter.load_module` has been deprecated in + preference for :meth:`~zipimport.zipimporter.exec_module`. + (Contributed by Brett Cannon in :issue:`26131`.) + +* The use of :meth:`~importlib.abc.Loader.load_module` by the import + system now triggers an :exc:`ImportWarning` as + :meth:`~importlib.abc.Loader.exec_module` is preferred. + (Contributed by Brett Cannon in :issue:`26131`.) + +* The use of :meth:`importlib.abc.MetaPathFinder.find_module` and + :meth:`importlib.abc.PathEntryFinder.find_module` by the import system now + trigger an :exc:`ImportWarning` as + :meth:`importlib.abc.MetaPathFinder.find_spec` and + :meth:`importlib.abc.PathEntryFinder.find_spec` + are preferred, respectively. You can use + :func:`importlib.util.spec_from_loader` to help in porting. + (Contributed by Brett Cannon in :issue:`42134`.) + +* The use of :meth:`importlib.abc.PathEntryFinder.find_loader` by the import + system now triggers an :exc:`ImportWarning` as + :meth:`importlib.abc.PathEntryFinder.find_spec` is preferred. You can use + :func:`importlib.util.spec_from_loader` to help in porting. + (Contributed by Brett Cannon in :issue:`43672`.) + +* The various implementations of + :meth:`importlib.abc.MetaPathFinder.find_module` ( + :meth:`importlib.machinery.BuiltinImporter.find_module`, + :meth:`importlib.machinery.FrozenImporter.find_module`, + :meth:`importlib.machinery.WindowsRegistryFinder.find_module`, + :meth:`importlib.machinery.PathFinder.find_module`, + :meth:`importlib.abc.MetaPathFinder.find_module`), + :meth:`importlib.abc.PathEntryFinder.find_module` ( + :meth:`importlib.machinery.FileFinder.find_module`, + ), and + :meth:`importlib.abc.PathEntryFinder.find_loader` ( + :meth:`importlib.machinery.FileFinder.find_loader` + ) now raise :exc:`DeprecationWarning` and are slated for removal in + Python 3.12 (previously they were documented as deprecated in Python 3.4). + (Contributed by Brett Cannon in :issue:`42135`.) + +* :class:`importlib.abc.Finder` is deprecated (including its sole method, + :meth:`~importlib.abc.Finder.find_module`). Both + :class:`importlib.abc.MetaPathFinder` and :class:`importlib.abc.PathEntryFinder` + no longer inherit from the class. Users should inherit from one of these two + classes as appropriate instead. + (Contributed by Brett Cannon in :issue:`42135`.) + +* The deprecations of :mod:`imp`, :func:`importlib.find_loader`, + :func:`importlib.util.set_package_wrapper`, + :func:`importlib.util.set_loader_wrapper`, + :func:`importlib.util.module_for_loader`, + :class:`pkgutil.ImpImporter`, and + :class:`pkgutil.ImpLoader` have all been updated to list Python 3.12 as the + slated version of removal (they began raising :exc:`DeprecationWarning` in + previous versions of Python). + (Contributed by Brett Cannon in :issue:`43720`.) + +* The import system now uses the ``__spec__`` attribute on modules before + falling back on :meth:`~importlib.abc.Loader.module_repr` for a module's + ``__repr__()`` method. Removal of the use of ``module_repr()`` is scheduled + for Python 3.12. + (Contributed by Brett Cannon in :issue:`42137`.) + +* :meth:`importlib.abc.Loader.module_repr`, + :meth:`importlib.machinery.FrozenLoader.module_repr`, and + :meth:`importlib.machinery.BuiltinLoader.module_repr` are deprecated and + slated for removal in Python 3.12. + (Contributed by Brett Cannon in :issue:`42136`.) + +* ``sqlite3.OptimizedUnicode`` has been undocumented and obsolete since Python + 3.3, when it was made an alias to :class:`str`. It is now deprecated, + scheduled for removal in Python 3.12. + (Contributed by Erlend E. Aasland in :issue:`42264`.) + +* :func:`asyncio.get_event_loop` now emits a deprecation warning if there is + no running event loop. In the future it will be an alias of + :func:`~asyncio.get_running_loop`. + :mod:`asyncio` functions which implicitly create a :class:`~asyncio.Future` + or :class:`~asyncio.Task` objects now emit + a deprecation warning if there is no running event loop and no explicit + *loop* argument is passed: :func:`~asyncio.ensure_future`, + :func:`~asyncio.wrap_future`, :func:`~asyncio.gather`, + :func:`~asyncio.shield`, :func:`~asyncio.as_completed` and constructors of + :class:`~asyncio.Future`, :class:`~asyncio.Task`, + :class:`~asyncio.StreamReader`, :class:`~asyncio.StreamReaderProtocol`. + (Contributed by Serhiy Storchaka in :issue:`39529`.) + +* The undocumented built-in function ``sqlite3.enable_shared_cache`` is now + deprecated, scheduled for removal in Python 3.12. Its use is strongly + discouraged by the SQLite3 documentation. See `the SQLite3 docs + `_ for more details. + If a shared cache must be used, open the database in URI mode using the + ``cache=shared`` query parameter. + (Contributed by Erlend E. Aasland in :issue:`24464`.) + +* The following ``threading`` methods are now deprecated: + + * ``threading.currentThread`` => :func:`threading.current_thread` + + * ``threading.activeCount`` => :func:`threading.active_count` + + * ``threading.Condition.notifyAll`` => + :meth:`threading.Condition.notify_all` + + * ``threading.Event.isSet`` => :meth:`threading.Event.is_set` + + * ``threading.Thread.setName`` => :attr:`threading.Thread.name` + + * ``threading.thread.getName`` => :attr:`threading.Thread.name` + + * ``threading.Thread.isDaemon`` => :attr:`threading.Thread.daemon` + + * ``threading.Thread.setDaemon`` => :attr:`threading.Thread.daemon` + + (Contributed by Jelle Zijlstra in :issue:`21574`.) + +* :meth:`pathlib.Path.link_to` is deprecated and slated for removal in + Python 3.12. Use :meth:`pathlib.Path.hardlink_to` instead. + (Contributed by Barney Gale in :issue:`39950`.) + +* ``cgi.log()`` is deprecated and slated for removal in Python 3.12. + (Contributed by Inada Naoki in :issue:`41139`.) + +* The following :mod:`ssl` features have been deprecated since Python 3.6, + Python 3.7, or OpenSSL 1.1.0 and will be removed in 3.11: + + * :data:`~ssl.OP_NO_SSLv2`, :data:`~ssl.OP_NO_SSLv3`, :data:`~ssl.OP_NO_TLSv1`, + :data:`~ssl.OP_NO_TLSv1_1`, :data:`~ssl.OP_NO_TLSv1_2`, and + :data:`~ssl.OP_NO_TLSv1_3` are replaced by + :attr:`sslSSLContext.minimum_version` and + :attr:`sslSSLContext.maximum_version`. + + * :data:`~ssl.PROTOCOL_SSLv2`, :data:`~ssl.PROTOCOL_SSLv3`, + :data:`~ssl.PROTOCOL_SSLv23`, :data:`~ssl.PROTOCOL_TLSv1`, + :data:`~ssl.PROTOCOL_TLSv1_1`, :data:`~ssl.PROTOCOL_TLSv1_2`, and + :data:`~ssl.PROTOCOL_TLS` are deprecated in favor of + :data:`~ssl.PROTOCOL_TLS_CLIENT` and :data:`~ssl.PROTOCOL_TLS_SERVER` + + * :func:`~ssl.wrap_socket` is replaced by :meth:`ssl.SSLContext.wrap_socket` + + * :func:`~ssl.match_hostname` + + * :func:`~ssl.RAND_pseudo_bytes`, :func:`~ssl.RAND_egd` + + * NPN features like :meth:`ssl.SSLSocket.selected_npn_protocol` and + :meth:`ssl.SSLContext.set_npn_protocols` are replaced by ALPN. + +* The threading debug (:envvar:`PYTHONTHREADDEBUG` environment variable) is + deprecated in Python 3.10 and will be removed in Python 3.12. This feature + requires a :ref:`debug build of Python `. + (Contributed by Victor Stinner in :issue:`44584`.) + +* Importing from the ``typing.io`` and ``typing.re`` submodules will now emit + :exc:`DeprecationWarning`. These submodules will be removed in a future version + of Python. Anything belonging to these submodules should be imported directly + from :mod:`typing` instead. + (Contributed by Sebastian Rittau in :issue:`38291`) + +.. _whatsnew310-removed: + +Removed +======= + +* Removed special methods ``__int__``, ``__float__``, ``__floordiv__``, + ``__mod__``, ``__divmod__``, ``__rfloordiv__``, ``__rmod__`` and + ``__rdivmod__`` of the :class:`complex` class. They always raised + a :exc:`TypeError`. + (Contributed by Serhiy Storchaka in :issue:`41974`.) + +* The ``ParserBase.error()`` method from the private and undocumented ``_markupbase`` + module has been removed. :class:`html.parser.HTMLParser` is the only subclass of + ``ParserBase`` and its ``error()`` implementation was already removed in + Python 3.5. + (Contributed by Berker Peksag in :issue:`31844`.) + +* Removed the ``unicodedata.ucnhash_CAPI`` attribute which was an internal + PyCapsule object. The related private ``_PyUnicode_Name_CAPI`` structure was + moved to the internal C API. + (Contributed by Victor Stinner in :issue:`42157`.) + +* Removed the ``parser`` module, which was deprecated in 3.9 due to the + switch to the new PEG parser, as well as all the C source and header files + that were only being used by the old parser, including ``node.h``, ``parser.h``, + ``graminit.h`` and ``grammar.h``. + +* Removed the Public C API functions ``PyParser_SimpleParseStringFlags``, + ``PyParser_SimpleParseStringFlagsFilename``, + ``PyParser_SimpleParseFileFlags`` and ``PyNode_Compile`` + that were deprecated in 3.9 due to the switch to the new PEG parser. + +* Removed the ``formatter`` module, which was deprecated in Python 3.4. + It is somewhat obsolete, little used, and not tested. It was originally + scheduled to be removed in Python 3.6, but such removals were delayed until + after Python 2.7 EOL. Existing users should copy whatever classes they use + into their code. + (Contributed by Dong-hee Na and Terry J. Reedy in :issue:`42299`.) + +* Removed the :c:func:`PyModule_GetWarningsModule` function that was useless + now due to the _warnings module was converted to a builtin module in 2.6. + (Contributed by Hai Shi in :issue:`42599`.) + +* Remove deprecated aliases to :ref:`collections-abstract-base-classes` from + the :mod:`collections` module. + (Contributed by Victor Stinner in :issue:`37324`.) + +* The ``loop`` parameter has been removed from most of :mod:`asyncio`\ 's + :doc:`high-level API <../library/asyncio-api-index>` following deprecation + in Python 3.8. The motivation behind this change is multifold: + + 1. This simplifies the high-level API. + 2. The functions in the high-level API have been implicitly getting the + current thread's running event loop since Python 3.7. There isn't a need to + pass the event loop to the API in most normal use cases. + 3. Event loop passing is error-prone especially when dealing with loops + running in different threads. + + Note that the low-level API will still accept ``loop``. + See `Changes in the Python API`_ for examples of how to replace existing code. + + (Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley + in :issue:`42392`.) + + +Porting to Python 3.10 +====================== + +This section lists previously described changes and other bugfixes +that may require changes to your code. + + +Changes in the Python syntax +---------------------------- + +* Deprecation warning is now emitted when compiling previously valid syntax + if the numeric literal is immediately followed by a keyword (like in ``0in x``). + In future releases it will be changed to syntax warning, and finally to a + syntax error. To get rid of the warning and make the code compatible with + future releases just add a space between the numeric literal and the + following keyword. + (Contributed by Serhiy Storchaka in :issue:`43833`). + + +Changes in the Python API +------------------------- + +* The *etype* parameters of the :func:`~traceback.format_exception`, + :func:`~traceback.format_exception_only`, and + :func:`~traceback.print_exception` functions in the :mod:`traceback` module + have been renamed to *exc*. + (Contributed by Zackery Spytz and Matthias Bussonnier in :issue:`26389`.) + +* :mod:`atexit`: At Python exit, if a callback registered with + :func:`atexit.register` fails, its exception is now logged. Previously, only + some exceptions were logged, and the last exception was always silently + ignored. + (Contributed by Victor Stinner in :issue:`42639`.) + +* :class:`collections.abc.Callable` generic now flattens type parameters, similar + to what :data:`typing.Callable` currently does. This means that + ``collections.abc.Callable[[int, str], str]`` will have ``__args__`` of + ``(int, str, str)``; previously this was ``([int, str], str)``. Code which + accesses the arguments via :func:`typing.get_args` or ``__args__`` need to account + for this change. Furthermore, :exc:`TypeError` may be raised for invalid forms + of parameterizing :class:`collections.abc.Callable` which may have passed + silently in Python 3.9. + (Contributed by Ken Jin in :issue:`42195`.) + +* :meth:`socket.htons` and :meth:`socket.ntohs` now raise :exc:`OverflowError` + instead of :exc:`DeprecationWarning` if the given parameter will not fit in + a 16-bit unsigned integer. + (Contributed by Erlend E. Aasland in :issue:`42393`.) + +* The ``loop`` parameter has been removed from most of :mod:`asyncio`\ 's + :doc:`high-level API <../library/asyncio-api-index>` following deprecation + in Python 3.8. + + A coroutine that currently looks like this:: + + async def foo(loop): + await asyncio.sleep(1, loop=loop) + + Should be replaced with this:: + + async def foo(): + await asyncio.sleep(1) + + If ``foo()`` was specifically designed *not* to run in the current thread's + running event loop (e.g. running in another thread's event loop), consider + using :func:`asyncio.run_coroutine_threadsafe` instead. + + (Contributed by Yurii Karabas, Andrew Svetlov, Yury Selivanov and Kyle Stanley + in :issue:`42392`.) + +* The :data:`types.FunctionType` constructor now inherits the current builtins + if the *globals* dictionary has no ``"__builtins__"`` key, rather than using + ``{"None": None}`` as builtins: same behavior as :func:`eval` and + :func:`exec` functions. Defining a function with ``def function(...): ...`` + in Python is not affected, globals cannot be overriden with this syntax: it + also inherits the current builtins. + (Contributed by Victor Stinner in :issue:`42990`.) + +Changes in the C API +-------------------- + +* The C API functions ``PyParser_SimpleParseStringFlags``, + ``PyParser_SimpleParseStringFlagsFilename``, + ``PyParser_SimpleParseFileFlags``, ``PyNode_Compile`` and the type + used by these functions, ``struct _node``, were removed due to the switch + to the new PEG parser. + + Source should be now be compiled directly to a code object using, for + example, :c:func:`Py_CompileString`. The resulting code object can then be + evaluated using, for example, :c:func:`PyEval_EvalCode`. + + Specifically: + + * A call to ``PyParser_SimpleParseStringFlags`` followed by + ``PyNode_Compile`` can be replaced by calling :c:func:`Py_CompileString`. + + * There is no direct replacement for ``PyParser_SimpleParseFileFlags``. + To compile code from a ``FILE *`` argument, you will need to read + the file in C and pass the resulting buffer to :c:func:`Py_CompileString`. + + * To compile a file given a ``char *`` filename, explicitly open the file, read + it and compile the result. One way to do this is using the :py:mod:`io` + module with :c:func:`PyImport_ImportModule`, :c:func:`PyObject_CallMethod`, + :c:func:`PyBytes_AsString` and :c:func:`Py_CompileString`, + as sketched below. (Declarations and error handling are omitted.) :: + + io_module = Import_ImportModule("io"); + fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb"); + source_bytes_object = PyObject_CallMethod(fileobject, "read", ""); + result = PyObject_CallMethod(fileobject, "close", ""); + source_buf = PyBytes_AsString(source_bytes_object); + code = Py_CompileString(source_buf, filename, Py_file_input); + + * For ``FrameObject`` objects, the ``f_lasti`` member now represents a wordcode + offset instead of a simple offset into the bytecode string. This means that this + number needs to be multiplied by 2 to be used with APIs that expect a byte offset + instead (like :c:func:`PyCode_Addr2Line` for example). Notice as well that the + ``f_lasti`` member of ``FrameObject`` objects is not considered stable: please + use :c:func:`PyFrame_GetLineNumber` instead. + +CPython bytecode changes +======================== + +* The ``MAKE_FUNCTION`` instruction now accepts either a dict or a tuple of + strings as the function's annotations. + (Contributed by Yurii Karabas and Inada Naoki in :issue:`42202`) + +Build Changes +============= + +* :pep:`644`: Python now requires OpenSSL 1.1.1 or newer. OpenSSL 1.0.2 is no + longer supported. + (Contributed by Christian Heimes in :issue:`43669`.) + +* The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now required + to build Python. + (Contributed by Victor Stinner in :issue:`36020`.) + +* :mod:`sqlite3` requires SQLite 3.7.15 or higher. (Contributed by Sergey Fedoseev + and Erlend E. Aasland :issue:`40744` and :issue:`40810`.) + +* The :mod:`atexit` module must now always be built as a built-in module. + (Contributed by Victor Stinner in :issue:`42639`.) + +* Add :option:`--disable-test-modules` option to the ``configure`` script: + don't build nor install test modules. + (Contributed by Xavier de Gaye, Thomas Petazzoni and Peixing Xin in :issue:`27640`.) + +* Add :option:`--with-wheel-pkg-dir=PATH option <--with-wheel-pkg-dir>` + to the ``./configure`` script. If + specified, the :mod:`ensurepip` module looks for ``setuptools`` and ``pip`` + wheel packages in this directory: if both are present, these wheel packages + are used instead of ensurepip bundled wheel packages. + + Some Linux distribution packaging policies recommend against bundling + dependencies. For example, Fedora installs wheel packages in the + ``/usr/share/python-wheels/`` directory and don't install the + ``ensurepip._bundled`` package. + + (Contributed by Victor Stinner in :issue:`42856`.) + +* Add a new :option:`configure --without-static-libpython option + <--without-static-libpython>` to not build the ``libpythonMAJOR.MINOR.a`` + static library and not install the ``python.o`` object file. + + (Contributed by Victor Stinner in :issue:`43103`.) + +* The ``configure`` script now uses the ``pkg-config`` utility, if available, + to detect the location of Tcl/Tk headers and libraries. As before, those + locations can be explicitly specified with the :option:`--with-tcltk-includes` + and :option:`--with-tcltk-libs` configuration options. + (Contributed by Manolis Stamatogiannakis in :issue:`42603`.) + +* Add :option:`--with-openssl-rpath` option to ``configure`` script. The option + simplifies building Python with a custom OpenSSL installation, e.g. + ``./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto``. + (Contributed by Christian Heimes in :issue:`43466`.) + + +C API Changes +============= + +PEP 652: Maintaining the Stable ABI +----------------------------------- + +The Stable ABI (Application Binary Interface) for extension modules or +embedding Python is now explicitly defined. +:ref:`stable` describes C API and ABI stability guarantees along with best +practices for using the Stable ABI. + +(Contributed by Petr Viktorin in :pep:`652` and :issue:`43795`.) + +New Features +------------ + +* The result of :c:func:`PyNumber_Index` now always has exact type :class:`int`. + Previously, the result could have been an instance of a subclass of ``int``. + (Contributed by Serhiy Storchaka in :issue:`40792`.) + +* Add a new :c:member:`~PyConfig.orig_argv` member to the :c:type:`PyConfig` + structure: the list of the original command line arguments passed to the + Python executable. + (Contributed by Victor Stinner in :issue:`23427`.) + +* The :c:func:`PyDateTime_DATE_GET_TZINFO` and + :c:func:`PyDateTime_TIME_GET_TZINFO` macros have been added for accessing + the ``tzinfo`` attributes of :class:`datetime.datetime` and + :class:`datetime.time` objects. + (Contributed by Zackery Spytz in :issue:`30155`.) + +* Add a :c:func:`PyCodec_Unregister` function to unregister a codec + search function. + (Contributed by Hai Shi in :issue:`41842`.) + +* The :c:func:`PyIter_Send` function was added to allow + sending value into iterator without raising ``StopIteration`` exception. + (Contributed by Vladimir Matveev in :issue:`41756`.) + +* Add :c:func:`PyUnicode_AsUTF8AndSize` to the limited C API. + (Contributed by Alex Gaynor in :issue:`41784`.) + +* Add :c:func:`PyModule_AddObjectRef` function: similar to + :c:func:`PyModule_AddObject` but don't steal a reference to the value on + success. + (Contributed by Victor Stinner in :issue:`1635741`.) + +* Add :c:func:`Py_NewRef` and :c:func:`Py_XNewRef` functions to increment the + reference count of an object and return the object. + (Contributed by Victor Stinner in :issue:`42262`.) + +* The :c:func:`PyType_FromSpecWithBases` and :c:func:`PyType_FromModuleAndSpec` + functions now accept a single class as the *bases* argument. + (Contributed by Serhiy Storchaka in :issue:`42423`.) + +* The :c:func:`PyType_FromModuleAndSpec` function now accepts NULL ``tp_doc`` + slot. + (Contributed by Hai Shi in :issue:`41832`.) + +* The :c:func:`PyType_GetSlot` function can accept + :ref:`static types `. + (Contributed by Hai Shi and Petr Viktorin in :issue:`41073`.) + +* Add a new :c:func:`PySet_CheckExact` function to the C-API to check if an + object is an instance of :class:`set` but not an instance of a subtype. + (Contributed by Pablo Galindo in :issue:`43277`.) + +* Add :c:func:`PyErr_SetInterruptEx` which allows passing a signal number + to simulate. + (Contributed by Antoine Pitrou in :issue:`43356`.) + +* The limited C API is now supported if :ref:`Python is built in debug mode + ` (if the ``Py_DEBUG`` macro is defined). In the limited C API, + the :c:func:`Py_INCREF` and :c:func:`Py_DECREF` functions are now implemented + as opaque function + calls, rather than accessing directly the :c:member:`PyObject.ob_refcnt` + member, if Python is built in debug mode and the ``Py_LIMITED_API`` macro + targets Python 3.10 or newer. It became possible to support the limited C API + in debug mode because the :c:type:`PyObject` structure is the same in release + and debug mode since Python 3.8 (see :issue:`36465`). + + The limited C API is still not supported in the :option:`--with-trace-refs` + special build (``Py_TRACE_REFS`` macro). + (Contributed by Victor Stinner in :issue:`43688`.) + +* Add the :c:func:`Py_Is(x, y) ` function to test if the *x* object is + the *y* object, the same as ``x is y`` in Python. Add also the + :c:func:`Py_IsNone`, :c:func:`Py_IsTrue`, :c:func:`Py_IsFalse` functions to + test if an object is, respectively, the ``None`` singleton, the ``True`` + singleton or the ``False`` singleton. + (Contributed by Victor Stinner in :issue:`43753`.) + +* Add new functions to control the garbage collector from C code: + :c:func:`PyGC_Enable()`, + :c:func:`PyGC_Disable()`, + :c:func:`PyGC_IsEnabled()`. + These functions allow to activate, deactivate and query the state of the garbage collector from C code without + having to import the :mod:`gc` module. + +* Add a new :c:data:`Py_TPFLAGS_DISALLOW_INSTANTIATION` type flag to disallow + creating type instances. + (Contributed by Victor Stinner in :issue:`43916`.) + +* Add a new :c:data:`Py_TPFLAGS_IMMUTABLETYPE` type flag for creating immutable + type objects: type attributes cannot be set nor deleted. + (Contributed by Victor Stinner and Erlend E. Aasland in :issue:`43908`.) + +Porting to Python 3.10 +---------------------- + +* The ``PY_SSIZE_T_CLEAN`` macro must now be defined to use + :c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue` formats which use + ``#``: ``es#``, ``et#``, ``s#``, ``u#``, ``y#``, ``z#``, ``U#`` and ``Z#``. + See :ref:`Parsing arguments and building values + ` and the :pep:`353`. + (Contributed by Victor Stinner in :issue:`40943`.) + +* Since :c:func:`Py_REFCNT()` is changed to the inline static function, + ``Py_REFCNT(obj) = new_refcnt`` must be replaced with ``Py_SET_REFCNT(obj, new_refcnt)``: + see :c:func:`Py_SET_REFCNT()` (available since Python 3.9). For backward + compatibility, this macro can be used:: + + #if PY_VERSION_HEX < 0x030900A4 + # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) + #endif + + (Contributed by Victor Stinner in :issue:`39573`.) + +* Calling :c:func:`PyDict_GetItem` without :term:`GIL` held had been allowed + for historical reason. It is no longer allowed. + (Contributed by Victor Stinner in :issue:`40839`.) + +* ``PyUnicode_FromUnicode(NULL, size)`` and ``PyUnicode_FromStringAndSize(NULL, size)`` + raise ``DeprecationWarning`` now. Use :c:func:`PyUnicode_New` to allocate + Unicode object without initial data. + (Contributed by Inada Naoki in :issue:`36346`.) + +* The private ``_PyUnicode_Name_CAPI`` structure of the PyCapsule API + ``unicodedata.ucnhash_CAPI`` has been moved to the internal C API. + (Contributed by Victor Stinner in :issue:`42157`.) + +* :c:func:`Py_GetPath`, :c:func:`Py_GetPrefix`, :c:func:`Py_GetExecPrefix`, + :c:func:`Py_GetProgramFullPath`, :c:func:`Py_GetPythonHome` and + :c:func:`Py_GetProgramName` functions now return ``NULL`` if called before + :c:func:`Py_Initialize` (before Python is initialized). Use the new + :ref:`Python Initialization Configuration API ` to get the + :ref:`Python Path Configuration. `. + (Contributed by Victor Stinner in :issue:`42260`.) + +* :c:func:`PyList_SET_ITEM`, :c:func:`PyTuple_SET_ITEM` and + :c:func:`PyCell_SET` macros can no longer be used as l-value or r-value. + For example, ``x = PyList_SET_ITEM(a, b, c)`` and + ``PyList_SET_ITEM(a, b, c) = x`` now fail with a compiler error. It prevents + bugs like ``if (PyList_SET_ITEM (a, b, c) < 0) ...`` test. + (Contributed by Zackery Spytz and Victor Stinner in :issue:`30459`.) + +* The non-limited API files ``odictobject.h``, ``parser_interface.h``, + ``picklebufobject.h``, ``pyarena.h``, ``pyctype.h``, ``pydebug.h``, + ``pyfpe.h``, and ``pytime.h`` have been moved to the ``Include/cpython`` + directory. These files must not be included directly, as they are already + included in ``Python.h``: :ref:`Include Files `. If they have + been included directly, consider including ``Python.h`` instead. + (Contributed by Nicholas Sim in :issue:`35134`) + +* Use the :c:data:`Py_TPFLAGS_IMMUTABLETYPE` type flag to create immutable type + objects. Do not rely on :c:data:`Py_TPFLAGS_HEAPTYPE` to decide if a type + object is mutable or not; check if :c:data:`Py_TPFLAGS_IMMUTABLETYPE` is set + instead. + (Contributed by Victor Stinner and Erlend E. Aasland in :issue:`43908`.) + +* The undocumented function ``Py_FrozenMain`` has been removed from the + limited API. The function is mainly useful for custom builds of Python. + (Contributed by Petr Viktorin in :issue:`26241`) + +Deprecated +---------- + +* The ``PyUnicode_InternImmortal()`` function is now deprecated + and will be removed in Python 3.12: use :c:func:`PyUnicode_InternInPlace` + instead. + (Contributed by Victor Stinner in :issue:`41692`.) + +Removed +------- + +* Removed ``Py_UNICODE_str*`` functions manipulating ``Py_UNICODE*`` strings. + (Contributed by Inada Naoki in :issue:`41123`.) + + * ``Py_UNICODE_strlen``: use :c:func:`PyUnicode_GetLength` or + :c:macro:`PyUnicode_GET_LENGTH` + * ``Py_UNICODE_strcat``: use :c:func:`PyUnicode_CopyCharacters` or + :c:func:`PyUnicode_FromFormat` + * ``Py_UNICODE_strcpy``, ``Py_UNICODE_strncpy``: use + :c:func:`PyUnicode_CopyCharacters` or :c:func:`PyUnicode_Substring` + * ``Py_UNICODE_strcmp``: use :c:func:`PyUnicode_Compare` + * ``Py_UNICODE_strncmp``: use :c:func:`PyUnicode_Tailmatch` + * ``Py_UNICODE_strchr``, ``Py_UNICODE_strrchr``: use + :c:func:`PyUnicode_FindChar` + +* Removed ``PyUnicode_GetMax()``. Please migrate to new (:pep:`393`) APIs. + (Contributed by Inada Naoki in :issue:`41103`.) + +* Removed ``PyLong_FromUnicode()``. Please migrate to :c:func:`PyLong_FromUnicodeObject`. + (Contributed by Inada Naoki in :issue:`41103`.) + +* Removed ``PyUnicode_AsUnicodeCopy()``. Please use :c:func:`PyUnicode_AsUCS4Copy` or + :c:func:`PyUnicode_AsWideCharString` + (Contributed by Inada Naoki in :issue:`41103`.) + +* Removed ``_Py_CheckRecursionLimit`` variable: it has been replaced by + ``ceval.recursion_limit`` of the :c:type:`PyInterpreterState` structure. + (Contributed by Victor Stinner in :issue:`41834`.) + +* Removed undocumented macros ``Py_ALLOW_RECURSION`` and + ``Py_END_ALLOW_RECURSION`` and the ``recursion_critical`` field of the + :c:type:`PyInterpreterState` structure. + (Contributed by Serhiy Storchaka in :issue:`41936`.) + +* Removed the undocumented ``PyOS_InitInterrupts()`` function. Initializing + Python already implicitly installs signal handlers: see + :c:member:`PyConfig.install_signal_handlers`. + (Contributed by Victor Stinner in :issue:`41713`.) + +* Remove the ``PyAST_Validate()`` function. It is no longer possible to build a + AST object (``mod_ty`` type) with the public C API. The function was already + excluded from the limited C API (:pep:`384`). + (Contributed by Victor Stinner in :issue:`43244`.) + +* Remove the ``symtable.h`` header file and the undocumented functions: + + * ``PyST_GetScope()`` + * ``PySymtable_Build()`` + * ``PySymtable_BuildObject()`` + * ``PySymtable_Free()`` + * ``Py_SymtableString()`` + * ``Py_SymtableStringObject()`` + + The ``Py_SymtableString()`` function was part the stable ABI by mistake but + it could not be used, because the ``symtable.h`` header file was excluded + from the limited C API. + + Use Python :mod:`symtable` module instead. + (Contributed by Victor Stinner in :issue:`43244`.) + +* Remove :c:func:`PyOS_ReadlineFunctionPointer` from the limited C API headers + and from ``python3.dll``, the library that provides the stable ABI on + Windows. Since the function takes a ``FILE*`` argument, its ABI stability + cannot be guaranteed. + (Contributed by Petr Viktorin in :issue:`43868`.) + +* Remove ``ast.h``, ``asdl.h``, and ``Python-ast.h`` header files. + These functions were undocumented and excluded from the limited C API. + Most names defined by these header files were not prefixed by ``Py`` and so + could create names conflicts. For example, ``Python-ast.h`` defined a + ``Yield`` macro which was conflict with the ``Yield`` name used by the + Windows ```` header. Use the Python :mod:`ast` module instead. + (Contributed by Victor Stinner in :issue:`43244`.) + +* Remove the compiler and parser functions using ``struct _mod`` type, because + the public AST C API was removed: + + * ``PyAST_Compile()`` + * ``PyAST_CompileEx()`` + * ``PyAST_CompileObject()`` + * ``PyFuture_FromAST()`` + * ``PyFuture_FromASTObject()`` + * ``PyParser_ASTFromFile()`` + * ``PyParser_ASTFromFileObject()`` + * ``PyParser_ASTFromFilename()`` + * ``PyParser_ASTFromString()`` + * ``PyParser_ASTFromStringObject()`` + + These functions were undocumented and excluded from the limited C API. + (Contributed by Victor Stinner in :issue:`43244`.) + +* Remove the ``pyarena.h`` header file with functions: + + * ``PyArena_New()`` + * ``PyArena_Free()`` + * ``PyArena_Malloc()`` + * ``PyArena_AddPyObject()`` + + These functions were undocumented, excluded from the limited C API, and were + only used internally by the compiler. + (Contributed by Victor Stinner in :issue:`43244`.) + +* The ``PyThreadState.use_tracing`` member has been removed to optimize Python. + (Contributed by Mark Shannon in :issue:`43760`.) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst index 828d7ca1..840cb061 100644 --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -744,8 +744,7 @@ Two methods have been deprecated: * :meth:`xml.etree.ElementTree.getiterator` use ``Element.iter`` instead. For details of the update, see `Introducing ElementTree -`_ -on Fredrik Lundh's website. +`_ on Fredrik Lundh's website. (Contributed by Florent Xicluna and Fredrik Lundh, :issue:`6472`.) @@ -1922,7 +1921,7 @@ inspect pydoc ----- -The :mod:`pydoc` module now provides a much-improved Web server interface, as +The :mod:`pydoc` module now provides a much-improved web server interface, as well as a new command-line option ``-b`` to automatically open a browser window to display that server: diff --git a/Doc/whatsnew/3.4.rst b/Doc/whatsnew/3.4.rst index 99d04084..0405f2ba 100644 --- a/Doc/whatsnew/3.4.rst +++ b/Doc/whatsnew/3.4.rst @@ -490,7 +490,7 @@ environment was declined. :mod:`ensurepip` includes a bundled copy of ``pip``, up-to-date as of the first release candidate of the release of CPython with which it ships (this applies to both maintenance releases and feature releases). ``ensurepip`` does not -access the internet. If the installation has Internet access, after +access the internet. If the installation has internet access, after ``ensurepip`` is run the bundled ``pip`` can be used to upgrade ``pip`` to a more recent release than the bundled one. (Note that such an upgraded version of ``pip`` is considered to be a separately installed package and will not be diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index 03a877a3..d7884ea3 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -722,8 +722,8 @@ for the following events in the interpreter: * line of code executed. This can be used to instrument running interpreters in production, -without the need to recompile specific debug builds or providing -application-specific profiling/debugging code. +without the need to recompile specific :ref:`debug builds ` or +providing application-specific profiling/debugging code. More details in :ref:`instrumentation`. diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 7a00e376..1199535c 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -232,7 +232,8 @@ PEP 540: Forced UTF-8 Runtime Mode ----------------------------------- The new :option:`-X` ``utf8`` command line option and :envvar:`PYTHONUTF8` -environment variable can be used to enable the CPython *UTF-8 mode*. +environment variable can be used to enable the :ref:`Python UTF-8 Mode +`. When in UTF-8 mode, CPython ignores the locale settings, and uses the UTF-8 encoding by default. The error handlers for :data:`sys.stdin` and @@ -537,7 +538,7 @@ Other Language Changes * The new :option:`-X` ``importtime`` option or the :envvar:`PYTHONPROFILEIMPORTTIME` environment variable can be used to show the timing of each module import. - (Contributed by Inada Naoki in :issue:`31415`.) + (Contributed by Victor Stinner in :issue:`31415`.) New Modules @@ -1587,8 +1588,8 @@ The initialization of the default warnings filters has changed as follows: for the new ``-X dev`` mode) * any implicit filters defined directly by the warnings machinery -* in CPython debug builds, all warnings are now displayed by default (the - implicit filter list is empty) +* in :ref:`CPython debug builds `, all warnings are now displayed + by default (the implicit filter list is empty) (Contributed by Nick Coghlan and Victor Stinner in :issue:`20361`, :issue:`32043`, and :issue:`32230`.) diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst index 58f44f75..7c293a50 100644 --- a/Doc/whatsnew/3.8.rst +++ b/Doc/whatsnew/3.8.rst @@ -211,12 +211,12 @@ Python now uses the same ABI whether it's built in release or debug mode. On Unix, when Python is built in debug mode, it is now possible to load C extensions built in release mode and C extensions built using the stable ABI. -Release builds and debug builds are now ABI compatible: defining the +Release builds and :ref:`debug builds ` are now ABI compatible: defining the ``Py_DEBUG`` macro no longer implies the ``Py_TRACE_REFS`` macro, which introduces the only ABI incompatibility. The ``Py_TRACE_REFS`` macro, which adds the :func:`sys.getobjects` function and the :envvar:`PYTHONDUMPREFS` -environment variable, can be set using the new ``./configure --with-trace-refs`` -build option. +environment variable, can be set using the new :option:`./configure +--with-trace-refs <--with-trace-refs>` build option. (Contributed by Victor Stinner in :issue:`36465`.) On Unix, C extensions are no longer linked to libpython except on Android @@ -352,7 +352,8 @@ PEP 590: Vectorcall: a fast calling protocol for CPython :ref:`vectorcall` is added to the Python/C API. It is meant to formalize existing optimizations which were already done for various classes. -Any static type implementing a callable can use this protocol. +Any :ref:`static type ` implementing a callable can use this +protocol. This is currently provisional. The aim is to make it fully public in Python 3.9. @@ -904,7 +905,7 @@ for :func:`property`, :func:`classmethod`, and :func:`staticmethod`:: io -- -In development mode (:option:`-X` ``env``) and in debug build, the +In development mode (:option:`-X` ``env``) and in :ref:`debug build `, the :class:`io.IOBase` finalizer now logs the exception if the ``close()`` method fails. The exception is ignored silently by default in release build. (Contributed by Victor Stinner in :issue:`18748`.) @@ -1489,7 +1490,7 @@ Optimizations first introduced in Python 3.4. It offers better performance and smaller size compared to Protocol 3 available since Python 3.0. -* Removed one :c:type:`Py_ssize_t` member from ``PyGC_Head``. All GC tracked +* Removed one ``Py_ssize_t`` member from ``PyGC_Head``. All GC tracked objects (e.g. tuple, list, dict) size is reduced 4 or 8 bytes. (Contributed by Inada Naoki in :issue:`33597`.) @@ -2003,8 +2004,6 @@ Changes in the Python API ``replace()`` method of :class:`types.CodeType` can be used to make the code future-proof. -* The parameter ``digestmod`` for :func:`hmac.new` no longer uses the MD5 digest - by default. Changes in the C API -------------------- @@ -2042,7 +2041,7 @@ Changes in the C API This makes types created through :c:func:`PyType_FromSpec` behave like other classes in managed code. - Statically allocated types are not affected. + :ref:`Statically allocated types ` are not affected. For the vast majority of cases, there should be no side effect. However, types that manually increase the reference count after allocating diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index dab4746a..f1725e7d 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -231,7 +231,7 @@ Other Language Changes absolute path for :mod:`__main__` module frames in this case. (Contributed by Victor Stinner in :issue:`20443`.) -* In the :ref:`Python Development Mode ` and in debug build, the +* In the :ref:`Python Development Mode ` and in :ref:`debug build `, the *encoding* and *errors* arguments are now checked for string encoding and decoding operations. Examples: :func:`open`, :meth:`str.encode` and :meth:`bytes.decode`. @@ -484,25 +484,8 @@ Najera in :issue:`38944`.) Added keywords to module name completion list. (Contributed by Terry J. Reedy in :issue:`37765`.) -New in 3.9 maintenance releases - -Make IDLE invoke :func:`sys.excepthook` (when started without '-n'). -User hooks were previously ignored. (Contributed by Ken Hilton in -:issue:`43008`.) - The changes above have been backported to 3.8 maintenance releases. -Rearrange the settings dialog. Split the General tab into Windows -and Shell/Ed tabs. Move help sources, which extend the Help menu, to the -Extensions tab. Make space for new options and shorten the dialog. The -latter makes the dialog better fit small screens. (Contributed by Terry Jan -Reedy in :issue:`40468`.) Move the indent space setting from the Font tab to -the new Windows tab. (Contributed by Mark Roseman and Terry Jan Reedy in -:issue:`33962`.) - -Apply syntax highlighting to `.pyi` files. (Contributed by Alex -Waygood and Terry Jan Reedy in :issue:`45447`.) - imaplib ------- @@ -1153,7 +1136,7 @@ Changes in the Python API Changes in the C API -------------------- -* Instances of heap-allocated types (such as those created with +* Instances of :ref:`heap-allocated types ` (such as those created with :c:func:`PyType_FromSpec` and similar APIs) hold a reference to their type object since Python 3.8. As indicated in the "Changes in the C API" of Python 3.8, for the vast majority of cases, there should be no side effect but for @@ -1176,7 +1159,8 @@ Changes in the C API If your traverse function delegates to ``tp_traverse`` of its base class (or another type), ensure that ``Py_TYPE(self)`` is visited only once. - Note that only heap types are expected to visit the type in ``tp_traverse``. + Note that only :ref:`heap type ` are expected to visit the type + in ``tp_traverse``. For example, if your ``tp_traverse`` function includes: @@ -1189,7 +1173,7 @@ Changes in the C API .. code-block:: c #if PY_VERSION_HEX >= 0x03090000 - // This was not needed before Python 3.9 (Python issue 35810 and 40217) + // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { @@ -1246,9 +1230,9 @@ Build Changes non-system Tcl and Tk frameworks if they are installed in ``/Library/Frameworks``, as had been the case on older releases of macOS. If a macOS SDK is explicitly configured, by using - ``--enable-universalsdk=`` or ``-isysroot``, only the SDK itself is + :option:`--enable-universalsdk` or ``-isysroot``, only the SDK itself is searched. The default behavior can still be overridden with - ``--with-tcltk-includes`` and ``--with-tcltk-libs``. + :option:`--with-tcltk-includes` and :option:`--with-tcltk-libs`. (Contributed by Ned Deily in :issue:`34956`.) * Python can now be built for Windows 10 ARM64. @@ -1394,6 +1378,10 @@ Porting to Python 3.9 becomes an alias to the :c:func:`PyObject_NewVar` macro. They no longer access directly the :c:member:`PyTypeObject.tp_basicsize` member. + * :c:func:`PyType_HasFeature` now always calls :c:func:`PyType_GetFlags`. + Previously, it accessed directly the :c:member:`PyTypeObject.tp_flags` + member when the limited C API was not used. + * :c:func:`PyObject_GET_WEAKREFS_LISTPTR` macro was converted to a function: the macro accessed directly the :c:member:`PyTypeObject.tp_weaklistoffset` member. @@ -1564,40 +1552,3 @@ separator key, with ``&`` as the default. This change also affects functions internally. For more details, please see their respective documentation. (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in :issue:`42967`.) - -Notable changes in Python 3.9.3 -=============================== - -A security fix alters the :class:`ftplib.FTP` behavior to not trust the -IPv4 address sent from the remote server when setting up a passive data -channel. We reuse the ftp server IP address instead. For unusual code -requiring the old behavior, set a ``trust_server_pasv_ipv4_address`` -attribute on your FTP instance to ``True``. (See :issue:`43285`) - -Notable changes in Python 3.9.5 -=============================== - -urllib.parse ------------- - -The presence of newline or tab characters in parts of a URL allows for some -forms of attacks. Following the WHATWG specification that updates :rfc:`3986`, -ASCII newline ``\n``, ``\r`` and tab ``\t`` characters are stripped from the -URL by the parser in :mod:`urllib.parse` preventing such attacks. The removal -characters are controlled by a new module level variable -``urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE``. (See :issue:`43882`) - -Notable security feature in 3.9.14 -================================== - -Converting between :class:`int` and :class:`str` in bases other than 2 -(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) -now raises a :exc:`ValueError` if the number of digits in string form is -above a limit to avoid potential denial of service attacks due to the -algorithmic complexity. This is a mitigation for `CVE-2020-10735 -`_. -This limit can be configured or disabled by environment variable, command -line flag, or :mod:`sys` APIs. See the :ref:`integer string conversion -length limitation ` documentation. The default limit -is 4300 digits in string form. - diff --git a/Doc/whatsnew/index.rst b/Doc/whatsnew/index.rst index 954e38bc..a1ff8ec2 100644 --- a/Doc/whatsnew/index.rst +++ b/Doc/whatsnew/index.rst @@ -11,6 +11,7 @@ anyone wishing to stay up-to-date after a new release. .. toctree:: :maxdepth: 2 + 3.10.rst 3.9.rst 3.8.rst 3.7.rst diff --git a/Grammar/Grammar b/Grammar/Grammar deleted file mode 100644 index 170518af..00000000 --- a/Grammar/Grammar +++ /dev/null @@ -1,207 +0,0 @@ -# Grammar for Python - -# NOTE WELL: You should also follow all the steps listed at -# https://devguide.python.org/grammar/ - -# Start symbols for the grammar: -# single_input is a single interactive statement; -# file_input is a module or sequence of commands read from an input file; -# eval_input is the input for the eval() functions. -# func_type_input is a PEP 484 Python 2 function type comment -# NB: compound_stmt in single_input is followed by extra NEWLINE! -# NB: due to the way TYPE_COMMENT is tokenized it will always be followed by a NEWLINE -single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE -file_input: (NEWLINE | stmt)* ENDMARKER -eval_input: testlist NEWLINE* ENDMARKER - -decorator: '@' namedexpr_test NEWLINE -decorators: decorator+ -decorated: decorators (classdef | funcdef | async_funcdef) - -async_funcdef: ASYNC funcdef -funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] func_body_suite - -parameters: '(' [typedargslist] ')' - -# The following definition for typedarglist is equivalent to this set of rules: -# -# arguments = argument (',' [TYPE_COMMENT] argument)* -# argument = tfpdef ['=' test] -# kwargs = '**' tfpdef [','] [TYPE_COMMENT] -# args = '*' [tfpdef] -# kwonly_kwargs = (',' [TYPE_COMMENT] argument)* (TYPE_COMMENT | [',' [TYPE_COMMENT] [kwargs]]) -# args_kwonly_kwargs = args kwonly_kwargs | kwargs -# poskeyword_args_kwonly_kwargs = arguments ( TYPE_COMMENT | [',' [TYPE_COMMENT] [args_kwonly_kwargs]]) -# typedargslist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs -# typedarglist = (arguments ',' [TYPE_COMMENT] '/' [',' [[TYPE_COMMENT] typedargslist_no_posonly]])|(typedargslist_no_posonly)" -# -# It needs to be fully expanded to allow our LL(1) parser to work on it. - -typedargslist: ( - (tfpdef ['=' test] (',' [TYPE_COMMENT] tfpdef ['=' test])* ',' [TYPE_COMMENT] '/' [',' [ [TYPE_COMMENT] tfpdef ['=' test] ( - ',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] [ - '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) - | '**' tfpdef [','] [TYPE_COMMENT]]]) - | '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) - | '**' tfpdef [','] [TYPE_COMMENT]]] ) -| (tfpdef ['=' test] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] [ - '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) - | '**' tfpdef [','] [TYPE_COMMENT]]]) - | '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) - | '**' tfpdef [','] [TYPE_COMMENT]) -) -tfpdef: NAME [':' test] - -# The following definition for varargslist is equivalent to this set of rules: -# -# arguments = argument (',' argument )* -# argument = vfpdef ['=' test] -# kwargs = '**' vfpdef [','] -# args = '*' [vfpdef] -# kwonly_kwargs = (',' argument )* [',' [kwargs]] -# args_kwonly_kwargs = args kwonly_kwargs | kwargs -# poskeyword_args_kwonly_kwargs = arguments [',' [args_kwonly_kwargs]] -# vararglist_no_posonly = poskeyword_args_kwonly_kwargs | args_kwonly_kwargs -# varargslist = arguments ',' '/' [','[(vararglist_no_posonly)]] | (vararglist_no_posonly) -# -# It needs to be fully expanded to allow our LL(1) parser to work on it. - -varargslist: vfpdef ['=' test ](',' vfpdef ['=' test])* ',' '/' [',' [ (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [ - '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] - | '**' vfpdef [',']]] - | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] - | '**' vfpdef [',']) ]] | (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [ - '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] - | '**' vfpdef [',']]] - | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] - | '**' vfpdef [','] -) -vfpdef: NAME - -stmt: simple_stmt | compound_stmt -simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE -small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | - import_stmt | global_stmt | nonlocal_stmt | assert_stmt) -expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - [('=' (yield_expr|testlist_star_expr))+ [TYPE_COMMENT]] ) -annassign: ':' test ['=' (yield_expr|testlist_star_expr)] -testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] -augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | - '<<=' | '>>=' | '**=' | '//=') -# For normal and annotated assignments, additional restrictions enforced by the interpreter -del_stmt: 'del' exprlist -pass_stmt: 'pass' -flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt -break_stmt: 'break' -continue_stmt: 'continue' -return_stmt: 'return' [testlist_star_expr] -yield_stmt: yield_expr -raise_stmt: 'raise' [test ['from' test]] -import_stmt: import_name | import_from -import_name: 'import' dotted_as_names -# note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS -import_from: ('from' (('.' | '...')* dotted_name | ('.' | '...')+) - 'import' ('*' | '(' import_as_names ')' | import_as_names)) -import_as_name: NAME ['as' NAME] -dotted_as_name: dotted_name ['as' NAME] -import_as_names: import_as_name (',' import_as_name)* [','] -dotted_as_names: dotted_as_name (',' dotted_as_name)* -dotted_name: NAME ('.' NAME)* -global_stmt: 'global' NAME (',' NAME)* -nonlocal_stmt: 'nonlocal' NAME (',' NAME)* -assert_stmt: 'assert' test [',' test] - -compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt -async_stmt: ASYNC (funcdef | with_stmt | for_stmt) -if_stmt: 'if' namedexpr_test ':' suite ('elif' namedexpr_test ':' suite)* ['else' ':' suite] -while_stmt: 'while' namedexpr_test ':' suite ['else' ':' suite] -for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] -try_stmt: ('try' ':' suite - ((except_clause ':' suite)+ - ['else' ':' suite] - ['finally' ':' suite] | - 'finally' ':' suite)) -with_stmt: 'with' with_item (',' with_item)* ':' [TYPE_COMMENT] suite -with_item: test ['as' expr] -# NB compile.c makes sure that the default except clause is last -except_clause: 'except' [test ['as' NAME]] -suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT - -namedexpr_test: test [':=' test] -test: or_test ['if' or_test 'else' test] | lambdef -test_nocond: or_test | lambdef_nocond -lambdef: 'lambda' [varargslist] ':' test -lambdef_nocond: 'lambda' [varargslist] ':' test_nocond -or_test: and_test ('or' and_test)* -and_test: not_test ('and' not_test)* -not_test: 'not' not_test | comparison -comparison: expr (comp_op expr)* -# <> isn't actually a valid comparison operator in Python. It's here for the -# sake of a __future__ import described in PEP 401 (which really works :-) -comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not' -star_expr: '*' expr -expr: xor_expr ('|' xor_expr)* -xor_expr: and_expr ('^' and_expr)* -and_expr: shift_expr ('&' shift_expr)* -shift_expr: arith_expr (('<<'|'>>') arith_expr)* -arith_expr: term (('+'|'-') term)* -term: factor (('*'|'@'|'/'|'%'|'//') factor)* -factor: ('+'|'-'|'~') factor | power -power: atom_expr ['**' factor] -atom_expr: [AWAIT] atom trailer* -atom: ('(' [yield_expr|testlist_comp] ')' | - '[' [testlist_comp] ']' | - '{' [dictorsetmaker] '}' | - NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') -testlist_comp: (namedexpr_test|star_expr) ( comp_for | (',' (namedexpr_test|star_expr))* [','] ) -trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME -subscriptlist: subscript (',' subscript)* [','] -subscript: test | [test] ':' [test] [sliceop] -sliceop: ':' [test] -exprlist: (expr|star_expr) (',' (expr|star_expr))* [','] -testlist: test (',' test)* [','] -dictorsetmaker: ( ((test ':' test | '**' expr) - (comp_for | (',' (test ':' test | '**' expr))* [','])) | - ((test | star_expr) - (comp_for | (',' (test | star_expr))* [','])) ) - -classdef: 'class' NAME ['(' [arglist] ')'] ':' suite - -arglist: argument (',' argument)* [','] - -# The reason that keywords are test nodes instead of NAME is that using NAME -# results in an ambiguity. ast.c makes sure it's a NAME. -# "test '=' test" is really "keyword '=' test", but we have no such token. -# These need to be in a single rule to avoid grammar that is ambiguous -# to our LL(1) parser. Even though 'test' includes '*expr' in star_expr, -# we explicitly match '*' here, too, to give it proper precedence. -# Illegal combinations and orderings are blocked in ast.c: -# multiple (test comp_for) arguments are blocked; keyword unpackings -# that precede iterable unpackings are blocked; etc. -argument: ( test [comp_for] | - test ':=' test | - test '=' test | - '**' test | - '*' test ) - -comp_iter: comp_for | comp_if -sync_comp_for: 'for' exprlist 'in' or_test [comp_iter] -comp_for: [ASYNC] sync_comp_for -comp_if: 'if' test_nocond [comp_iter] - -# not used in grammar, but may appear in "node" passed from Parser to Compiler -encoding_decl: NAME - -yield_expr: 'yield' [yield_arg] -yield_arg: 'from' test | testlist_star_expr - -# the TYPE_COMMENT in suites is only parsed for funcdefs, -# but can't go elsewhere due to ambiguity -func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT - -func_type_input: func_type NEWLINE* ENDMARKER -func_type: '(' [typelist] ')' '->' test -# typelist is a modified typedargslist (see above) -typelist: (test (',' test)* [',' - ['*' [test] (',' test)* [',' '**' test] | '**' test]] - | '*' [test] (',' test)* [',' '**' test] | '**' test) diff --git a/Grammar/Tokens b/Grammar/Tokens index 9de2da5d..1f3e3b09 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -59,6 +59,7 @@ AWAIT ASYNC TYPE_IGNORE TYPE_COMMENT +SOFT_KEYWORD ERRORTOKEN # These aren't used by the C tokenizer but are needed for tokenize.py diff --git a/Grammar/python.gram b/Grammar/python.gram index 38405b72..76c0b4e6 100644 --- a/Grammar/python.gram +++ b/Grammar/python.gram @@ -7,6 +7,7 @@ _PyPegen_parse(Parser *p) // Initialize keywords p->keywords = reserved_keywords; p->n_keyword_lists = n_keyword_lists; + p->soft_keywords = soft_keywords; // Run parser void *result = NULL; @@ -28,47 +29,53 @@ _PyPegen_parse(Parser *p) // The end ''' file[mod_ty]: a=[statements] ENDMARKER { _PyPegen_make_module(p, a) } -interactive[mod_ty]: a=statement_newline { Interactive(a, p->arena) } -eval[mod_ty]: a=expressions NEWLINE* ENDMARKER { Expression(a, p->arena) } -func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { FunctionType(a, b, p->arena) } +interactive[mod_ty]: a=statement_newline { _PyAST_Interactive(a, p->arena) } +eval[mod_ty]: a=expressions NEWLINE* ENDMARKER { _PyAST_Expression(a, p->arena) } +func_type[mod_ty]: '(' a=[type_expressions] ')' '->' b=expression NEWLINE* ENDMARKER { _PyAST_FunctionType(a, b, p->arena) } fstring[expr_ty]: star_expressions # type_expressions allow */** but ignore them -type_expressions[asdl_seq*]: +type_expressions[asdl_expr_seq*]: | a=','.expression+ ',' '*' b=expression ',' '**' c=expression { - _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_seq_append_to_end(p, a, b)), c) } - | a=','.expression+ ',' '*' b=expression { _PyPegen_seq_append_to_end(p, a, b) } - | a=','.expression+ ',' '**' b=expression { _PyPegen_seq_append_to_end(p, a, b) } + (asdl_expr_seq*)_PyPegen_seq_append_to_end( + p, + CHECK(asdl_seq*, _PyPegen_seq_append_to_end(p, a, b)), + c) } + | a=','.expression+ ',' '*' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) } + | a=','.expression+ ',' '**' b=expression { (asdl_expr_seq*)_PyPegen_seq_append_to_end(p, a, b) } | '*' a=expression ',' '**' b=expression { - _PyPegen_seq_append_to_end(p, CHECK(_PyPegen_singleton_seq(p, a)), b) } - | '*' a=expression { _PyPegen_singleton_seq(p, a) } - | '**' a=expression { _PyPegen_singleton_seq(p, a) } - | ','.expression+ - -statements[asdl_seq*]: a=statement+ { _PyPegen_seq_flatten(p, a) } -statement[asdl_seq*]: a=compound_stmt { _PyPegen_singleton_seq(p, a) } | simple_stmt -statement_newline[asdl_seq*]: - | a=compound_stmt NEWLINE { _PyPegen_singleton_seq(p, a) } - | simple_stmt - | NEWLINE { _PyPegen_singleton_seq(p, CHECK(_Py_Pass(EXTRA))) } + (asdl_expr_seq*)_PyPegen_seq_append_to_end( + p, + CHECK(asdl_seq*, _PyPegen_singleton_seq(p, a)), + b) } + | '*' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) } + | '**' a=expression { (asdl_expr_seq*)_PyPegen_singleton_seq(p, a) } + | a[asdl_expr_seq*]=','.expression+ {a} + +statements[asdl_stmt_seq*]: a=statement+ { (asdl_stmt_seq*)_PyPegen_seq_flatten(p, a) } +statement[asdl_stmt_seq*]: a=compound_stmt { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } | a[asdl_stmt_seq*]=simple_stmts { a } +statement_newline[asdl_stmt_seq*]: + | a=compound_stmt NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } + | simple_stmts + | NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, CHECK(stmt_ty, _PyAST_Pass(EXTRA))) } | ENDMARKER { _PyPegen_interactive_exit(p) } -simple_stmt[asdl_seq*]: - | a=small_stmt !';' NEWLINE { _PyPegen_singleton_seq(p, a) } # Not needed, there for speedup - | a=';'.small_stmt+ [';'] NEWLINE { a } +simple_stmts[asdl_stmt_seq*]: + | a=simple_stmt !';' NEWLINE { (asdl_stmt_seq*)_PyPegen_singleton_seq(p, a) } # Not needed, there for speedup + | a[asdl_stmt_seq*]=';'.simple_stmt+ [';'] NEWLINE { a } # NOTE: assignment MUST precede expression, else parsing a simple assignment # will throw a SyntaxError. -small_stmt[stmt_ty] (memo): +simple_stmt[stmt_ty] (memo): | assignment - | e=star_expressions { _Py_Expr(e, EXTRA) } + | e=star_expressions { _PyAST_Expr(e, EXTRA) } | &'return' return_stmt | &('import' | 'from') import_stmt | &'raise' raise_stmt - | 'pass' { _Py_Pass(EXTRA) } + | 'pass' { _PyAST_Pass(EXTRA) } | &'del' del_stmt | &'yield' yield_stmt | &'assert' assert_stmt - | 'break' { _Py_Break(EXTRA) } - | 'continue' { _Py_Continue(EXTRA) } + | 'break' { _PyAST_Break(EXTRA) } + | 'continue' { _PyAST_Continue(EXTRA) } | &'global' global_stmt | &'nonlocal' nonlocal_stmt compound_stmt[stmt_ty]: @@ -79,29 +86,31 @@ compound_stmt[stmt_ty]: | &('for' | ASYNC) for_stmt | &'try' try_stmt | &'while' while_stmt + | match_stmt # NOTE: annotated_rhs may start with 'yield'; yield_expr must start with 'yield' assignment[stmt_ty]: | a=NAME ':' b=expression c=['=' d=annotated_rhs { d }] { CHECK_VERSION( + stmt_ty, 6, "Variable annotation syntax is", - _Py_AnnAssign(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA) + _PyAST_AnnAssign(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, c, 1, EXTRA) ) } | a=('(' b=single_target ')' { b } | single_subscript_attribute_target) ':' b=expression c=['=' d=annotated_rhs { d }] { - CHECK_VERSION(6, "Variable annotations syntax is", _Py_AnnAssign(a, b, c, 0, EXTRA)) } - | a=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { - _Py_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } + CHECK_VERSION(stmt_ty, 6, "Variable annotations syntax is", _PyAST_AnnAssign(a, b, c, 0, EXTRA)) } + | a[asdl_expr_seq*]=(z=star_targets '=' { z })+ b=(yield_expr | star_expressions) !'=' tc=[TYPE_COMMENT] { + _PyAST_Assign(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } | a=single_target b=augassign ~ c=(yield_expr | star_expressions) { - _Py_AugAssign(a, b->kind, c, EXTRA) } + _PyAST_AugAssign(a, b->kind, c, EXTRA) } | invalid_assignment augassign[AugOperator*]: | '+=' { _PyPegen_augoperator(p, Add) } | '-=' { _PyPegen_augoperator(p, Sub) } | '*=' { _PyPegen_augoperator(p, Mult) } - | '@=' { CHECK_VERSION(5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) } + | '@=' { CHECK_VERSION(AugOperator*, 5, "The '@' operator is", _PyPegen_augoperator(p, MatMult)) } | '/=' { _PyPegen_augoperator(p, Div) } | '%=' { _PyPegen_augoperator(p, Mod) } | '&=' { _PyPegen_augoperator(p, BitAnd) } @@ -112,111 +121,297 @@ augassign[AugOperator*]: | '**=' { _PyPegen_augoperator(p, Pow) } | '//=' { _PyPegen_augoperator(p, FloorDiv) } -global_stmt[stmt_ty]: 'global' a=','.NAME+ { - _Py_Global(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } -nonlocal_stmt[stmt_ty]: 'nonlocal' a=','.NAME+ { - _Py_Nonlocal(CHECK(_PyPegen_map_names_to_ids(p, a)), EXTRA) } +global_stmt[stmt_ty]: 'global' a[asdl_expr_seq*]=','.NAME+ { + _PyAST_Global(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) } +nonlocal_stmt[stmt_ty]: 'nonlocal' a[asdl_expr_seq*]=','.NAME+ { + _PyAST_Nonlocal(CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, a)), EXTRA) } -yield_stmt[stmt_ty]: y=yield_expr { _Py_Expr(y, EXTRA) } +yield_stmt[stmt_ty]: y=yield_expr { _PyAST_Expr(y, EXTRA) } -assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _Py_Assert(a, b, EXTRA) } +assert_stmt[stmt_ty]: 'assert' a=expression b=[',' z=expression { z }] { _PyAST_Assert(a, b, EXTRA) } del_stmt[stmt_ty]: - | 'del' a=del_targets &(';' | NEWLINE) { _Py_Delete(a, EXTRA) } + | 'del' a=del_targets &(';' | NEWLINE) { _PyAST_Delete(a, EXTRA) } | invalid_del_stmt import_stmt[stmt_ty]: import_name | import_from -import_name[stmt_ty]: 'import' a=dotted_as_names { _Py_Import(a, EXTRA) } +import_name[stmt_ty]: 'import' a=dotted_as_names { _PyAST_Import(a, EXTRA) } # note below: the ('.' | '...') is necessary because '...' is tokenized as ELLIPSIS import_from[stmt_ty]: | 'from' a=('.' | '...')* b=dotted_name 'import' c=import_from_targets { - _Py_ImportFrom(b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) } + _PyAST_ImportFrom(b->v.Name.id, c, _PyPegen_seq_count_dots(a), EXTRA) } | 'from' a=('.' | '...')+ 'import' b=import_from_targets { - _Py_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) } -import_from_targets[asdl_seq*]: + _PyAST_ImportFrom(NULL, b, _PyPegen_seq_count_dots(a), EXTRA) } +import_from_targets[asdl_alias_seq*]: | '(' a=import_from_as_names [','] ')' { a } | import_from_as_names !',' - | '*' { _PyPegen_singleton_seq(p, CHECK(_PyPegen_alias_for_star(p))) } + | '*' { (asdl_alias_seq*)_PyPegen_singleton_seq(p, CHECK(alias_ty, _PyPegen_alias_for_star(p, EXTRA))) } | invalid_import_from_targets -import_from_as_names[asdl_seq*]: - | a=','.import_from_as_name+ { a } +import_from_as_names[asdl_alias_seq*]: + | a[asdl_alias_seq*]=','.import_from_as_name+ { a } import_from_as_name[alias_ty]: - | a=NAME b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, + | a=NAME b=['as' z=NAME { z }] { _PyAST_alias(a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, - p->arena) } -dotted_as_names[asdl_seq*]: - | a=','.dotted_as_name+ { a } + EXTRA) } +dotted_as_names[asdl_alias_seq*]: + | a[asdl_alias_seq*]=','.dotted_as_name+ { a } dotted_as_name[alias_ty]: - | a=dotted_name b=['as' z=NAME { z }] { _Py_alias(a->v.Name.id, + | a=dotted_name b=['as' z=NAME { z }] { _PyAST_alias(a->v.Name.id, (b) ? ((expr_ty) b)->v.Name.id : NULL, - p->arena) } + EXTRA) } dotted_name[expr_ty]: | a=dotted_name '.' b=NAME { _PyPegen_join_names_with_dot(p, a, b) } | NAME if_stmt[stmt_ty]: - | 'if' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } - | 'if' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } + | invalid_if_stmt + | 'if' a=named_expression ':' b=block c=elif_stmt { + _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } + | 'if' a=named_expression ':' b=block c=[else_block] { _PyAST_If(a, b, c, EXTRA) } elif_stmt[stmt_ty]: - | 'elif' a=named_expression ':' b=block c=elif_stmt { _Py_If(a, b, CHECK(_PyPegen_singleton_seq(p, c)), EXTRA) } - | 'elif' a=named_expression ':' b=block c=[else_block] { _Py_If(a, b, c, EXTRA) } -else_block[asdl_seq*]: 'else' ':' b=block { b } + | invalid_elif_stmt + | 'elif' a=named_expression ':' b=block c=elif_stmt { + _PyAST_If(a, b, CHECK(asdl_stmt_seq*, _PyPegen_singleton_seq(p, c)), EXTRA) } + | 'elif' a=named_expression ':' b=block c=[else_block] { _PyAST_If(a, b, c, EXTRA) } +else_block[asdl_stmt_seq*]: + | invalid_else_stmt + | 'else' &&':' b=block { b } while_stmt[stmt_ty]: - | 'while' a=named_expression ':' b=block c=[else_block] { _Py_While(a, b, c, EXTRA) } + | invalid_while_stmt + | 'while' a=named_expression ':' b=block c=[else_block] { _PyAST_While(a, b, c, EXTRA) } for_stmt[stmt_ty]: - | 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { - _Py_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions ':' tc=[TYPE_COMMENT] b=block el=[else_block] { - CHECK_VERSION(5, "Async for loops are", _Py_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_for_stmt + | 'for' t=star_targets 'in' ~ ex=star_expressions &&':' tc=[TYPE_COMMENT] b=block el=[else_block] { + _PyAST_For(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'for' t=star_targets 'in' ~ ex=star_expressions &&':' tc=[TYPE_COMMENT] b=block el=[else_block] { + CHECK_VERSION(stmt_ty, 5, "Async for loops are", _PyAST_AsyncFor(t, ex, b, el, NEW_TYPE_COMMENT(p, tc), EXTRA)) } | invalid_for_target with_stmt[stmt_ty]: - | 'with' '(' a=','.with_item+ ','? ')' ':' b=block { - _Py_With(a, b, NULL, EXTRA) } - | 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { - _Py_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'with' '(' a=','.with_item+ ','? ')' ':' b=block { - CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NULL, EXTRA)) } - | ASYNC 'with' a=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { - CHECK_VERSION(5, "Async with statements are", _Py_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_with_stmt_indent + | 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { + _PyAST_With(a, b, NULL, EXTRA) } + | 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + _PyAST_With(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA) } + | ASYNC 'with' '(' a[asdl_withitem_seq*]=','.with_item+ ','? ')' ':' b=block { + CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NULL, EXTRA)) } + | ASYNC 'with' a[asdl_withitem_seq*]=','.with_item+ ':' tc=[TYPE_COMMENT] b=block { + CHECK_VERSION(stmt_ty, 5, "Async with statements are", _PyAST_AsyncWith(a, b, NEW_TYPE_COMMENT(p, tc), EXTRA)) } + | invalid_with_stmt + with_item[withitem_ty]: - | e=expression 'as' t=star_target &(',' | ')' | ':') { _Py_withitem(e, t, p->arena) } + | e=expression 'as' t=star_target &(',' | ')' | ':') { _PyAST_withitem(e, t, p->arena) } | invalid_with_item - | e=expression { _Py_withitem(e, NULL, p->arena) } + | e=expression { _PyAST_withitem(e, NULL, p->arena) } try_stmt[stmt_ty]: - | 'try' ':' b=block f=finally_block { _Py_Try(b, NULL, NULL, f, EXTRA) } - | 'try' ':' b=block ex=except_block+ el=[else_block] f=[finally_block] { _Py_Try(b, ex, el, f, EXTRA) } + | invalid_try_stmt + | 'try' &&':' b=block f=finally_block { _PyAST_Try(b, NULL, NULL, f, EXTRA) } + | 'try' &&':' b=block ex[asdl_excepthandler_seq*]=except_block+ el=[else_block] f=[finally_block] { _PyAST_Try(b, ex, el, f, EXTRA) } except_block[excepthandler_ty]: + | invalid_except_stmt_indent | 'except' e=expression t=['as' z=NAME { z }] ':' b=block { - _Py_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } - | 'except' ':' b=block { _Py_ExceptHandler(NULL, NULL, b, EXTRA) } -finally_block[asdl_seq*]: 'finally' ':' a=block { a } + _PyAST_ExceptHandler(e, (t) ? ((expr_ty) t)->v.Name.id : NULL, b, EXTRA) } + | 'except' ':' b=block { _PyAST_ExceptHandler(NULL, NULL, b, EXTRA) } + | invalid_except_stmt +finally_block[asdl_stmt_seq*]: + | invalid_finally_stmt + | 'finally' &&':' a=block { a } + +match_stmt[stmt_ty]: + | "match" subject=subject_expr ':' NEWLINE INDENT cases[asdl_match_case_seq*]=case_block+ DEDENT { + CHECK_VERSION(stmt_ty, 10, "Pattern matching is", _PyAST_Match(subject, cases, EXTRA)) } + | invalid_match_stmt +subject_expr[expr_ty]: + | value=star_named_expression ',' values=star_named_expressions? { + _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, value, values)), Load, EXTRA) } + | named_expression +case_block[match_case_ty]: + | invalid_case_block + | "case" pattern=patterns guard=guard? ':' body=block { + _PyAST_match_case(pattern, guard, body, p->arena) } +guard[expr_ty]: 'if' guard=named_expression { guard } + +patterns[pattern_ty]: + | patterns[asdl_pattern_seq*]=open_sequence_pattern { + _PyAST_MatchSequence(patterns, EXTRA) } + | pattern +pattern[pattern_ty]: + | as_pattern + | or_pattern +as_pattern[pattern_ty]: + | pattern=or_pattern 'as' target=pattern_capture_target { + _PyAST_MatchAs(pattern, target->v.Name.id, EXTRA) } + | invalid_as_pattern +or_pattern[pattern_ty]: + | patterns[asdl_pattern_seq*]='|'.closed_pattern+ { + asdl_seq_LEN(patterns) == 1 ? asdl_seq_GET(patterns, 0) : _PyAST_MatchOr(patterns, EXTRA) } +closed_pattern[pattern_ty]: + | literal_pattern + | capture_pattern + | wildcard_pattern + | value_pattern + | group_pattern + | sequence_pattern + | mapping_pattern + | class_pattern + +# Literal patterns are used for equality and identity constraints +literal_pattern[pattern_ty]: + | value=signed_number !('+' | '-') { _PyAST_MatchValue(value, EXTRA) } + | value=complex_number { _PyAST_MatchValue(value, EXTRA) } + | value=strings { _PyAST_MatchValue(value, EXTRA) } + | 'None' { _PyAST_MatchSingleton(Py_None, EXTRA) } + | 'True' { _PyAST_MatchSingleton(Py_True, EXTRA) } + | 'False' { _PyAST_MatchSingleton(Py_False, EXTRA) } + +# Literal expressions are used to restrict permitted mapping pattern keys +literal_expr[expr_ty]: + | signed_number !('+' | '-') + | complex_number + | strings + | 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) } + | 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) } + | 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) } + +complex_number[expr_ty]: + | real=signed_real_number '+' imag=imaginary_number { + _PyAST_BinOp(real, Add, imag, EXTRA) } + | real=signed_real_number '-' imag=imaginary_number { + _PyAST_BinOp(real, Sub, imag, EXTRA) } + +signed_number[expr_ty]: + | NUMBER + | '-' number=NUMBER { _PyAST_UnaryOp(USub, number, EXTRA) } + +signed_real_number[expr_ty]: + | real_number + | '-' real=real_number { _PyAST_UnaryOp(USub, real, EXTRA) } + +real_number[expr_ty]: + | real=NUMBER { _PyPegen_ensure_real(p, real) } + +imaginary_number[expr_ty]: + | imag=NUMBER { _PyPegen_ensure_imaginary(p, imag) } + +capture_pattern[pattern_ty]: + | target=pattern_capture_target { _PyAST_MatchAs(NULL, target->v.Name.id, EXTRA) } + +pattern_capture_target[expr_ty]: + | !"_" name=NAME !('.' | '(' | '=') { + _PyPegen_set_expr_context(p, name, Store) } + +wildcard_pattern[pattern_ty]: + | "_" { _PyAST_MatchAs(NULL, NULL, EXTRA) } + +value_pattern[pattern_ty]: + | attr=attr !('.' | '(' | '=') { _PyAST_MatchValue(attr, EXTRA) } +attr[expr_ty]: + | value=name_or_attr '.' attr=NAME { + _PyAST_Attribute(value, attr->v.Name.id, Load, EXTRA) } +name_or_attr[expr_ty]: + | attr + | NAME + +group_pattern[pattern_ty]: + | '(' pattern=pattern ')' { pattern } + +sequence_pattern[pattern_ty]: + | '[' patterns=maybe_sequence_pattern? ']' { _PyAST_MatchSequence(patterns, EXTRA) } + | '(' patterns=open_sequence_pattern? ')' { _PyAST_MatchSequence(patterns, EXTRA) } +open_sequence_pattern[asdl_seq*]: + | pattern=maybe_star_pattern ',' patterns=maybe_sequence_pattern? { + _PyPegen_seq_insert_in_front(p, pattern, patterns) } +maybe_sequence_pattern[asdl_seq*]: + | patterns=','.maybe_star_pattern+ ','? { patterns } +maybe_star_pattern[pattern_ty]: + | star_pattern + | pattern +star_pattern[pattern_ty]: + | '*' target=pattern_capture_target { + _PyAST_MatchStar(target->v.Name.id, EXTRA) } + | '*' wildcard_pattern { + _PyAST_MatchStar(NULL, EXTRA) } + +mapping_pattern[pattern_ty]: + | '{' '}' { + _PyAST_MatchMapping(NULL, NULL, NULL, EXTRA) } + | '{' rest=double_star_pattern ','? '}' { + _PyAST_MatchMapping(NULL, NULL, rest->v.Name.id, EXTRA) } + | '{' items=items_pattern ',' rest=double_star_pattern ','? '}' { + _PyAST_MatchMapping( + CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)), + CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)), + rest->v.Name.id, + EXTRA) } + | '{' items=items_pattern ','? '}' { + _PyAST_MatchMapping( + CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, items)), + CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, items)), + NULL, + EXTRA) } +items_pattern[asdl_seq*]: + | ','.key_value_pattern+ +key_value_pattern[KeyPatternPair*]: + | key=(literal_expr | attr) ':' pattern=pattern { + _PyPegen_key_pattern_pair(p, key, pattern) } +double_star_pattern[expr_ty]: + | '**' target=pattern_capture_target { target } + +class_pattern[pattern_ty]: + | cls=name_or_attr '(' ')' { + _PyAST_MatchClass(cls, NULL, NULL, NULL, EXTRA) } + | cls=name_or_attr '(' patterns=positional_patterns ','? ')' { + _PyAST_MatchClass(cls, patterns, NULL, NULL, EXTRA) } + | cls=name_or_attr '(' keywords=keyword_patterns ','? ')' { + _PyAST_MatchClass( + cls, NULL, + CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, + CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))), + CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)), + EXTRA) } + | cls=name_or_attr '(' patterns=positional_patterns ',' keywords=keyword_patterns ','? ')' { + _PyAST_MatchClass( + cls, + patterns, + CHECK(asdl_identifier_seq*, _PyPegen_map_names_to_ids(p, + CHECK(asdl_expr_seq*, _PyPegen_get_pattern_keys(p, keywords)))), + CHECK(asdl_pattern_seq*, _PyPegen_get_patterns(p, keywords)), + EXTRA) } + | invalid_class_pattern +positional_patterns[asdl_pattern_seq*]: + | args[asdl_pattern_seq*]=','.pattern+ { args } +keyword_patterns[asdl_seq*]: + | ','.keyword_pattern+ +keyword_pattern[KeyPatternPair*]: + | arg=NAME '=' value=pattern { _PyPegen_key_pattern_pair(p, arg, value) } return_stmt[stmt_ty]: - | 'return' a=[star_expressions] { _Py_Return(a, EXTRA) } + | 'return' a=[star_expressions] { _PyAST_Return(a, EXTRA) } raise_stmt[stmt_ty]: - | 'raise' a=expression b=['from' z=expression { z }] { _Py_Raise(a, b, EXTRA) } - | 'raise' { _Py_Raise(NULL, NULL, EXTRA) } + | 'raise' a=expression b=['from' z=expression { z }] { _PyAST_Raise(a, b, EXTRA) } + | 'raise' { _PyAST_Raise(NULL, NULL, EXTRA) } function_def[stmt_ty]: | d=decorators f=function_def_raw { _PyPegen_function_def_decorators(p, d, f) } | function_def_raw function_def_raw[stmt_ty]: - | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { - _Py_FunctionDef(n->v.Name.id, - (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + | invalid_def_raw + | 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { + _PyAST_FunctionDef(n->v.Name.id, + (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) } - | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] ':' tc=[func_type_comment] b=block { + | ASYNC 'def' n=NAME '(' params=[params] ')' a=['->' z=expression { z }] &&':' tc=[func_type_comment] b=block { CHECK_VERSION( + stmt_ty, 5, "Async functions are", - _Py_AsyncFunctionDef(n->v.Name.id, - (params) ? params : CHECK(_PyPegen_empty_arguments(p)), + _PyAST_AsyncFunctionDef(n->v.Name.id, + (params) ? params : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, NULL, a, NEW_TYPE_COMMENT(p, tc), EXTRA) ) } func_type_comment[Token*]: @@ -229,11 +424,11 @@ params[arguments_ty]: | parameters parameters[arguments_ty]: - | a=slash_no_default b=param_no_default* c=param_with_default* d=[star_etc] { + | a=slash_no_default b[asdl_arg_seq*]=param_no_default* c=param_with_default* d=[star_etc] { _PyPegen_make_arguments(p, a, NULL, b, c, d) } | a=slash_with_default b=param_with_default* c=[star_etc] { _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } - | a=param_no_default+ b=param_with_default* c=[star_etc] { + | a[asdl_arg_seq*]=param_no_default+ b=param_with_default* c=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } | a=param_with_default+ b=[star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} | a=star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } @@ -241,12 +436,12 @@ parameters[arguments_ty]: # Some duplication here because we can't write (',' | &')'), # which is because we don't support empty alternatives (yet). # -slash_no_default[asdl_seq*]: - | a=param_no_default+ '/' ',' { a } - | a=param_no_default+ '/' &')' { a } +slash_no_default[asdl_arg_seq*]: + | a[asdl_arg_seq*]=param_no_default+ '/' ',' { a } + | a[asdl_arg_seq*]=param_no_default+ '/' &')' { a } slash_with_default[SlashWithDefault*]: - | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } - | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, a, b) } + | a=param_no_default* b=param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } + | a=param_no_default* b=param_with_default+ '/' &')' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } star_etc[StarEtc*]: | '*' a=param_no_default b=param_maybe_default* c=[kwds] { @@ -279,60 +474,68 @@ param_with_default[NameDefaultPair*]: param_maybe_default[NameDefaultPair*]: | a=param c=default? ',' tc=TYPE_COMMENT? { _PyPegen_name_default_pair(p, a, c, tc) } | a=param c=default? tc=TYPE_COMMENT? &')' { _PyPegen_name_default_pair(p, a, c, tc) } -param[arg_ty]: a=NAME b=annotation? { _Py_arg(a->v.Name.id, b, NULL, EXTRA) } +param[arg_ty]: a=NAME b=annotation? { _PyAST_arg(a->v.Name.id, b, NULL, EXTRA) } annotation[expr_ty]: ':' a=expression { a } default[expr_ty]: '=' a=expression { a } -decorators[asdl_seq*]: a=('@' f=named_expression NEWLINE { f })+ { a } +decorators[asdl_expr_seq*]: a[asdl_expr_seq*]=('@' f=named_expression NEWLINE { f })+ { a } class_def[stmt_ty]: | a=decorators b=class_def_raw { _PyPegen_class_def_decorators(p, a, b) } | class_def_raw class_def_raw[stmt_ty]: - | 'class' a=NAME b=['(' z=[arguments] ')' { z }] ':' c=block { - _Py_ClassDef(a->v.Name.id, + | invalid_class_def_raw + | 'class' a=NAME b=['(' z=[arguments] ')' { z }] &&':' c=block { + _PyAST_ClassDef(a->v.Name.id, (b) ? ((expr_ty) b)->v.Call.args : NULL, (b) ? ((expr_ty) b)->v.Call.keywords : NULL, c, NULL, EXTRA) } -block[asdl_seq*] (memo): +block[asdl_stmt_seq*] (memo): | NEWLINE INDENT a=statements DEDENT { a } - | simple_stmt + | simple_stmts | invalid_block star_expressions[expr_ty]: | a=star_expression b=(',' c=star_expression { c })+ [','] { - _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } - | a=star_expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=star_expression ',' { _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) } | star_expression star_expression[expr_ty] (memo): - | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } + | '*' a=bitwise_or { _PyAST_Starred(a, Load, EXTRA) } | expression -star_named_expressions[asdl_seq*]: a=','.star_named_expression+ [','] { a } +star_named_expressions[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_named_expression+ [','] { a } star_named_expression[expr_ty]: - | '*' a=bitwise_or { _Py_Starred(a, Load, EXTRA) } + | '*' a=bitwise_or { _PyAST_Starred(a, Load, EXTRA) } | named_expression + + +assigment_expression[expr_ty]: + | a=NAME ':=' ~ b=expression { _PyAST_NamedExpr(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } + named_expression[expr_ty]: - | a=NAME ':=' ~ b=expression { _Py_NamedExpr(CHECK(_PyPegen_set_expr_context(p, a, Store)), b, EXTRA) } - | expression !':=' + | assigment_expression | invalid_named_expression + | expression !':=' annotated_rhs[expr_ty]: yield_expr | star_expressions expressions[expr_ty]: | a=expression b=(',' c=expression { c })+ [','] { - _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } - | a=expression ',' { _Py_Tuple(CHECK(_PyPegen_singleton_seq(p, a)), Load, EXTRA) } + _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Load, EXTRA) } + | a=expression ',' { _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_singleton_seq(p, a)), Load, EXTRA) } | expression expression[expr_ty] (memo): - | a=disjunction 'if' b=disjunction 'else' c=expression { _Py_IfExp(b, a, c, EXTRA) } + | invalid_expression + | a=disjunction 'if' b=disjunction 'else' c=expression { _PyAST_IfExp(b, a, c, EXTRA) } | disjunction | lambdef lambdef[expr_ty]: - | 'lambda' a=[lambda_params] ':' b=expression { _Py_Lambda((a) ? a : CHECK(_PyPegen_empty_arguments(p)), b, EXTRA) } + | 'lambda' a=[lambda_params] ':' b=expression { + _PyAST_Lambda((a) ? a : CHECK(arguments_ty, _PyPegen_empty_arguments(p)), b, EXTRA) } lambda_params[arguments_ty]: | invalid_lambda_parameters @@ -343,21 +546,21 @@ lambda_params[arguments_ty]: # a colon, not a close parenthesis. (For more, see parameters above.) # lambda_parameters[arguments_ty]: - | a=lambda_slash_no_default b=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] { + | a=lambda_slash_no_default b[asdl_arg_seq*]=lambda_param_no_default* c=lambda_param_with_default* d=[lambda_star_etc] { _PyPegen_make_arguments(p, a, NULL, b, c, d) } | a=lambda_slash_with_default b=lambda_param_with_default* c=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, a, NULL, b, c) } - | a=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] { + | a[asdl_arg_seq*]=lambda_param_no_default+ b=lambda_param_with_default* c=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, a, b, c) } | a=lambda_param_with_default+ b=[lambda_star_etc] { _PyPegen_make_arguments(p, NULL, NULL, NULL, a, b)} | a=lambda_star_etc { _PyPegen_make_arguments(p, NULL, NULL, NULL, NULL, a) } -lambda_slash_no_default[asdl_seq*]: - | a=lambda_param_no_default+ '/' ',' { a } - | a=lambda_param_no_default+ '/' &':' { a } +lambda_slash_no_default[asdl_arg_seq*]: + | a[asdl_arg_seq*]=lambda_param_no_default+ '/' ',' { a } + | a[asdl_arg_seq*]=lambda_param_no_default+ '/' &':' { a } lambda_slash_with_default[SlashWithDefault*]: - | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, a, b) } - | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, a, b) } + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' ',' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } + | a=lambda_param_no_default* b=lambda_param_with_default+ '/' &':' { _PyPegen_slash_with_default(p, (asdl_arg_seq *)a, b) } lambda_star_etc[StarEtc*]: | '*' a=lambda_param_no_default b=lambda_param_maybe_default* c=[lambda_kwds] { @@ -378,26 +581,30 @@ lambda_param_with_default[NameDefaultPair*]: lambda_param_maybe_default[NameDefaultPair*]: | a=lambda_param c=default? ',' { _PyPegen_name_default_pair(p, a, c, NULL) } | a=lambda_param c=default? &':' { _PyPegen_name_default_pair(p, a, c, NULL) } -lambda_param[arg_ty]: a=NAME { _Py_arg(a->v.Name.id, NULL, NULL, EXTRA) } +lambda_param[arg_ty]: a=NAME { _PyAST_arg(a->v.Name.id, NULL, NULL, EXTRA) } disjunction[expr_ty] (memo): - | a=conjunction b=('or' c=conjunction { c })+ { _Py_BoolOp( + | a=conjunction b=('or' c=conjunction { c })+ { _PyAST_BoolOp( Or, - CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), EXTRA) } | conjunction conjunction[expr_ty] (memo): - | a=inversion b=('and' c=inversion { c })+ { _Py_BoolOp( + | a=inversion b=('and' c=inversion { c })+ { _PyAST_BoolOp( And, - CHECK(_PyPegen_seq_insert_in_front(p, a, b)), + CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), EXTRA) } | inversion inversion[expr_ty] (memo): - | 'not' a=inversion { _Py_UnaryOp(Not, a, EXTRA) } + | 'not' a=inversion { _PyAST_UnaryOp(Not, a, EXTRA) } | comparison comparison[expr_ty]: | a=bitwise_or b=compare_op_bitwise_or_pair+ { - _Py_Compare(a, CHECK(_PyPegen_get_cmpops(p, b)), CHECK(_PyPegen_get_exprs(p, b)), EXTRA) } + _PyAST_Compare( + a, + CHECK(asdl_int_seq*, _PyPegen_get_cmpops(p, b)), + CHECK(asdl_expr_seq*, _PyPegen_get_exprs(p, b)), + EXTRA) } | bitwise_or compare_op_bitwise_or_pair[CmpopExprPair*]: | eq_bitwise_or @@ -423,189 +630,196 @@ isnot_bitwise_or[CmpopExprPair*]: 'is' 'not' a=bitwise_or { _PyPegen_cmpop_expr_ is_bitwise_or[CmpopExprPair*]: 'is' a=bitwise_or { _PyPegen_cmpop_expr_pair(p, Is, a) } bitwise_or[expr_ty]: - | a=bitwise_or '|' b=bitwise_xor { _Py_BinOp(a, BitOr, b, EXTRA) } + | a=bitwise_or '|' b=bitwise_xor { _PyAST_BinOp(a, BitOr, b, EXTRA) } | bitwise_xor bitwise_xor[expr_ty]: - | a=bitwise_xor '^' b=bitwise_and { _Py_BinOp(a, BitXor, b, EXTRA) } + | a=bitwise_xor '^' b=bitwise_and { _PyAST_BinOp(a, BitXor, b, EXTRA) } | bitwise_and bitwise_and[expr_ty]: - | a=bitwise_and '&' b=shift_expr { _Py_BinOp(a, BitAnd, b, EXTRA) } + | a=bitwise_and '&' b=shift_expr { _PyAST_BinOp(a, BitAnd, b, EXTRA) } | shift_expr shift_expr[expr_ty]: - | a=shift_expr '<<' b=sum { _Py_BinOp(a, LShift, b, EXTRA) } - | a=shift_expr '>>' b=sum { _Py_BinOp(a, RShift, b, EXTRA) } + | a=shift_expr '<<' b=sum { _PyAST_BinOp(a, LShift, b, EXTRA) } + | a=shift_expr '>>' b=sum { _PyAST_BinOp(a, RShift, b, EXTRA) } | sum sum[expr_ty]: - | a=sum '+' b=term { _Py_BinOp(a, Add, b, EXTRA) } - | a=sum '-' b=term { _Py_BinOp(a, Sub, b, EXTRA) } + | a=sum '+' b=term { _PyAST_BinOp(a, Add, b, EXTRA) } + | a=sum '-' b=term { _PyAST_BinOp(a, Sub, b, EXTRA) } | term term[expr_ty]: - | a=term '*' b=factor { _Py_BinOp(a, Mult, b, EXTRA) } - | a=term '/' b=factor { _Py_BinOp(a, Div, b, EXTRA) } - | a=term '//' b=factor { _Py_BinOp(a, FloorDiv, b, EXTRA) } - | a=term '%' b=factor { _Py_BinOp(a, Mod, b, EXTRA) } - | a=term '@' b=factor { CHECK_VERSION(5, "The '@' operator is", _Py_BinOp(a, MatMult, b, EXTRA)) } + | a=term '*' b=factor { _PyAST_BinOp(a, Mult, b, EXTRA) } + | a=term '/' b=factor { _PyAST_BinOp(a, Div, b, EXTRA) } + | a=term '//' b=factor { _PyAST_BinOp(a, FloorDiv, b, EXTRA) } + | a=term '%' b=factor { _PyAST_BinOp(a, Mod, b, EXTRA) } + | a=term '@' b=factor { CHECK_VERSION(expr_ty, 5, "The '@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) } | factor factor[expr_ty] (memo): - | '+' a=factor { _Py_UnaryOp(UAdd, a, EXTRA) } - | '-' a=factor { _Py_UnaryOp(USub, a, EXTRA) } - | '~' a=factor { _Py_UnaryOp(Invert, a, EXTRA) } + | '+' a=factor { _PyAST_UnaryOp(UAdd, a, EXTRA) } + | '-' a=factor { _PyAST_UnaryOp(USub, a, EXTRA) } + | '~' a=factor { _PyAST_UnaryOp(Invert, a, EXTRA) } | power power[expr_ty]: - | a=await_primary '**' b=factor { _Py_BinOp(a, Pow, b, EXTRA) } + | a=await_primary '**' b=factor { _PyAST_BinOp(a, Pow, b, EXTRA) } | await_primary await_primary[expr_ty] (memo): - | AWAIT a=primary { CHECK_VERSION(5, "Await expressions are", _Py_Await(a, EXTRA)) } + | AWAIT a=primary { CHECK_VERSION(expr_ty, 5, "Await expressions are", _PyAST_Await(a, EXTRA)) } | primary primary[expr_ty]: | invalid_primary # must be before 'primay genexp' because of invalid_genexp - | a=primary '.' b=NAME { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } - | a=primary b=genexp { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=primary '.' b=NAME { _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) } + | a=primary b=genexp { _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } | a=primary '(' b=[arguments] ')' { - _Py_Call(a, + _PyAST_Call(a, (b) ? ((expr_ty) b)->v.Call.args : NULL, (b) ? ((expr_ty) b)->v.Call.keywords : NULL, EXTRA) } - | a=primary '[' b=slices ']' { _Py_Subscript(a, b, Load, EXTRA) } + | a=primary '[' b=slices ']' { _PyAST_Subscript(a, b, Load, EXTRA) } | atom slices[expr_ty]: | a=slice !',' { a } - | a=','.slice+ [','] { _Py_Tuple(a, Load, EXTRA) } + | a[asdl_expr_seq*]=','.slice+ [','] { _PyAST_Tuple(a, Load, EXTRA) } slice[expr_ty]: - | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _Py_Slice(a, b, c, EXTRA) } - | a=expression { a } + | a=[expression] ':' b=[expression] c=[':' d=[expression] { d }] { _PyAST_Slice(a, b, c, EXTRA) } + | a=named_expression { a } atom[expr_ty]: | NAME - | 'True' { _Py_Constant(Py_True, NULL, EXTRA) } - | 'False' { _Py_Constant(Py_False, NULL, EXTRA) } - | 'None' { _Py_Constant(Py_None, NULL, EXTRA) } - | '__peg_parser__' { RAISE_SYNTAX_ERROR("You found it!") } + | 'True' { _PyAST_Constant(Py_True, NULL, EXTRA) } + | 'False' { _PyAST_Constant(Py_False, NULL, EXTRA) } + | 'None' { _PyAST_Constant(Py_None, NULL, EXTRA) } | &STRING strings | NUMBER | &'(' (tuple | group | genexp) | &'[' (list | listcomp) | &'{' (dict | set | dictcomp | setcomp) - | '...' { _Py_Constant(Py_Ellipsis, NULL, EXTRA) } + | '...' { _PyAST_Constant(Py_Ellipsis, NULL, EXTRA) } strings[expr_ty] (memo): a=STRING+ { _PyPegen_concatenate_strings(p, a) } list[expr_ty]: - | '[' a=[star_named_expressions] ']' { _Py_List(a, Load, EXTRA) } + | '[' a=[star_named_expressions] ']' { _PyAST_List(a, Load, EXTRA) } listcomp[expr_ty]: - | '[' a=named_expression ~ b=for_if_clauses ']' { _Py_ListComp(a, b, EXTRA) } + | '[' a=named_expression b=for_if_clauses ']' { _PyAST_ListComp(a, b, EXTRA) } | invalid_comprehension tuple[expr_ty]: | '(' a=[y=star_named_expression ',' z=[star_named_expressions] { _PyPegen_seq_insert_in_front(p, y, z) } ] ')' { - _Py_Tuple(a, Load, EXTRA) } + _PyAST_Tuple(a, Load, EXTRA) } group[expr_ty]: | '(' a=(yield_expr | named_expression) ')' { a } | invalid_group genexp[expr_ty]: - | '(' a=named_expression ~ b=for_if_clauses ')' { _Py_GeneratorExp(a, b, EXTRA) } + | '(' a=( assigment_expression | expression !':=') b=for_if_clauses ')' { _PyAST_GeneratorExp(a, b, EXTRA) } | invalid_comprehension -set[expr_ty]: '{' a=star_named_expressions '}' { _Py_Set(a, EXTRA) } +set[expr_ty]: '{' a=star_named_expressions '}' { _PyAST_Set(a, EXTRA) } setcomp[expr_ty]: - | '{' a=named_expression ~ b=for_if_clauses '}' { _Py_SetComp(a, b, EXTRA) } + | '{' a=named_expression b=for_if_clauses '}' { _PyAST_SetComp(a, b, EXTRA) } | invalid_comprehension dict[expr_ty]: | '{' a=[double_starred_kvpairs] '}' { - _Py_Dict(CHECK(_PyPegen_get_keys(p, a)), CHECK(_PyPegen_get_values(p, a)), EXTRA) } + _PyAST_Dict( + CHECK(asdl_expr_seq*, _PyPegen_get_keys(p, a)), + CHECK(asdl_expr_seq*, _PyPegen_get_values(p, a)), + EXTRA) } + | '{' invalid_double_starred_kvpairs '}' + dictcomp[expr_ty]: - | '{' a=kvpair b=for_if_clauses '}' { _Py_DictComp(a->key, a->value, b, EXTRA) } + | '{' a=kvpair b=for_if_clauses '}' { _PyAST_DictComp(a->key, a->value, b, EXTRA) } | invalid_dict_comprehension double_starred_kvpairs[asdl_seq*]: a=','.double_starred_kvpair+ [','] { a } double_starred_kvpair[KeyValuePair*]: | '**' a=bitwise_or { _PyPegen_key_value_pair(p, NULL, a) } | kvpair kvpair[KeyValuePair*]: a=expression ':' b=expression { _PyPegen_key_value_pair(p, a, b) } -for_if_clauses[asdl_seq*]: - | for_if_clause+ +for_if_clauses[asdl_comprehension_seq*]: + | a[asdl_comprehension_seq*]=for_if_clause+ { a } for_if_clause[comprehension_ty]: - | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { - CHECK_VERSION(6, "Async comprehensions are", _Py_comprehension(a, b, c, 1, p->arena)) } - | 'for' a=star_targets 'in' ~ b=disjunction c=('if' z=disjunction { z })* { - _Py_comprehension(a, b, c, 0, p->arena) } + | ASYNC 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { + CHECK_VERSION(comprehension_ty, 6, "Async comprehensions are", _PyAST_comprehension(a, b, c, 1, p->arena)) } + | 'for' a=star_targets 'in' ~ b=disjunction c[asdl_expr_seq*]=('if' z=disjunction { z })* { + _PyAST_comprehension(a, b, c, 0, p->arena) } | invalid_for_target yield_expr[expr_ty]: - | 'yield' 'from' a=expression { _Py_YieldFrom(a, EXTRA) } - | 'yield' a=[star_expressions] { _Py_Yield(a, EXTRA) } + | 'yield' 'from' a=expression { _PyAST_YieldFrom(a, EXTRA) } + | 'yield' a=[star_expressions] { _PyAST_Yield(a, EXTRA) } arguments[expr_ty] (memo): | a=args [','] &')' { a } | invalid_arguments args[expr_ty]: - | a=','.(starred_expression | named_expression !'=')+ b=[',' k=kwargs {k}] { _PyPegen_collect_call_seqs(p, a, b, EXTRA) } - | a=kwargs { _Py_Call(_PyPegen_dummy_name(p), - CHECK_NULL_ALLOWED(_PyPegen_seq_extract_starred_exprs(p, a)), - CHECK_NULL_ALLOWED(_PyPegen_seq_delete_starred_exprs(p, a)), + | a[asdl_expr_seq*]=','.(starred_expression | ( assigment_expression | expression !':=') !'=')+ b=[',' k=kwargs {k}] { + _PyPegen_collect_call_seqs(p, a, b, EXTRA) } + | a=kwargs { _PyAST_Call(_PyPegen_dummy_name(p), + CHECK_NULL_ALLOWED(asdl_expr_seq*, _PyPegen_seq_extract_starred_exprs(p, a)), + CHECK_NULL_ALLOWED(asdl_keyword_seq*, _PyPegen_seq_delete_starred_exprs(p, a)), EXTRA) } + kwargs[asdl_seq*]: | a=','.kwarg_or_starred+ ',' b=','.kwarg_or_double_starred+ { _PyPegen_join_sequences(p, a, b) } | ','.kwarg_or_starred+ | ','.kwarg_or_double_starred+ starred_expression[expr_ty]: - | '*' a=expression { _Py_Starred(a, Load, EXTRA) } + | '*' a=expression { _PyAST_Starred(a, Load, EXTRA) } kwarg_or_starred[KeywordOrStarred*]: + | invalid_kwarg | a=NAME '=' b=expression { - _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } + _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) } | a=starred_expression { _PyPegen_keyword_or_starred(p, a, 0) } - | invalid_kwarg kwarg_or_double_starred[KeywordOrStarred*]: - | a=NAME '=' b=expression { - _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(a->v.Name.id, b, EXTRA)), 1) } - | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(_Py_keyword(NULL, a, EXTRA)), 1) } | invalid_kwarg + | a=NAME '=' b=expression { + _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(a->v.Name.id, b, EXTRA)), 1) } + | '**' a=expression { _PyPegen_keyword_or_starred(p, CHECK(keyword_ty, _PyAST_keyword(NULL, a, EXTRA)), 1) } # NOTE: star_targets may contain *bitwise_or, targets may not. star_targets[expr_ty]: | a=star_target !',' { a } | a=star_target b=(',' c=star_target { c })* [','] { - _Py_Tuple(CHECK(_PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } -star_targets_list_seq[asdl_seq*]: a=','.star_target+ [','] { a } -star_targets_tuple_seq[asdl_seq*]: - | a=star_target b=(',' c=star_target { c })+ [','] { _PyPegen_seq_insert_in_front(p, a, b) } - | a=star_target ',' { _PyPegen_singleton_seq(p, a) } + _PyAST_Tuple(CHECK(asdl_expr_seq*, _PyPegen_seq_insert_in_front(p, a, b)), Store, EXTRA) } +star_targets_list_seq[asdl_expr_seq*]: a[asdl_expr_seq*]=','.star_target+ [','] { a } +star_targets_tuple_seq[asdl_expr_seq*]: + | a=star_target b=(',' c=star_target { c })+ [','] { (asdl_expr_seq*) _PyPegen_seq_insert_in_front(p, a, b) } + | a=star_target ',' { (asdl_expr_seq*) _PyPegen_singleton_seq(p, a) } star_target[expr_ty] (memo): | '*' a=(!'*' star_target) { - _Py_Starred(CHECK(_PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } + _PyAST_Starred(CHECK(expr_ty, _PyPegen_set_expr_context(p, a, Store)), Store, EXTRA) } | target_with_star_atom target_with_star_atom[expr_ty] (memo): - | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } - | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + | a=t_primary '.' b=NAME !t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _PyAST_Subscript(a, b, Store, EXTRA) } | star_atom star_atom[expr_ty]: | a=NAME { _PyPegen_set_expr_context(p, a, Store) } | '(' a=target_with_star_atom ')' { _PyPegen_set_expr_context(p, a, Store) } - | '(' a=[star_targets_tuple_seq] ')' { _Py_Tuple(a, Store, EXTRA) } - | '[' a=[star_targets_list_seq] ']' { _Py_List(a, Store, EXTRA) } + | '(' a=[star_targets_tuple_seq] ')' { _PyAST_Tuple(a, Store, EXTRA) } + | '[' a=[star_targets_list_seq] ']' { _PyAST_List(a, Store, EXTRA) } single_target[expr_ty]: | single_subscript_attribute_target | a=NAME { _PyPegen_set_expr_context(p, a, Store) } | '(' a=single_target ')' { a } single_subscript_attribute_target[expr_ty]: - | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Store, EXTRA) } - | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Store, EXTRA) } + | a=t_primary '.' b=NAME !t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Store, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _PyAST_Subscript(a, b, Store, EXTRA) } -del_targets[asdl_seq*]: a=','.del_target+ [','] { a } +del_targets[asdl_expr_seq*]: a[asdl_expr_seq*]=','.del_target+ [','] { a } del_target[expr_ty] (memo): - | a=t_primary '.' b=NAME !t_lookahead { _Py_Attribute(a, b->v.Name.id, Del, EXTRA) } - | a=t_primary '[' b=slices ']' !t_lookahead { _Py_Subscript(a, b, Del, EXTRA) } + | a=t_primary '.' b=NAME !t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Del, EXTRA) } + | a=t_primary '[' b=slices ']' !t_lookahead { _PyAST_Subscript(a, b, Del, EXTRA) } | del_t_atom del_t_atom[expr_ty]: | a=NAME { _PyPegen_set_expr_context(p, a, Del) } | '(' a=del_target ')' { _PyPegen_set_expr_context(p, a, Del) } - | '(' a=[del_targets] ')' { _Py_Tuple(a, Del, EXTRA) } - | '[' a=[del_targets] ']' { _Py_List(a, Del, EXTRA) } + | '(' a=[del_targets] ')' { _PyAST_Tuple(a, Del, EXTRA) } + | '[' a=[del_targets] ']' { _PyAST_List(a, Del, EXTRA) } t_primary[expr_ty]: - | a=t_primary '.' b=NAME &t_lookahead { _Py_Attribute(a, b->v.Name.id, Load, EXTRA) } - | a=t_primary '[' b=slices ']' &t_lookahead { _Py_Subscript(a, b, Load, EXTRA) } - | a=t_primary b=genexp &t_lookahead { _Py_Call(a, CHECK(_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } + | a=t_primary '.' b=NAME &t_lookahead { _PyAST_Attribute(a, b->v.Name.id, Load, EXTRA) } + | a=t_primary '[' b=slices ']' &t_lookahead { _PyAST_Subscript(a, b, Load, EXTRA) } + | a=t_primary b=genexp &t_lookahead { + _PyAST_Call(a, CHECK(asdl_expr_seq*, (asdl_expr_seq*)_PyPegen_singleton_seq(p, b)), NULL, EXTRA) } | a=t_primary '(' b=[arguments] ')' &t_lookahead { - _Py_Call(a, + _PyAST_Call(a, (b) ? ((expr_ty) b)->v.Call.args : NULL, (b) ? ((expr_ty) b)->v.Call.keywords : NULL, EXTRA) } @@ -614,21 +828,49 @@ t_lookahead: '(' | '[' | '.' # From here on, there are rules for invalid syntax with specialised error messages invalid_arguments: - | args ',' '*' { RAISE_SYNTAX_ERROR("iterable argument unpacking follows keyword argument unpacking") } - | a=expression for_if_clauses ',' [args | expression for_if_clauses] { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } - | a=args for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a) } - | args ',' a=expression for_if_clauses { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "Generator expression must be parenthesized") } + | a=args ',' '*' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable argument unpacking follows keyword argument unpacking") } + | a=expression b=for_if_clauses ',' [args | expression for_if_clauses] { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, comprehension_ty)->target, "Generator expression must be parenthesized") } + | a=NAME b='=' expression for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")} + | a=args b=for_if_clauses { _PyPegen_nonparen_genexp_in_call(p, a, b) } + | args ',' a=expression b=for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, asdl_seq_GET(b, b->size-1)->target, "Generator expression must be parenthesized") } | a=args ',' args { _PyPegen_arguments_parsing_error(p, a) } invalid_kwarg: + | a=NAME b='=' expression for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?")} | !(NAME '=') a=expression b='=' { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION( - a, "expression cannot contain assignment, perhaps you meant \"==\"?") } + RAISE_SYNTAX_ERROR_KNOWN_RANGE( + a, b, "expression cannot contain assignment, perhaps you meant \"==\"?") } + +expression_without_invalid[expr_ty]: + | a=disjunction 'if' b=disjunction 'else' c=expression { _PyAST_IfExp(b, a, c, EXTRA) } + | disjunction + | lambdef +invalid_legacy_expression: + | a=NAME !'(' b=star_expressions { + _PyPegen_check_legacy_stmt(p, a) ? RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, + "Missing parentheses in call to '%U'. Did you mean %U(...)?", a->v.Name.id, a->v.Name.id) : NULL} + +invalid_expression: + | invalid_legacy_expression + # !(NAME STRING) is not matched so we don't show this error with some invalid string prefixes like: kf"dsfsdf" + # Soft keywords need to also be ignored because they can be parsed as NAME NAME + | !(NAME STRING | SOFT_KEYWORD) a=disjunction b=expression_without_invalid { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Perhaps you forgot a comma?") } + | a=disjunction 'if' b=disjunction !('else'|':') { RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "expected 'else' after 'if' expression") } + invalid_named_expression: | a=expression ':=' expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION( a, "cannot use assignment expressions with %s", _PyPegen_get_expr_name(a)) } + | a=NAME '=' b=bitwise_or !('='|':=') { + p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "invalid syntax. Maybe you meant '==' or ':=' instead of '='?") } + | !(list|tuple|genexp|'True'|'None'|'False') a=bitwise_or b='=' bitwise_or !('='|':=') { + p->in_raw_rule ? NULL : RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot assign to %s here. Maybe you meant '==' instead of '='?", + _PyPegen_get_expr_name(a)) } + invalid_assignment: | a=invalid_ann_assign_target ':' expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION( @@ -644,7 +886,7 @@ invalid_assignment: RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } | (star_targets '=')* a=yield_expr '=' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "assignment to yield expression not possible") } | a=star_expressions augassign (yield_expr | star_expressions) { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION( + RAISE_SYNTAX_ERROR_KNOWN_LOCATION( a, "'%s' is an illegal expression for augmented assignment", _PyPegen_get_expr_name(a) @@ -663,17 +905,28 @@ invalid_primary: invalid_comprehension: | ('[' | '(' | '{') a=starred_expression for_if_clauses { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "iterable unpacking cannot be used in comprehension") } + | ('[' | '{') a=star_named_expression ',' b=star_named_expressions for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, PyPegen_last_item(b, expr_ty), + "did you forget parentheses around the comprehension target?") } + | ('[' | '{') a=star_named_expression b=',' for_if_clauses { + RAISE_SYNTAX_ERROR_KNOWN_RANGE(a, b, "did you forget parentheses around the comprehension target?") } invalid_dict_comprehension: | '{' a='**' bitwise_or for_if_clauses '}' { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "dict unpacking cannot be used in dict comprehension") } invalid_parameters: - | param_no_default* (slash_with_default | param_with_default+) param_no_default { - RAISE_SYNTAX_ERROR("non-default argument follows default argument") } + | param_no_default* invalid_parameters_helper a=param_no_default { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "non-default argument follows default argument") } +invalid_parameters_helper: # This is only there to avoid type errors + | a=slash_with_default { _PyPegen_singleton_seq(p, a) } + | param_with_default+ invalid_lambda_parameters: - | lambda_param_no_default* (lambda_slash_with_default | lambda_param_with_default+) lambda_param_no_default { - RAISE_SYNTAX_ERROR("non-default argument follows default argument") } + | lambda_param_no_default* invalid_lambda_parameters_helper a=lambda_param_no_default { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "non-default argument follows default argument") } +invalid_lambda_parameters_helper: + | a=lambda_slash_with_default { _PyPegen_singleton_seq(p, a) } + | lambda_param_with_default+ invalid_star_etc: - | '*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") } + | a='*' (')' | ',' (')' | '**')) { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "named arguments must follow bare *") } | '*' ',' TYPE_COMMENT { RAISE_SYNTAX_ERROR("bare * has associated type comment") } invalid_lambda_star_etc: | '*' (':' | ',' (':' | '**')) { RAISE_SYNTAX_ERROR("named arguments must follow bare *") } @@ -681,7 +934,7 @@ invalid_double_type_comments: | TYPE_COMMENT NEWLINE TYPE_COMMENT NEWLINE INDENT { RAISE_SYNTAX_ERROR("Cannot have two type comments on def") } invalid_with_item: - | expression 'as' a=expression { + | expression 'as' a=expression &(',' | ')' | ':') { RAISE_SYNTAX_ERROR_INVALID_TARGET(STAR_TARGETS, a) } invalid_for_target: @@ -690,7 +943,87 @@ invalid_for_target: invalid_group: | '(' a=starred_expression ')' { - RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "can't use starred expression here") } + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use starred expression here") } + | '(' a='**' expression ')' { + RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use double starred expression here") } invalid_import_from_targets: | import_from_as_names ',' NEWLINE { RAISE_SYNTAX_ERROR("trailing comma not allowed without surrounding parentheses") } + +invalid_with_stmt: + | [ASYNC] 'with' ','.(expression ['as' star_target])+ &&':' + | [ASYNC] 'with' '(' ','.(expressions ['as' star_target])+ ','? ')' &&':' +invalid_with_stmt_indent: + | [ASYNC] a='with' ','.(expression ['as' star_target])+ ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) } + | [ASYNC] a='with' '(' ','.(expressions ['as' star_target])+ ','? ')' ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'with' statement on line %d", a->lineno) } + +invalid_try_stmt: + | a='try' ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'try' statement on line %d", a->lineno) } + | 'try' ':' block !('except' | 'finally') { RAISE_SYNTAX_ERROR("expected 'except' or 'finally' block") } +invalid_except_stmt: + | 'except' a=expression ',' expressions ['as' NAME ] ':' { + RAISE_SYNTAX_ERROR_STARTING_FROM(a, "multiple exception types must be parenthesized") } + | a='except' expression ['as' NAME ] NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | a='except' NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } +invalid_finally_stmt: + | a='finally' ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'finally' statement on line %d", a->lineno) } +invalid_except_stmt_indent: + | a='except' expression ['as' NAME ] ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'except' statement on line %d", a->lineno) } + | a='except' ':' NEWLINE !INDENT { RAISE_SYNTAX_ERROR("expected an indented block after except statement on line %d", a->lineno) } +invalid_match_stmt: + | "match" subject_expr !':' { CHECK_VERSION(void*, 10, "Pattern matching is", RAISE_SYNTAX_ERROR("expected ':'") ) } + | a="match" subject=subject_expr ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'match' statement on line %d", a->lineno) } +invalid_case_block: + | "case" patterns guard? !':' { RAISE_SYNTAX_ERROR("expected ':'") } + | a="case" patterns guard? ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'case' statement on line %d", a->lineno) } +invalid_as_pattern: + | or_pattern 'as' a="_" { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "cannot use '_' as a target") } + | or_pattern 'as' !NAME a=expression { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "invalid pattern target") } +invalid_class_pattern: + | name_or_attr '(' a=invalid_class_argument_pattern { RAISE_SYNTAX_ERROR_KNOWN_RANGE( + PyPegen_first_item(a, pattern_ty), + PyPegen_last_item(a, pattern_ty), + "positional patterns follow keyword patterns") } +invalid_class_argument_pattern[asdl_pattern_seq*]: + | [positional_patterns ','] keyword_patterns ',' a=positional_patterns { a } +invalid_if_stmt: + | 'if' named_expression NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | a='if' a=named_expression ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'if' statement on line %d", a->lineno) } +invalid_elif_stmt: + | 'elif' named_expression NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | a='elif' named_expression ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'elif' statement on line %d", a->lineno) } +invalid_else_stmt: + | a='else' ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'else' statement on line %d", a->lineno) } +invalid_while_stmt: + | 'while' named_expression NEWLINE { RAISE_SYNTAX_ERROR("expected ':'") } + | a='while' named_expression ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'while' statement on line %d", a->lineno) } +invalid_for_stmt: + | [ASYNC] a='for' star_targets 'in' star_expressions ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after 'for' statement on line %d", a->lineno) } +invalid_def_raw: + | [ASYNC] a='def' NAME '(' [params] ')' ['->' expression] ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after function definition on line %d", a->lineno) } +invalid_class_def_raw: + | a='class' NAME ['('[arguments] ')'] ':' NEWLINE !INDENT { + RAISE_INDENTATION_ERROR("expected an indented block after class definition on line %d", a->lineno) } + +invalid_double_starred_kvpairs: + | ','.double_starred_kvpair+ ',' invalid_kvpair + | expression ':' a='*' bitwise_or { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") } + | expression a=':' &('}'|',') { RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") } +invalid_kvpair: + | a=expression !(':') { + RAISE_ERROR_KNOWN_LOCATION(p, PyExc_SyntaxError, a->lineno, a->end_col_offset - 1, a->end_lineno, -1, "':' expected after dictionary key") } + | expression ':' a='*' bitwise_or { RAISE_SYNTAX_ERROR_STARTING_FROM(a, "cannot use a starred expression in a dictionary value") } + | expression a=':' {RAISE_SYNTAX_ERROR_KNOWN_LOCATION(a, "expression expected after dictionary key and ':'") } diff --git a/Include/Python-ast.h b/Include/Python-ast.h deleted file mode 100644 index e7afa1e6..00000000 --- a/Include/Python-ast.h +++ /dev/null @@ -1,697 +0,0 @@ -/* File automatically generated by Parser/asdl_c.py. */ - -#ifndef Py_PYTHON_AST_H -#define Py_PYTHON_AST_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_LIMITED_API -#include "asdl.h" - -#undef Yield /* undefine macro conflicting with */ - -typedef struct _mod *mod_ty; - -typedef struct _stmt *stmt_ty; - -typedef struct _expr *expr_ty; - -typedef enum _expr_context { Load=1, Store=2, Del=3 } expr_context_ty; - -typedef enum _boolop { And=1, Or=2 } boolop_ty; - -typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7, - LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12, - FloorDiv=13 } operator_ty; - -typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; - -typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8, - In=9, NotIn=10 } cmpop_ty; - -typedef struct _comprehension *comprehension_ty; - -typedef struct _excepthandler *excepthandler_ty; - -typedef struct _arguments *arguments_ty; - -typedef struct _arg *arg_ty; - -typedef struct _keyword *keyword_ty; - -typedef struct _alias *alias_ty; - -typedef struct _withitem *withitem_ty; - -typedef struct _type_ignore *type_ignore_ty; - - -enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, - FunctionType_kind=4}; -struct _mod { - enum _mod_kind kind; - union { - struct { - asdl_seq *body; - asdl_seq *type_ignores; - } Module; - - struct { - asdl_seq *body; - } Interactive; - - struct { - expr_ty body; - } Expression; - - struct { - asdl_seq *argtypes; - expr_ty returns; - } FunctionType; - - } v; -}; - -enum _stmt_kind {FunctionDef_kind=1, AsyncFunctionDef_kind=2, ClassDef_kind=3, - Return_kind=4, Delete_kind=5, Assign_kind=6, - AugAssign_kind=7, AnnAssign_kind=8, For_kind=9, - AsyncFor_kind=10, While_kind=11, If_kind=12, With_kind=13, - AsyncWith_kind=14, Raise_kind=15, Try_kind=16, - Assert_kind=17, Import_kind=18, ImportFrom_kind=19, - Global_kind=20, Nonlocal_kind=21, Expr_kind=22, Pass_kind=23, - Break_kind=24, Continue_kind=25}; -struct _stmt { - enum _stmt_kind kind; - union { - struct { - identifier name; - arguments_ty args; - asdl_seq *body; - asdl_seq *decorator_list; - expr_ty returns; - string type_comment; - } FunctionDef; - - struct { - identifier name; - arguments_ty args; - asdl_seq *body; - asdl_seq *decorator_list; - expr_ty returns; - string type_comment; - } AsyncFunctionDef; - - struct { - identifier name; - asdl_seq *bases; - asdl_seq *keywords; - asdl_seq *body; - asdl_seq *decorator_list; - } ClassDef; - - struct { - expr_ty value; - } Return; - - struct { - asdl_seq *targets; - } Delete; - - struct { - asdl_seq *targets; - expr_ty value; - string type_comment; - } Assign; - - struct { - expr_ty target; - operator_ty op; - expr_ty value; - } AugAssign; - - struct { - expr_ty target; - expr_ty annotation; - expr_ty value; - int simple; - } AnnAssign; - - struct { - expr_ty target; - expr_ty iter; - asdl_seq *body; - asdl_seq *orelse; - string type_comment; - } For; - - struct { - expr_ty target; - expr_ty iter; - asdl_seq *body; - asdl_seq *orelse; - string type_comment; - } AsyncFor; - - struct { - expr_ty test; - asdl_seq *body; - asdl_seq *orelse; - } While; - - struct { - expr_ty test; - asdl_seq *body; - asdl_seq *orelse; - } If; - - struct { - asdl_seq *items; - asdl_seq *body; - string type_comment; - } With; - - struct { - asdl_seq *items; - asdl_seq *body; - string type_comment; - } AsyncWith; - - struct { - expr_ty exc; - expr_ty cause; - } Raise; - - struct { - asdl_seq *body; - asdl_seq *handlers; - asdl_seq *orelse; - asdl_seq *finalbody; - } Try; - - struct { - expr_ty test; - expr_ty msg; - } Assert; - - struct { - asdl_seq *names; - } Import; - - struct { - identifier module; - asdl_seq *names; - int level; - } ImportFrom; - - struct { - asdl_seq *names; - } Global; - - struct { - asdl_seq *names; - } Nonlocal; - - struct { - expr_ty value; - } Expr; - - } v; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_kind=4, - Lambda_kind=5, IfExp_kind=6, Dict_kind=7, Set_kind=8, - ListComp_kind=9, SetComp_kind=10, DictComp_kind=11, - GeneratorExp_kind=12, Await_kind=13, Yield_kind=14, - YieldFrom_kind=15, Compare_kind=16, Call_kind=17, - FormattedValue_kind=18, JoinedStr_kind=19, Constant_kind=20, - Attribute_kind=21, Subscript_kind=22, Starred_kind=23, - Name_kind=24, List_kind=25, Tuple_kind=26, Slice_kind=27}; -struct _expr { - enum _expr_kind kind; - union { - struct { - boolop_ty op; - asdl_seq *values; - } BoolOp; - - struct { - expr_ty target; - expr_ty value; - } NamedExpr; - - struct { - expr_ty left; - operator_ty op; - expr_ty right; - } BinOp; - - struct { - unaryop_ty op; - expr_ty operand; - } UnaryOp; - - struct { - arguments_ty args; - expr_ty body; - } Lambda; - - struct { - expr_ty test; - expr_ty body; - expr_ty orelse; - } IfExp; - - struct { - asdl_seq *keys; - asdl_seq *values; - } Dict; - - struct { - asdl_seq *elts; - } Set; - - struct { - expr_ty elt; - asdl_seq *generators; - } ListComp; - - struct { - expr_ty elt; - asdl_seq *generators; - } SetComp; - - struct { - expr_ty key; - expr_ty value; - asdl_seq *generators; - } DictComp; - - struct { - expr_ty elt; - asdl_seq *generators; - } GeneratorExp; - - struct { - expr_ty value; - } Await; - - struct { - expr_ty value; - } Yield; - - struct { - expr_ty value; - } YieldFrom; - - struct { - expr_ty left; - asdl_int_seq *ops; - asdl_seq *comparators; - } Compare; - - struct { - expr_ty func; - asdl_seq *args; - asdl_seq *keywords; - } Call; - - struct { - expr_ty value; - int conversion; - expr_ty format_spec; - } FormattedValue; - - struct { - asdl_seq *values; - } JoinedStr; - - struct { - constant value; - string kind; - } Constant; - - struct { - expr_ty value; - identifier attr; - expr_context_ty ctx; - } Attribute; - - struct { - expr_ty value; - expr_ty slice; - expr_context_ty ctx; - } Subscript; - - struct { - expr_ty value; - expr_context_ty ctx; - } Starred; - - struct { - identifier id; - expr_context_ty ctx; - } Name; - - struct { - asdl_seq *elts; - expr_context_ty ctx; - } List; - - struct { - asdl_seq *elts; - expr_context_ty ctx; - } Tuple; - - struct { - expr_ty lower; - expr_ty upper; - expr_ty step; - } Slice; - - } v; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -struct _comprehension { - expr_ty target; - expr_ty iter; - asdl_seq *ifs; - int is_async; -}; - -enum _excepthandler_kind {ExceptHandler_kind=1}; -struct _excepthandler { - enum _excepthandler_kind kind; - union { - struct { - expr_ty type; - identifier name; - asdl_seq *body; - } ExceptHandler; - - } v; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -struct _arguments { - asdl_seq *posonlyargs; - asdl_seq *args; - arg_ty vararg; - asdl_seq *kwonlyargs; - asdl_seq *kw_defaults; - arg_ty kwarg; - asdl_seq *defaults; -}; - -struct _arg { - identifier arg; - expr_ty annotation; - string type_comment; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -struct _keyword { - identifier arg; - expr_ty value; - int lineno; - int col_offset; - int end_lineno; - int end_col_offset; -}; - -struct _alias { - identifier name; - identifier asname; -}; - -struct _withitem { - expr_ty context_expr; - expr_ty optional_vars; -}; - -enum _type_ignore_kind {TypeIgnore_kind=1}; -struct _type_ignore { - enum _type_ignore_kind kind; - union { - struct { - int lineno; - string tag; - } TypeIgnore; - - } v; -}; - - -// Note: these macros affect function definitions, not only call sites. -#define Module(a0, a1, a2) _Py_Module(a0, a1, a2) -mod_ty _Py_Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena); -#define Interactive(a0, a1) _Py_Interactive(a0, a1) -mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); -#define Expression(a0, a1) _Py_Expression(a0, a1) -mod_ty _Py_Expression(expr_ty body, PyArena *arena); -#define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) -mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena); -#define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, - asdl_seq * decorator_list, expr_ty returns, string - type_comment, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) -stmt_ty _Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * - body, asdl_seq * decorator_list, expr_ty returns, - string type_comment, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena - *arena); -#define ClassDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, - asdl_seq * body, asdl_seq * decorator_list, int lineno, - int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define Return(a0, a1, a2, a3, a4, a5) _Py_Return(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena); -#define Delete(a0, a1, a2, a3, a4, a5) _Py_Delete(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Assign(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Assign(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, string type_comment, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define AugAssign(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AugAssign(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int - lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define AnnAssign(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_AnnAssign(a0, a1, a2, a3, a4, a5, a6, a7, a8) -stmt_ty _Py_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int - simple, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define For(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_For(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * - orelse, string type_comment, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) -stmt_ty _Py_AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * - orelse, string type_comment, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); -#define While(a0, a1, a2, a3, a4, a5, a6, a7) _Py_While(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define If(a0, a1, a2, a3, a4, a5, a6, a7) _Py_If(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, - int col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define With(a0, a1, a2, a3, a4, a5, a6, a7) _Py_With(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, string type_comment, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define AsyncWith(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AsyncWith(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Raise(a0, a1, a2, a3, a4, a5, a6) _Py_Raise(a0, a1, a2, a3, a4, a5, a6) -stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Try(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_Try(a0, a1, a2, a3, a4, a5, a6, a7, a8) -stmt_ty _Py_Try(asdl_seq * body, asdl_seq * handlers, asdl_seq * orelse, - asdl_seq * finalbody, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Assert(a0, a1, a2, a3, a4, a5, a6) _Py_Assert(a0, a1, a2, a3, a4, a5, a6) -stmt_ty _Py_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Import(a0, a1, a2, a3, a4, a5) _Py_Import(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Import(asdl_seq * names, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define ImportFrom(a0, a1, a2, a3, a4, a5, a6, a7) _Py_ImportFrom(a0, a1, a2, a3, a4, a5, a6, a7) -stmt_ty _Py_ImportFrom(identifier module, asdl_seq * names, int level, int - lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Global(a0, a1, a2, a3, a4, a5) _Py_Global(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Global(asdl_seq * names, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Nonlocal(a0, a1, a2, a3, a4, a5) _Py_Nonlocal(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Nonlocal(asdl_seq * names, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Expr(a0, a1, a2, a3, a4, a5) _Py_Expr(a0, a1, a2, a3, a4, a5) -stmt_ty _Py_Expr(expr_ty value, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Pass(a0, a1, a2, a3, a4) _Py_Pass(a0, a1, a2, a3, a4) -stmt_ty _Py_Pass(int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Break(a0, a1, a2, a3, a4) _Py_Break(a0, a1, a2, a3, a4) -stmt_ty _Py_Break(int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Continue(a0, a1, a2, a3, a4) _Py_Continue(a0, a1, a2, a3, a4) -stmt_ty _Py_Continue(int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define BoolOp(a0, a1, a2, a3, a4, a5, a6) _Py_BoolOp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); -#define NamedExpr(a0, a1, a2, a3, a4, a5, a6) _Py_NamedExpr(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_NamedExpr(expr_ty target, expr_ty value, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define BinOp(a0, a1, a2, a3, a4, a5, a6, a7) _Py_BinOp(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define UnaryOp(a0, a1, a2, a3, a4, a5, a6) _Py_UnaryOp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); -#define Lambda(a0, a1, a2, a3, a4, a5, a6) _Py_Lambda(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Lambda(arguments_ty args, expr_ty body, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); -#define IfExp(a0, a1, a2, a3, a4, a5, a6, a7) _Py_IfExp(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define Dict(a0, a1, a2, a3, a4, a5, a6) _Py_Dict(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Dict(asdl_seq * keys, asdl_seq * values, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define Set(a0, a1, a2, a3, a4, a5) _Py_Set(a0, a1, a2, a3, a4, a5) -expr_ty _Py_Set(asdl_seq * elts, int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena); -#define ListComp(a0, a1, a2, a3, a4, a5, a6) _Py_ListComp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_ListComp(expr_ty elt, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define SetComp(a0, a1, a2, a3, a4, a5, a6) _Py_SetComp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_SetComp(expr_ty elt, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define DictComp(a0, a1, a2, a3, a4, a5, a6, a7) _Py_DictComp(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_DictComp(expr_ty key, expr_ty value, asdl_seq * generators, int - lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define GeneratorExp(a0, a1, a2, a3, a4, a5, a6) _Py_GeneratorExp(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_GeneratorExp(expr_ty elt, asdl_seq * generators, int lineno, int - col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define Await(a0, a1, a2, a3, a4, a5) _Py_Await(a0, a1, a2, a3, a4, a5) -expr_ty _Py_Await(expr_ty value, int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena); -#define Yield(a0, a1, a2, a3, a4, a5) _Py_Yield(a0, a1, a2, a3, a4, a5) -expr_ty _Py_Yield(expr_ty value, int lineno, int col_offset, int end_lineno, - int end_col_offset, PyArena *arena); -#define YieldFrom(a0, a1, a2, a3, a4, a5) _Py_YieldFrom(a0, a1, a2, a3, a4, a5) -expr_ty _Py_YieldFrom(expr_ty value, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Compare(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Compare(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Compare(expr_ty left, asdl_int_seq * ops, asdl_seq * comparators, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Call(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Call(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Call(expr_ty func, asdl_seq * args, asdl_seq * keywords, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) _Py_FormattedValue(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_FormattedValue(expr_ty value, int conversion, expr_ty format_spec, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define JoinedStr(a0, a1, a2, a3, a4, a5) _Py_JoinedStr(a0, a1, a2, a3, a4, a5) -expr_ty _Py_JoinedStr(asdl_seq * values, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena); -#define Constant(a0, a1, a2, a3, a4, a5, a6) _Py_Constant(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Constant(constant value, string kind, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); -#define Attribute(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Attribute(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, int - lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Subscript(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Subscript(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int - lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define Starred(a0, a1, a2, a3, a4, a5, a6) _Py_Starred(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Starred(expr_ty value, expr_context_ty ctx, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define Name(a0, a1, a2, a3, a4, a5, a6) _Py_Name(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Name(identifier id, expr_context_ty ctx, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define List(a0, a1, a2, a3, a4, a5, a6) _Py_List(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_List(asdl_seq * elts, expr_context_ty ctx, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define Tuple(a0, a1, a2, a3, a4, a5, a6) _Py_Tuple(a0, a1, a2, a3, a4, a5, a6) -expr_ty _Py_Tuple(asdl_seq * elts, expr_context_ty ctx, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define Slice(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Slice(a0, a1, a2, a3, a4, a5, a6, a7) -expr_ty _Py_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define comprehension(a0, a1, a2, a3, a4) _Py_comprehension(a0, a1, a2, a3, a4) -comprehension_ty _Py_comprehension(expr_ty target, expr_ty iter, asdl_seq * - ifs, int is_async, PyArena *arena); -#define ExceptHandler(a0, a1, a2, a3, a4, a5, a6, a7) _Py_ExceptHandler(a0, a1, a2, a3, a4, a5, a6, a7) -excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq * - body, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena - *arena); -#define arguments(a0, a1, a2, a3, a4, a5, a6, a7) _Py_arguments(a0, a1, a2, a3, a4, a5, a6, a7) -arguments_ty _Py_arguments(asdl_seq * posonlyargs, asdl_seq * args, arg_ty - vararg, asdl_seq * kwonlyargs, asdl_seq * - kw_defaults, arg_ty kwarg, asdl_seq * defaults, - PyArena *arena); -#define arg(a0, a1, a2, a3, a4, a5, a6, a7) _Py_arg(a0, a1, a2, a3, a4, a5, a6, a7) -arg_ty _Py_arg(identifier arg, expr_ty annotation, string type_comment, int - lineno, int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define keyword(a0, a1, a2, a3, a4, a5, a6) _Py_keyword(a0, a1, a2, a3, a4, a5, a6) -keyword_ty _Py_keyword(identifier arg, expr_ty value, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); -#define alias(a0, a1, a2) _Py_alias(a0, a1, a2) -alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); -#define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) -withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena - *arena); -#define TypeIgnore(a0, a1, a2) _Py_TypeIgnore(a0, a1, a2) -type_ignore_ty _Py_TypeIgnore(int lineno, string tag, PyArena *arena); - -PyObject* PyAST_mod2obj(mod_ty t); -mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); -int PyAST_Check(PyObject* obj); -#endif /* !Py_LIMITED_API */ - -#ifdef __cplusplus -} -#endif -#endif /* !Py_PYTHON_AST_H */ diff --git a/Include/Python.h b/Include/Python.h index 7f7ed598..04858f28 100644 --- a/Include/Python.h +++ b/Include/Python.h @@ -35,6 +35,19 @@ #ifndef MS_WINDOWS #include #endif +#ifdef HAVE_CRYPT_H +#if defined(HAVE_CRYPT_R) && !defined(_GNU_SOURCE) +/* Required for glibc to expose the crypt_r() function prototype. */ +# define _GNU_SOURCE +# define _Py_GNU_SOURCE_FOR_CRYPT +#endif +#include +#ifdef _Py_GNU_SOURCE_FOR_CRYPT +/* Don't leak the _GNU_SOURCE define to other headers. */ +# undef _GNU_SOURCE +# undef _Py_GNU_SOURCE_FOR_CRYPT +#endif +#endif /* For size_t? */ #ifdef HAVE_STDDEF_H @@ -68,17 +81,7 @@ # endif #endif -/* Debug-mode build with pymalloc implies PYMALLOC_DEBUG. - * PYMALLOC_DEBUG is in error if pymalloc is not in use. - */ -#if defined(Py_DEBUG) && defined(WITH_PYMALLOC) && !defined(PYMALLOC_DEBUG) -#define PYMALLOC_DEBUG -#endif -#if defined(PYMALLOC_DEBUG) && !defined(WITH_PYMALLOC) -#error "PYMALLOC_DEBUG requires WITH_PYMALLOC" -#endif #include "pymath.h" -#include "pytime.h" #include "pymem.h" #include "object.h" @@ -86,7 +89,7 @@ #include "typeslots.h" #include "pyhash.h" -#include "pydebug.h" +#include "cpython/pydebug.h" #include "bytearrayobject.h" #include "bytesobject.h" @@ -101,7 +104,7 @@ #include "tupleobject.h" #include "listobject.h" #include "dictobject.h" -#include "odictobject.h" +#include "cpython/odictobject.h" #include "enumobject.h" #include "setobject.h" #include "methodobject.h" @@ -116,7 +119,6 @@ #include "sliceobject.h" #include "cellobject.h" #include "iterobject.h" -#include "cpython/initconfig.h" #include "genobject.h" #include "descrobject.h" #include "genericaliasobject.h" @@ -124,15 +126,17 @@ #include "weakrefobject.h" #include "structseq.h" #include "namespaceobject.h" -#include "picklebufobject.h" +#include "cpython/picklebufobject.h" +#include "cpython/pytime.h" #include "codecs.h" #include "pyerrors.h" + +#include "cpython/initconfig.h" #include "pythread.h" #include "pystate.h" #include "context.h" -#include "pyarena.h" #include "modsupport.h" #include "compile.h" #include "pythonrun.h" @@ -148,11 +152,11 @@ #include "eval.h" -#include "pyctype.h" +#include "cpython/pyctype.h" #include "pystrtod.h" #include "pystrcmp.h" #include "fileutils.h" -#include "pyfpe.h" +#include "cpython/pyfpe.h" #include "tracemalloc.h" #endif /* !Py_PYTHON_H */ diff --git a/Include/README.rst b/Include/README.rst new file mode 100644 index 00000000..f52e690e --- /dev/null +++ b/Include/README.rst @@ -0,0 +1,12 @@ +The Python C API +================ + +The C API is divided into three sections: + +1. ``Include/``: Limited API +2. ``Include/cpython/``: CPython implementation details +3. ``Include/internal/``: The internal API + +Information on changing the C API is available `in the developer guide`_ + +.. _in the developer guide: https://devguide.python.org/c-api/ diff --git a/Include/abstract.h b/Include/abstract.h index d31d66e6..e8d3f929 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -318,7 +318,7 @@ PyAPI_FUNC(int) PyObject_DelItem(PyObject *o, PyObject *key); /* Takes an arbitrary object which must support the (character, single segment) buffer interface and returns a pointer to a read-only memory location - usable as character based input for subsequent processing. + useable as character based input for subsequent processing. Return 0 on success. buffer and buffer_len are only set in case no error occurs. Otherwise, -1 is returned and an exception set. */ @@ -371,11 +371,21 @@ PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj, returns itself. */ PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *); -/* Returns 1 if the object 'obj' provides iterator protocols, and 0 otherwise. +/* Takes an AsyncIterable object and returns an AsyncIterator for it. + This is typically a new iterator but if the argument is an AsyncIterator, + this returns itself. */ +PyAPI_FUNC(PyObject *) PyObject_GetAIter(PyObject *); + +/* Returns non-zero if the object 'obj' provides iterator protocols, and 0 otherwise. This function always succeeds. */ PyAPI_FUNC(int) PyIter_Check(PyObject *); +/* Returns non-zero if the object 'obj' provides AsyncIterator protocols, and 0 otherwise. + + This function always succeeds. */ +PyAPI_FUNC(int) PyAIter_Check(PyObject *); + /* Takes an iterator object and calls its tp_iternext slot, returning the next value. @@ -385,6 +395,19 @@ PyAPI_FUNC(int) PyIter_Check(PyObject *); NULL with an exception means an error occurred. */ PyAPI_FUNC(PyObject *) PyIter_Next(PyObject *); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 + +/* Takes generator, coroutine or iterator object and sends the value into it. + Returns: + - PYGEN_RETURN (0) if generator has returned. + 'result' parameter is filled with return value + - PYGEN_ERROR (-1) if exception was raised. + 'result' parameter is NULL + - PYGEN_NEXT (1) if generator has yielded. + 'result' parameter is filled with yielded value. */ +PyAPI_FUNC(PySendResult) PyIter_Send(PyObject *, PyObject *, PyObject **); +#endif + /* === Number Protocol ================================================== */ diff --git a/Include/asdl.h b/Include/asdl.h deleted file mode 100644 index e962560b..00000000 --- a/Include/asdl.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef Py_LIMITED_API -#ifndef Py_ASDL_H -#define Py_ASDL_H - -typedef PyObject * identifier; -typedef PyObject * string; -typedef PyObject * object; -typedef PyObject * constant; - -/* It would be nice if the code generated by asdl_c.py was completely - independent of Python, but it is a goal the requires too much work - at this stage. So, for example, I'll represent identifiers as - interned Python strings. -*/ - -/* XXX A sequence should be typed so that its use can be typechecked. */ - -typedef struct { - Py_ssize_t size; - void *elements[1]; -} asdl_seq; - -typedef struct { - Py_ssize_t size; - int elements[1]; -} asdl_int_seq; - -asdl_seq *_Py_asdl_seq_new(Py_ssize_t size, PyArena *arena); -asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); - -#define asdl_seq_GET(S, I) (S)->elements[(I)] -#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) -#ifdef Py_DEBUG -#define asdl_seq_SET(S, I, V) \ - do { \ - Py_ssize_t _asdl_i = (I); \ - assert((S) != NULL); \ - assert(0 <= _asdl_i && _asdl_i < (S)->size); \ - (S)->elements[_asdl_i] = (V); \ - } while (0) -#else -#define asdl_seq_SET(S, I, V) (S)->elements[I] = (V) -#endif - -#endif /* !Py_ASDL_H */ -#endif /* Py_LIMITED_API */ diff --git a/Include/ast.h b/Include/ast.h deleted file mode 100644 index a8c52af7..00000000 --- a/Include/ast.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef Py_LIMITED_API -#ifndef Py_AST_H -#define Py_AST_H -#ifdef __cplusplus -extern "C" { -#endif - -#include "Python-ast.h" /* mod_ty */ -#include "node.h" /* node */ - -PyAPI_FUNC(int) PyAST_Validate(mod_ty); -PyAPI_FUNC(mod_ty) PyAST_FromNode( - const node *n, - PyCompilerFlags *flags, - const char *filename, /* decoded from the filesystem encoding */ - PyArena *arena); -PyAPI_FUNC(mod_ty) PyAST_FromNodeObject( - const node *n, - PyCompilerFlags *flags, - PyObject *filename, - PyArena *arena); - -/* _PyAST_ExprAsUnicode is defined in ast_unparse.c */ -PyAPI_FUNC(PyObject *) _PyAST_ExprAsUnicode(expr_ty); - -/* Return the borrowed reference to the first literal string in the - sequence of statements or NULL if it doesn't start from a literal string. - Doesn't set exception. */ -PyAPI_FUNC(PyObject *) _PyAST_GetDocString(asdl_seq *); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_AST_H */ -#endif /* !Py_LIMITED_API */ diff --git a/Include/bitset.h b/Include/bitset.h deleted file mode 100644 index 6a2ac978..00000000 --- a/Include/bitset.h +++ /dev/null @@ -1,23 +0,0 @@ - -#ifndef Py_BITSET_H -#define Py_BITSET_H -#ifdef __cplusplus -extern "C" { -#endif - -/* Bitset interface */ - -#define BYTE char -typedef BYTE *bitset; - -#define testbit(ss, ibit) (((ss)[BIT2BYTE(ibit)] & BIT2MASK(ibit)) != 0) - -#define BITSPERBYTE (8*sizeof(BYTE)) -#define BIT2BYTE(ibit) ((ibit) / BITSPERBYTE) -#define BIT2SHIFT(ibit) ((ibit) % BITSPERBYTE) -#define BIT2MASK(ibit) (1 << BIT2SHIFT(ibit)) - -#ifdef __cplusplus -} -#endif -#endif /* !Py_BITSET_H */ diff --git a/Include/boolobject.h b/Include/boolobject.h index bb8044a2..cda6f89a 100644 --- a/Include/boolobject.h +++ b/Include/boolobject.h @@ -15,15 +15,24 @@ PyAPI_DATA(PyTypeObject) PyBool_Type; Don't forget to apply Py_INCREF() when returning either!!! */ /* Don't use these directly */ -PyAPI_DATA(struct _longobject) _Py_FalseStruct, _Py_TrueStruct; +PyAPI_DATA(struct _longobject) _Py_FalseStruct; +PyAPI_DATA(struct _longobject) _Py_TrueStruct; /* Use these macros */ #define Py_False ((PyObject *) &_Py_FalseStruct) #define Py_True ((PyObject *) &_Py_TrueStruct) +// Test if an object is the True singleton, the same as "x is True" in Python. +PyAPI_FUNC(int) Py_IsTrue(PyObject *x); +#define Py_IsTrue(x) Py_Is((x), Py_True) + +// Test if an object is the False singleton, the same as "x is False" in Python. +PyAPI_FUNC(int) Py_IsFalse(PyObject *x); +#define Py_IsFalse(x) Py_Is((x), Py_False) + /* Macros for returning Py_True or Py_False, respectively */ -#define Py_RETURN_TRUE return Py_INCREF(Py_True), Py_True -#define Py_RETURN_FALSE return Py_INCREF(Py_False), Py_False +#define Py_RETURN_TRUE return Py_NewRef(Py_True) +#define Py_RETURN_FALSE return Py_NewRef(Py_False) /* Function to return a bool from a C long */ PyAPI_FUNC(PyObject *) PyBool_FromLong(long); diff --git a/Include/bytesobject.h b/Include/bytesobject.h index 5062d8d1..39c241a2 100644 --- a/Include/bytesobject.h +++ b/Include/bytesobject.h @@ -1,5 +1,5 @@ -/* Bytes (String) object interface */ +/* Bytes object interface */ #ifndef Py_BYTESOBJECT_H #define Py_BYTESOBJECT_H @@ -10,23 +10,20 @@ extern "C" { #include /* -Type PyBytesObject represents a character string. An extra zero byte is +Type PyBytesObject represents a byte string. An extra zero byte is reserved at the end to ensure it is zero-terminated, but a size is present so strings with null bytes in them can be represented. This is an immutable object type. -There are functions to create new string objects, to test -an object for string-ness, and to get the -string value. The latter function returns a null pointer +There are functions to create new bytes objects, to test +an object for bytes-ness, and to get the +byte string value. The latter function returns a null pointer if the object is not of the proper type. There is a variant that takes an explicit size as well as a variant that assumes a zero-terminated string. Note that none of the -functions should be applied to nil objects. +functions should be applied to NULL pointer. */ -/* Caching the hash (ob_shash) saves recalculation of a string's hash value. - This significantly speeds up dict lookups. */ - PyAPI_DATA(PyTypeObject) PyBytes_Type; PyAPI_DATA(PyTypeObject) PyBytesIter_Type; @@ -50,26 +47,16 @@ PyAPI_FUNC(PyObject *) PyBytes_DecodeEscape(const char *, Py_ssize_t, const char *, Py_ssize_t, const char *); -/* Provides access to the internal data buffer and size of a string - object or the default encoded version of a Unicode object. Passing - NULL as *len parameter will force the string buffer to be - 0-terminated (passing a string with embedded NULL characters will +/* Provides access to the internal data buffer and size of a bytes object. + Passing NULL as len parameter will force the string buffer to be + 0-terminated (passing a string with embedded NUL characters will cause an exception). */ PyAPI_FUNC(int) PyBytes_AsStringAndSize( - PyObject *obj, /* string or Unicode object */ + PyObject *obj, /* bytes object */ char **s, /* pointer to buffer variable */ - Py_ssize_t *len /* pointer to length variable or NULL - (only possible for 0-terminated - strings) */ + Py_ssize_t *len /* pointer to length variable or NULL */ ); -/* Flags used by string formatting */ -#define F_LJUST (1<<0) -#define F_SIGN (1<<1) -#define F_BLANK (1<<2) -#define F_ALT (1<<3) -#define F_ZERO (1<<4) - #ifndef Py_LIMITED_API # define Py_CPYTHON_BYTESOBJECT_H # include "cpython/bytesobject.h" diff --git a/Include/cellobject.h b/Include/cellobject.h index f12aa90a..81bc784d 100644 --- a/Include/cellobject.h +++ b/Include/cellobject.h @@ -20,7 +20,7 @@ PyAPI_FUNC(PyObject *) PyCell_Get(PyObject *); PyAPI_FUNC(int) PyCell_Set(PyObject *, PyObject *); #define PyCell_GET(op) (((PyCellObject *)(op))->ob_ref) -#define PyCell_SET(op, v) (((PyCellObject *)(op))->ob_ref = v) +#define PyCell_SET(op, v) ((void)(((PyCellObject *)(op))->ob_ref = v)) #ifdef __cplusplus } diff --git a/Include/ceval.h b/Include/ceval.h index 0f372e20..0f687666 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -67,14 +67,6 @@ PyAPI_FUNC(int) Py_GetRecursionLimit(void); PyAPI_FUNC(int) Py_EnterRecursiveCall(const char *where); PyAPI_FUNC(void) Py_LeaveRecursiveCall(void); -#define Py_ALLOW_RECURSION \ - do { unsigned char _old = PyThreadState_GET()->recursion_critical;\ - PyThreadState_GET()->recursion_critical = 1; - -#define Py_END_ALLOW_RECURSION \ - PyThreadState_GET()->recursion_critical = _old; \ - } while(0); - PyAPI_FUNC(const char *) PyEval_GetFuncName(PyObject *); PyAPI_FUNC(const char *) PyEval_GetFuncDesc(PyObject *); diff --git a/Include/codecs.h b/Include/codecs.h index 3ad0f2b5..37ecfb4a 100644 --- a/Include/codecs.h +++ b/Include/codecs.h @@ -27,6 +27,14 @@ PyAPI_FUNC(int) PyCodec_Register( PyObject *search_function ); +/* Unregister a codec search function and clear the registry's cache. + If the search function is not registered, do nothing. + Return 0 on success. Raise an exception and return -1 on error. */ + +PyAPI_FUNC(int) PyCodec_Unregister( + PyObject *search_function + ); + /* Codec registry lookup API. Looks up the given encoding and returns a CodecInfo object with diff --git a/Include/compile.h b/Include/compile.h index 98adee3d..3c5acd72 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -1,109 +1,9 @@ #ifndef Py_COMPILE_H #define Py_COMPILE_H - -#ifndef Py_LIMITED_API - #ifdef __cplusplus extern "C" { #endif -/* Public interface */ -struct _node; /* Declare the existence of this type */ -#ifndef Py_BUILD_CORE -Py_DEPRECATED(3.9) -#endif -PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); -/* XXX (ncoghlan): Unprefixed type name in a public API! */ - -#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ - CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ - CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ - CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) -#define PyCF_MASK_OBSOLETE (CO_NESTED) - -/* bpo-39562: CO_FUTURE_ and PyCF_ constants must be kept unique. - PyCF_ constants can use bits from 0x0100 to 0x10000. - CO_FUTURE_ constants use bits starting at 0x20000. */ -#define PyCF_SOURCE_IS_UTF8 0x0100 -#define PyCF_DONT_IMPLY_DEDENT 0x0200 -#define PyCF_ONLY_AST 0x0400 -#define PyCF_IGNORE_COOKIE 0x0800 -#define PyCF_TYPE_COMMENTS 0x1000 -#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 -#define PyCF_COMPILE_MASK (PyCF_ONLY_AST | PyCF_ALLOW_TOP_LEVEL_AWAIT | \ - PyCF_TYPE_COMMENTS | PyCF_DONT_IMPLY_DEDENT) - -#ifndef Py_LIMITED_API -typedef struct { - int cf_flags; /* bitmask of CO_xxx flags relevant to future */ - int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ -} PyCompilerFlags; - -#define _PyCompilerFlags_INIT \ - (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} -#endif - -/* Future feature support */ - -typedef struct { - int ff_features; /* flags set by future statements */ - int ff_lineno; /* line number of last future statement */ -} PyFutureFeatures; - -#define FUTURE_NESTED_SCOPES "nested_scopes" -#define FUTURE_GENERATORS "generators" -#define FUTURE_DIVISION "division" -#define FUTURE_ABSOLUTE_IMPORT "absolute_import" -#define FUTURE_WITH_STATEMENT "with_statement" -#define FUTURE_PRINT_FUNCTION "print_function" -#define FUTURE_UNICODE_LITERALS "unicode_literals" -#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" -#define FUTURE_GENERATOR_STOP "generator_stop" -#define FUTURE_ANNOTATIONS "annotations" - -struct _mod; /* Declare the existence of this type */ -#define PyAST_Compile(mod, s, f, ar) PyAST_CompileEx(mod, s, f, -1, ar) -PyAPI_FUNC(PyCodeObject *) PyAST_CompileEx( - struct _mod *mod, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags, - int optimize, - PyArena *arena); -PyAPI_FUNC(PyCodeObject *) PyAST_CompileObject( - struct _mod *mod, - PyObject *filename, - PyCompilerFlags *flags, - int optimize, - PyArena *arena); -PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromAST( - struct _mod * mod, - const char *filename /* decoded from the filesystem encoding */ - ); -PyAPI_FUNC(PyFutureFeatures *) PyFuture_FromASTObject( - struct _mod * mod, - PyObject *filename - ); - -/* _Py_Mangle is defined in compile.c */ -PyAPI_FUNC(PyObject*) _Py_Mangle(PyObject *p, PyObject *name); - -#define PY_INVALID_STACK_EFFECT INT_MAX -PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); -PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); - -typedef struct { - int optimize; - int ff_features; -} _PyASTOptimizeState; - -PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeState *state); - -#ifdef __cplusplus -} -#endif - -#endif /* !Py_LIMITED_API */ - /* These definitions must match corresponding definitions in graminit.h. */ #define Py_single_input 256 #define Py_file_input 257 @@ -113,4 +13,13 @@ PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, _PyASTOptimizeSta /* This doesn't need to match anything */ #define Py_fstring_input 800 +#ifndef Py_LIMITED_API +# define Py_CPYTHON_COMPILE_H +# include "cpython/compile.h" +# undef Py_CPYTHON_COMPILE_H +#endif + +#ifdef __cplusplus +} +#endif #endif /* !Py_COMPILE_H */ diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 0f1304d2..db850219 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - /* === Object Protocol ================================================== */ #ifdef PY_SSIZE_T_CLEAN @@ -123,7 +119,7 @@ static inline PyObject * PyObject_Vectorcall(PyObject *callable, PyObject *const *args, size_t nargsf, PyObject *kwnames) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_VectorcallTstate(tstate, callable, args, nargsf, kwnames); } @@ -159,7 +155,7 @@ _PyObject_FastCallTstate(PyThreadState *tstate, PyObject *func, PyObject *const static inline PyObject * _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_FastCallTstate(tstate, func, args, nargs); } @@ -168,7 +164,7 @@ _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs) PyObject_CallNoArgs(). */ static inline PyObject * _PyObject_CallNoArg(PyObject *func) { - PyThreadState *tstate = PyThreadState_GET(); + PyThreadState *tstate = PyThreadState_Get(); return _PyObject_VectorcallTstate(tstate, func, NULL, 0, NULL); } @@ -183,7 +179,7 @@ PyObject_CallOneArg(PyObject *func, PyObject *arg) assert(arg != NULL); args = _args + 1; // For PY_VECTORCALL_ARGUMENTS_OFFSET args[0] = arg; - tstate = PyThreadState_GET(); + tstate = PyThreadState_Get(); nargsf = 1 | PY_VECTORCALL_ARGUMENTS_OFFSET; return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL); } @@ -329,12 +325,6 @@ PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf, /* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */ PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view); -/* ==== Iterators ================================================ */ - -#define PyIter_Check(obj) \ - (Py_TYPE(obj)->tp_iternext != NULL && \ - Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented) - /* === Sequence protocol ================================================ */ /* Assume tp_as_sequence and sq_item exist and that 'i' does not @@ -379,6 +369,5 @@ PyAPI_FUNC(void) _Py_add_one_to_index_C(int nd, Py_ssize_t *index, /* Convert Python int to Py_ssize_t. Do nothing if the argument is None. */ PyAPI_FUNC(int) _Py_convert_optional_to_ssize_t(PyObject *, void *); -#ifdef __cplusplus -} -#endif +/* Same as PyNumber_Index but can return an instance of a subclass of int. */ +PyAPI_FUNC(PyObject *) _PyNumber_Index(PyObject *o); diff --git a/Include/cpython/bytesobject.h b/Include/cpython/bytesobject.h index f284c583..6b3f5522 100644 --- a/Include/cpython/bytesobject.h +++ b/Include/cpython/bytesobject.h @@ -10,7 +10,7 @@ typedef struct { /* Invariants: * ob_sval contains space for 'ob_size+1' elements. * ob_sval[ob_size] == 0. - * ob_shash is the hash of the string or -1 if not computed yet. + * ob_shash is the hash of the byte string or -1 if not computed yet. */ } PyBytesObject; diff --git a/Include/cpython/ceval.h b/Include/cpython/ceval.h index e1922a67..06338928 100644 --- a/Include/cpython/ceval.h +++ b/Include/cpython/ceval.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); PyAPI_DATA(int) _PyEval_SetProfile(PyThreadState *tstate, Py_tracefunc func, PyObject *arg); PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); @@ -32,7 +28,3 @@ PyAPI_FUNC(Py_ssize_t) _PyEval_RequestCodeExtraIndex(freefunc); PyAPI_FUNC(int) _PyEval_SliceIndex(PyObject *, Py_ssize_t *); PyAPI_FUNC(int) _PyEval_SliceIndexNotNone(PyObject *, Py_ssize_t *); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/code.h b/Include/cpython/code.h index cda28ac6..fa640852 100644 --- a/Include/cpython/code.h +++ b/Include/cpython/code.h @@ -38,7 +38,7 @@ struct PyCodeObject { Py_ssize_t *co_cell2arg; /* Maps cell vars which are arguments. */ PyObject *co_filename; /* unicode (where it was loaded from) */ PyObject *co_name; /* unicode (name, for reference) */ - PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See + PyObject *co_linetable; /* string (encoding addr<->lineno mapping) See Objects/lnotab_notes.txt for details. */ void *co_zombieframe; /* for optimization only (see frameobject.c) */ PyObject *co_weakreflist; /* to support weakrefs to code objects */ @@ -135,16 +135,23 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno); PyAPI_FUNC(int) PyCode_Addr2Line(PyCodeObject *, int); /* for internal use only */ -typedef struct _addr_pair { - int ap_lower; - int ap_upper; -} PyAddrPair; +struct _opaque { + int computed_line; + const char *lo_next; + const char *limit; +}; + +typedef struct _line_offsets { + int ar_start; + int ar_end; + int ar_line; + struct _opaque opaque; +} PyCodeAddressRange; /* Update *bounds to describe the first and one-past-the-last instructions in the same line as lasti. Return the number of that line. */ -PyAPI_FUNC(int) _PyCode_CheckLineNumber(PyCodeObject* co, - int lasti, PyAddrPair *bounds); +PyAPI_FUNC(int) _PyCode_CheckLineNumber(int lasti, PyCodeAddressRange *bounds); /* Create a comparable key used to compare constants taking in account the * object type. It is used to make sure types are not coerced (e.g., float and @@ -163,3 +170,15 @@ PyAPI_FUNC(int) _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra); PyAPI_FUNC(int) _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra); + +/** API for initializing the line number table. */ +int _PyCode_InitAddressRange(PyCodeObject* co, PyCodeAddressRange *bounds); + +/** Out of process API for initializing the line number table. */ +void PyLineTable_InitAddressRange(const char *linetable, Py_ssize_t length, int firstlineno, PyCodeAddressRange *range); + +/** API for traversing the line number table. */ +int PyLineTable_NextAddressRange(PyCodeAddressRange *range); +int PyLineTable_PreviousAddressRange(PyCodeAddressRange *range); + + diff --git a/Include/cpython/compile.h b/Include/cpython/compile.h new file mode 100644 index 00000000..a202c0b0 --- /dev/null +++ b/Include/cpython/compile.h @@ -0,0 +1,52 @@ +#ifndef Py_CPYTHON_COMPILE_H +# error "this header file must not be included directly" +#endif + +/* Public interface */ +#define PyCF_MASK (CO_FUTURE_DIVISION | CO_FUTURE_ABSOLUTE_IMPORT | \ + CO_FUTURE_WITH_STATEMENT | CO_FUTURE_PRINT_FUNCTION | \ + CO_FUTURE_UNICODE_LITERALS | CO_FUTURE_BARRY_AS_BDFL | \ + CO_FUTURE_GENERATOR_STOP | CO_FUTURE_ANNOTATIONS) +#define PyCF_MASK_OBSOLETE (CO_NESTED) + +/* bpo-39562: CO_FUTURE_ and PyCF_ constants must be kept unique. + PyCF_ constants can use bits from 0x0100 to 0x10000. + CO_FUTURE_ constants use bits starting at 0x20000. */ +#define PyCF_SOURCE_IS_UTF8 0x0100 +#define PyCF_DONT_IMPLY_DEDENT 0x0200 +#define PyCF_ONLY_AST 0x0400 +#define PyCF_IGNORE_COOKIE 0x0800 +#define PyCF_TYPE_COMMENTS 0x1000 +#define PyCF_ALLOW_TOP_LEVEL_AWAIT 0x2000 +#define PyCF_COMPILE_MASK (PyCF_ONLY_AST | PyCF_ALLOW_TOP_LEVEL_AWAIT | \ + PyCF_TYPE_COMMENTS | PyCF_DONT_IMPLY_DEDENT) + +typedef struct { + int cf_flags; /* bitmask of CO_xxx flags relevant to future */ + int cf_feature_version; /* minor Python version (PyCF_ONLY_AST) */ +} PyCompilerFlags; + +#define _PyCompilerFlags_INIT \ + (PyCompilerFlags){.cf_flags = 0, .cf_feature_version = PY_MINOR_VERSION} + +/* Future feature support */ + +typedef struct { + int ff_features; /* flags set by future statements */ + int ff_lineno; /* line number of last future statement */ +} PyFutureFeatures; + +#define FUTURE_NESTED_SCOPES "nested_scopes" +#define FUTURE_GENERATORS "generators" +#define FUTURE_DIVISION "division" +#define FUTURE_ABSOLUTE_IMPORT "absolute_import" +#define FUTURE_WITH_STATEMENT "with_statement" +#define FUTURE_PRINT_FUNCTION "print_function" +#define FUTURE_UNICODE_LITERALS "unicode_literals" +#define FUTURE_BARRY_AS_BDFL "barry_as_FLUFL" +#define FUTURE_GENERATOR_STOP "generator_stop" +#define FUTURE_ANNOTATIONS "annotations" + +#define PY_INVALID_STACK_EFFECT INT_MAX +PyAPI_FUNC(int) PyCompile_OpcodeStackEffect(int opcode, int oparg); +PyAPI_FUNC(int) PyCompile_OpcodeStackEffectWithJump(int opcode, int oparg, int jump); diff --git a/Include/cpython/dictobject.h b/Include/cpython/dictobject.h index 50f4c4a9..6822a65c 100644 --- a/Include/cpython/dictobject.h +++ b/Include/cpython/dictobject.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - typedef struct _dictkeysobject PyDictKeysObject; /* The ma_values pointer is NULL for a combined table @@ -26,7 +22,7 @@ typedef struct { /* If ma_values is NULL, the table is "combined": keys and values are stored in ma_keys. - If ma_values is not NULL, the table is split: + If ma_values is not NULL, the table is splitted: keys are stored in ma_keys and values are stored in ma_values */ PyObject **ma_values; } PyDictObject; @@ -45,13 +41,13 @@ PyAPI_FUNC(int) _PyDict_DelItem_KnownHash(PyObject *mp, PyObject *key, PyAPI_FUNC(int) _PyDict_DelItemIf(PyObject *mp, PyObject *key, int (*predicate)(PyObject *value)); PyDictKeysObject *_PyDict_NewKeysForClass(void); -PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); PyAPI_FUNC(int) _PyDict_Next( PyObject *mp, Py_ssize_t *pos, PyObject **key, PyObject **value, Py_hash_t *hash); /* Get the number of items of a dictionary. */ #define PyDict_GET_SIZE(mp) (assert(PyDict_Check(mp)),((PyDictObject *)mp)->ma_used) -PyAPI_FUNC(int) _PyDict_Contains(PyObject *mp, PyObject *key, Py_hash_t hash); +PyAPI_FUNC(int) _PyDict_Contains_KnownHash(PyObject *, PyObject *, Py_hash_t); +PyAPI_FUNC(int) _PyDict_ContainsId(PyObject *, struct _Py_Identifier *); PyAPI_FUNC(PyObject *) _PyDict_NewPresized(Py_ssize_t minused); PyAPI_FUNC(void) _PyDict_MaybeUntrack(PyObject *mp); PyAPI_FUNC(int) _PyDict_HasOnlyStringKeys(PyObject *mp); @@ -68,7 +64,6 @@ PyObject *_PyDict_FromKeys(PyObject *, PyObject *, PyObject *); argument is raised. */ PyAPI_FUNC(int) _PyDict_MergeEx(PyObject *mp, PyObject *other, int override); -PyAPI_FUNC(PyObject *) _PyDict_GetItemId(PyObject *dp, struct _Py_Identifier *key); PyAPI_FUNC(int) _PyDict_SetItemId(PyObject *dp, struct _Py_Identifier *key, PyObject *item); PyAPI_FUNC(int) _PyDict_DelItemId(PyObject *mp, struct _Py_Identifier *key); @@ -76,6 +71,7 @@ PyAPI_FUNC(void) _PyDict_DebugMallocStats(FILE *out); int _PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, PyObject *name, PyObject *value); PyObject *_PyDict_LoadGlobal(PyDictObject *, PyDictObject *, PyObject *); +Py_ssize_t _PyDict_GetItemHint(PyDictObject *, PyObject *, Py_ssize_t, PyObject **); /* _PyDictView */ @@ -86,7 +82,3 @@ typedef struct { PyAPI_FUNC(PyObject *) _PyDictView_New(PyObject *, PyTypeObject *); PyAPI_FUNC(PyObject *) _PyDictView_Intersect(PyObject* self, PyObject *other); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/fileobject.h b/Include/cpython/fileobject.h index 3005ce1f..cff2243d 100644 --- a/Include/cpython/fileobject.h +++ b/Include/cpython/fileobject.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - PyAPI_FUNC(char *) Py_UniversalNewlineFgets(char *, int, FILE*, PyObject *); /* The std printer acts as a preliminary sys.stderr until the new io @@ -19,6 +15,4 @@ PyAPI_FUNC(PyObject *) PyFile_OpenCode(const char *utf8path); PyAPI_FUNC(PyObject *) PyFile_OpenCodeObject(PyObject *path); PyAPI_FUNC(int) PyFile_SetOpenCodeHook(Py_OpenCodeHookFunction hook, void *userData); -#ifdef __cplusplus -} -#endif +PyAPI_FUNC(int) _PyLong_FileDescriptor_Converter(PyObject *, void *); diff --git a/Include/cpython/fileutils.h b/Include/cpython/fileutils.h index e79d03e2..ccf37e94 100644 --- a/Include/cpython/fileutils.h +++ b/Include/cpython/fileutils.h @@ -32,6 +32,9 @@ PyAPI_FUNC(int) _Py_EncodeLocaleEx( int current_locale, _Py_error_handler errors); +PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( + const wchar_t *text, + size_t *error_pos); PyAPI_FUNC(PyObject *) _Py_device_encoding(int); @@ -95,10 +98,6 @@ PyAPI_FUNC(FILE *) _Py_wfopen( const wchar_t *path, const wchar_t *mode); -PyAPI_FUNC(FILE*) _Py_fopen( - const char *pathname, - const char *mode); - PyAPI_FUNC(FILE*) _Py_fopen_obj( PyObject *path, const char *mode); @@ -162,4 +161,12 @@ PyAPI_FUNC(int) _Py_dup(int fd); PyAPI_FUNC(int) _Py_get_blocking(int fd); PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); -#endif /* !MS_WINDOWS */ +#else /* MS_WINDOWS */ +PyAPI_FUNC(void*) _Py_get_osfhandle_noraise(int fd); + +PyAPI_FUNC(void*) _Py_get_osfhandle(int fd); + +PyAPI_FUNC(int) _Py_open_osfhandle_noraise(void *handle, int flags); + +PyAPI_FUNC(int) _Py_open_osfhandle(void *handle, int flags); +#endif /* MS_WINDOWS */ diff --git a/Include/cpython/frameobject.h b/Include/cpython/frameobject.h index 36a51baa..5122ec41 100644 --- a/Include/cpython/frameobject.h +++ b/Include/cpython/frameobject.h @@ -4,9 +4,20 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif +/* These values are chosen so that the inline functions below all + * compare f_state to zero. + */ +enum _framestate { + FRAME_CREATED = -2, + FRAME_SUSPENDED = -1, + FRAME_EXECUTING = 0, + FRAME_RETURNED = 1, + FRAME_UNWINDING = 2, + FRAME_RAISED = 3, + FRAME_CLEARED = 4 +}; + +typedef signed char PyFrameState; typedef struct { int b_type; /* what kind of block this is */ @@ -22,11 +33,8 @@ struct _frame { PyObject *f_globals; /* global symbol table (PyDictObject) */ PyObject *f_locals; /* local symbol table (any mapping) */ PyObject **f_valuestack; /* points after the last local */ - /* Next free slot in f_valuestack. Frame creation sets to f_valuestack. - Frame evaluation usually NULLs it, but a frame that yields sets it - to the current stack top. */ - PyObject **f_stacktop; PyObject *f_trace; /* Trace function */ + int f_stackdepth; /* Depth of value stack */ char f_trace_lines; /* Emit per-line trace events? */ char f_trace_opcodes; /* Emit per-opcode trace events? */ @@ -34,18 +42,24 @@ struct _frame { PyObject *f_gen; int f_lasti; /* Last instruction if called */ - /* Call PyFrame_GetLineNumber() instead of reading this field - directly. As of 2.3 f_lineno is only valid when tracing is - active (i.e. when f_trace is set). At other times we use - PyCode_Addr2Line to calculate the line from the current - bytecode index. */ - int f_lineno; /* Current line number */ + int f_lineno; /* Current line number. Only valid if non-zero */ int f_iblock; /* index in f_blockstack */ - char f_executing; /* whether the frame is still executing */ + PyFrameState f_state; /* What state the frame is in */ PyTryBlock f_blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ PyObject *f_localsplus[1]; /* locals+stack, dynamically sized */ }; +static inline int _PyFrame_IsRunnable(struct _frame *f) { + return f->f_state < FRAME_EXECUTING; +} + +static inline int _PyFrame_IsExecuting(struct _frame *f) { + return f->f_state == FRAME_EXECUTING; +} + +static inline int _PyFrameHasCompleted(struct _frame *f) { + return f->f_state > FRAME_EXECUTING; +} /* Standard object interface */ @@ -57,8 +71,8 @@ PyAPI_FUNC(PyFrameObject *) PyFrame_New(PyThreadState *, PyCodeObject *, PyObject *, PyObject *); /* only internal use */ -PyFrameObject* _PyFrame_New_NoTrack(PyThreadState *, PyCodeObject *, - PyObject *, PyObject *); +PyFrameObject* +_PyFrame_New_NoTrack(PyThreadState *, PyFrameConstructor *, PyObject *); /* The rest of the interface is specific for frame objects */ @@ -78,7 +92,3 @@ PyAPI_FUNC(void) PyFrame_FastToLocals(PyFrameObject *); PyAPI_FUNC(void) _PyFrame_DebugMallocStats(FILE *out); PyAPI_FUNC(PyFrameObject *) PyFrame_GetBack(PyFrameObject *frame); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/import.h b/Include/cpython/import.h index c1b47121..dd5bbdba 100644 --- a/Include/cpython/import.h +++ b/Include/cpython/import.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - PyMODINIT_FUNC PyInit__imp(void); PyAPI_FUNC(int) _PyImport_IsInitialized(PyInterpreterState *); @@ -17,7 +13,8 @@ PyAPI_FUNC(int) _PyImport_SetModuleString(const char *name, PyObject* module); PyAPI_FUNC(void) _PyImport_AcquireLock(void); PyAPI_FUNC(int) _PyImport_ReleaseLock(void); -PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); +/* Obsolete since 3.5, will be removed in 3.11. */ +Py_DEPRECATED(3.10) PyAPI_FUNC(PyObject *) _PyImport_FindExtensionObject(PyObject *, PyObject *); PyAPI_FUNC(int) _PyImport_FixupBuiltin( PyObject *mod, @@ -44,7 +41,3 @@ struct _frozen { collection of frozen modules: */ PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules; - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h index 0a256d4b..09f9a294 100644 --- a/Include/cpython/initconfig.h +++ b/Include/cpython/initconfig.h @@ -1,9 +1,6 @@ #ifndef Py_PYCORECONFIG_H #define Py_PYCORECONFIG_H #ifndef Py_LIMITED_API -#ifdef __cplusplus -extern "C" { -#endif /* --- PyStatus ----------------------------------------------- */ @@ -44,7 +41,7 @@ PyAPI_FUNC(PyStatus) PyWideStringList_Insert(PyWideStringList *list, /* --- PyPreConfig ----------------------------------------------- */ -typedef struct { +typedef struct PyPreConfig { int _config_init; /* _PyConfigInitEnum value */ /* Parse Py_PreInitializeFromBytesArgs() arguments? @@ -130,298 +127,85 @@ PyAPI_FUNC(void) PyPreConfig_InitIsolatedConfig(PyPreConfig *config); /* --- PyConfig ---------------------------------------------- */ -typedef struct { +/* This structure is best documented in the Doc/c-api/init_config.rst file. */ +typedef struct PyConfig { int _config_init; /* _PyConfigInitEnum value */ - int isolated; /* Isolated mode? see PyPreConfig.isolated */ - int use_environment; /* Use environment variables? see PyPreConfig.use_environment */ - int dev_mode; /* Python Development Mode? See PyPreConfig.dev_mode */ - - /* Install signal handlers? Yes by default. */ + int isolated; + int use_environment; + int dev_mode; int install_signal_handlers; - - int use_hash_seed; /* PYTHONHASHSEED=x */ + int use_hash_seed; unsigned long hash_seed; - - /* Enable faulthandler? - Set to 1 by -X faulthandler and PYTHONFAULTHANDLER. -1 means unset. */ int faulthandler; - - /* Enable PEG parser? - 1 by default, set to 0 by -X oldparser and PYTHONOLDPARSER */ - int _use_peg_parser; - - /* Enable tracemalloc? - Set by -X tracemalloc=N and PYTHONTRACEMALLOC. -1 means unset */ int tracemalloc; - - int import_time; /* PYTHONPROFILEIMPORTTIME, -X importtime */ - int show_ref_count; /* -X showrefcount */ - int dump_refs; /* PYTHONDUMPREFS */ - int malloc_stats; /* PYTHONMALLOCSTATS */ - - /* Python filesystem encoding and error handler: - sys.getfilesystemencoding() and sys.getfilesystemencodeerrors(). - - Default encoding and error handler: - - * if Py_SetStandardStreamEncoding() has been called: they have the - highest priority; - * PYTHONIOENCODING environment variable; - * The UTF-8 Mode uses UTF-8/surrogateescape; - * If Python forces the usage of the ASCII encoding (ex: C locale - or POSIX locale on FreeBSD or HP-UX), use ASCII/surrogateescape; - * locale encoding: ANSI code page on Windows, UTF-8 on Android and - VxWorks, LC_CTYPE locale encoding on other platforms; - * On Windows, "surrogateescape" error handler; - * "surrogateescape" error handler if the LC_CTYPE locale is "C" or "POSIX"; - * "surrogateescape" error handler if the LC_CTYPE locale has been coerced - (PEP 538); - * "strict" error handler. - - Supported error handlers: "strict", "surrogateescape" and - "surrogatepass". The surrogatepass error handler is only supported - if Py_DecodeLocale() and Py_EncodeLocale() use directly the UTF-8 codec; - it's only used on Windows. - - initfsencoding() updates the encoding to the Python codec name. - For example, "ANSI_X3.4-1968" is replaced with "ascii". - - On Windows, sys._enablelegacywindowsfsencoding() sets the - encoding/errors to mbcs/replace at runtime. - - - See Py_FileSystemDefaultEncoding and Py_FileSystemDefaultEncodeErrors. - */ + int import_time; + int show_ref_count; + int dump_refs; + int malloc_stats; wchar_t *filesystem_encoding; wchar_t *filesystem_errors; - - wchar_t *pycache_prefix; /* PYTHONPYCACHEPREFIX, -X pycache_prefix=PATH */ - int parse_argv; /* Parse argv command line arguments? */ - - /* Command line arguments (sys.argv). - - Set parse_argv to 1 to parse argv as Python command line arguments - and then strip Python arguments from argv. - - If argv is empty, an empty string is added to ensure that sys.argv - always exists and is never empty. */ + wchar_t *pycache_prefix; + int parse_argv; + PyWideStringList orig_argv; PyWideStringList argv; - - /* Program name: - - - If Py_SetProgramName() was called, use its value. - - On macOS, use PYTHONEXECUTABLE environment variable if set. - - If WITH_NEXT_FRAMEWORK macro is defined, use __PYVENV_LAUNCHER__ - environment variable is set. - - Use argv[0] if available and non-empty. - - Use "python" on Windows, or "python3 on other platforms. */ - wchar_t *program_name; - - PyWideStringList xoptions; /* Command line -X options */ - - /* Warnings options: lowest to highest priority. warnings.filters - is built in the reverse order (highest to lowest priority). */ + PyWideStringList xoptions; PyWideStringList warnoptions; - - /* If equal to zero, disable the import of the module site and the - site-dependent manipulations of sys.path that it entails. Also disable - these manipulations if site is explicitly imported later (call - site.main() if you want them to be triggered). - - Set to 0 by the -S command line option. If set to -1 (default), it is - set to !Py_NoSiteFlag. */ int site_import; - - /* Bytes warnings: - - * If equal to 1, issue a warning when comparing bytes or bytearray with - str or bytes with int. - * If equal or greater to 2, issue an error. - - Incremented by the -b command line option. If set to -1 (default), inherit - Py_BytesWarningFlag value. */ int bytes_warning; - - /* If greater than 0, enable inspect: when a script is passed as first - argument or the -c option is used, enter interactive mode after - executing the script or the command, even when sys.stdin does not appear - to be a terminal. - - Incremented by the -i command line option. Set to 1 if the PYTHONINSPECT - environment variable is non-empty. If set to -1 (default), inherit - Py_InspectFlag value. */ + int warn_default_encoding; int inspect; - - /* If greater than 0: enable the interactive mode (REPL). - - Incremented by the -i command line option. If set to -1 (default), - inherit Py_InteractiveFlag value. */ int interactive; - - /* Optimization level. - - Incremented by the -O command line option. Set by the PYTHONOPTIMIZE - environment variable. If set to -1 (default), inherit Py_OptimizeFlag - value. */ int optimization_level; - - /* If greater than 0, enable the debug mode: turn on parser debugging - output (for expert only, depending on compilation options). - - Incremented by the -d command line option. Set by the PYTHONDEBUG - environment variable. If set to -1 (default), inherit Py_DebugFlag - value. */ int parser_debug; - - /* If equal to 0, Python won't try to write ``.pyc`` files on the - import of source modules. - - Set to 0 by the -B command line option and the PYTHONDONTWRITEBYTECODE - environment variable. If set to -1 (default), it is set to - !Py_DontWriteBytecodeFlag. */ int write_bytecode; - - /* If greater than 0, enable the verbose mode: print a message each time a - module is initialized, showing the place (filename or built-in module) - from which it is loaded. - - If greater or equal to 2, print a message for each file that is checked - for when searching for a module. Also provides information on module - cleanup at exit. - - Incremented by the -v option. Set by the PYTHONVERBOSE environment - variable. If set to -1 (default), inherit Py_VerboseFlag value. */ int verbose; - - /* If greater than 0, enable the quiet mode: Don't display the copyright - and version messages even in interactive mode. - - Incremented by the -q option. If set to -1 (default), inherit - Py_QuietFlag value. */ int quiet; - - /* If greater than 0, don't add the user site-packages directory to - sys.path. - - Set to 0 by the -s and -I command line options , and the PYTHONNOUSERSITE - environment variable. If set to -1 (default), it is set to - !Py_NoUserSiteDirectory. */ int user_site_directory; - - /* If non-zero, configure C standard steams (stdio, stdout, - stderr): - - - Set O_BINARY mode on Windows. - - If buffered_stdio is equal to zero, make streams unbuffered. - Otherwise, enable streams buffering if interactive is non-zero. */ int configure_c_stdio; - - /* If equal to 0, enable unbuffered mode: force the stdout and stderr - streams to be unbuffered. - - Set to 0 by the -u option. Set by the PYTHONUNBUFFERED environment - variable. - If set to -1 (default), it is set to !Py_UnbufferedStdioFlag. */ int buffered_stdio; - - /* Encoding of sys.stdin, sys.stdout and sys.stderr. - Value set from PYTHONIOENCODING environment variable and - Py_SetStandardStreamEncoding() function. - See also 'stdio_errors' attribute. */ wchar_t *stdio_encoding; - - /* Error handler of sys.stdin and sys.stdout. - Value set from PYTHONIOENCODING environment variable and - Py_SetStandardStreamEncoding() function. - See also 'stdio_encoding' attribute. */ wchar_t *stdio_errors; - #ifdef MS_WINDOWS - /* If greater than zero, use io.FileIO instead of WindowsConsoleIO for sys - standard streams. - - Set to 1 if the PYTHONLEGACYWINDOWSSTDIO environment variable is set to - a non-empty string. If set to -1 (default), inherit - Py_LegacyWindowsStdioFlag value. - - See PEP 528 for more details. */ int legacy_windows_stdio; #endif - - /* Value of the --check-hash-based-pycs command line option: - - - "default" means the 'check_source' flag in hash-based pycs - determines invalidation - - "always" causes the interpreter to hash the source file for - invalidation regardless of value of 'check_source' bit - - "never" causes the interpreter to always assume hash-based pycs are - valid - - The default value is "default". - - See PEP 552 "Deterministic pycs" for more details. */ wchar_t *check_hash_pycs_mode; /* --- Path configuration inputs ------------ */ - - /* If greater than 0, suppress _PyPathConfig_Calculate() warnings on Unix. - The parameter has no effect on Windows. - - If set to -1 (default), inherit !Py_FrozenFlag value. */ int pathconfig_warnings; - - wchar_t *pythonpath_env; /* PYTHONPATH environment variable */ - wchar_t *home; /* PYTHONHOME environment variable, - see also Py_SetPythonHome(). */ + wchar_t *program_name; + wchar_t *pythonpath_env; + wchar_t *home; + wchar_t *platlibdir; /* --- Path configuration outputs ----------- */ - - int module_search_paths_set; /* If non-zero, use module_search_paths */ - PyWideStringList module_search_paths; /* sys.path paths. Computed if - module_search_paths_set is equal - to zero. */ - - wchar_t *executable; /* sys.executable */ - wchar_t *base_executable; /* sys._base_executable */ - wchar_t *prefix; /* sys.prefix */ - wchar_t *base_prefix; /* sys.base_prefix */ - wchar_t *exec_prefix; /* sys.exec_prefix */ - wchar_t *base_exec_prefix; /* sys.base_exec_prefix */ - wchar_t *platlibdir; /* sys.platlibdir */ + int module_search_paths_set; + PyWideStringList module_search_paths; + wchar_t *executable; + wchar_t *base_executable; + wchar_t *prefix; + wchar_t *base_prefix; + wchar_t *exec_prefix; + wchar_t *base_exec_prefix; /* --- Parameter only used by Py_Main() ---------- */ - - /* Skip the first line of the source ('run_filename' parameter), allowing use of non-Unix forms of - "#!cmd". This is intended for a DOS specific hack only. - - Set by the -x command line option. */ int skip_source_first_line; - - wchar_t *run_command; /* -c command line argument */ - wchar_t *run_module; /* -m command line argument */ - wchar_t *run_filename; /* Trailing command line argument without -c or -m */ + wchar_t *run_command; + wchar_t *run_module; + wchar_t *run_filename; /* --- Private fields ---------------------------- */ - /* Install importlib? If set to 0, importlib is not initialized at all. - Needed by freeze_importlib. */ + // Install importlib? If equals to 0, importlib is not initialized at all. + // Needed by freeze_importlib. int _install_importlib; - /* If equal to 0, stop Python initialization before the "main" phase */ + // If equal to 0, stop Python initialization before the "main" phase. int _init_main; - /* If non-zero, disallow threads, subprocesses, and fork. - Default: 0. */ + // If non-zero, disallow threads, subprocesses, and fork. + // Default: 0. int _isolated_interpreter; - - /* Original command line arguments. If _orig_argv is empty and _argv is - not equal to [''], PyConfig_Read() copies the configuration 'argv' list - into '_orig_argv' list before modifying 'argv' list (if parse_argv - is non-zero). - - _PyConfig_Write() initializes Py_GetArgcArgv() to this list. */ - PyWideStringList _orig_argv; } PyConfig; PyAPI_FUNC(void) PyConfig_InitPythonConfig(PyConfig *config); @@ -452,11 +236,8 @@ PyAPI_FUNC(PyStatus) PyConfig_SetWideStringList(PyConfig *config, /* Get the original command line arguments, before Python modified them. - See also PyConfig._orig_argv. */ + See also PyConfig.orig_argv. */ PyAPI_FUNC(void) Py_GetArgcArgv(int *argc, wchar_t ***argv); -#ifdef __cplusplus -} -#endif #endif /* !Py_LIMITED_API */ #endif /* !Py_PYCORECONFIG_H */ diff --git a/Include/cpython/interpreteridobject.h b/Include/cpython/interpreteridobject.h index 67ec5873..50765842 100644 --- a/Include/cpython/interpreteridobject.h +++ b/Include/cpython/interpreteridobject.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - /* Interpreter ID Object */ PyAPI_DATA(PyTypeObject) _PyInterpreterID_Type; @@ -13,7 +9,3 @@ PyAPI_DATA(PyTypeObject) _PyInterpreterID_Type; PyAPI_FUNC(PyObject *) _PyInterpreterID_New(int64_t); PyAPI_FUNC(PyObject *) _PyInterpreterState_GetIDObject(PyInterpreterState *); PyAPI_FUNC(PyInterpreterState *) _PyInterpreterID_LookUp(PyObject *); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h index 74fe3301..e3239152 100644 --- a/Include/cpython/listobject.h +++ b/Include/cpython/listobject.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements. list[0] is ob_item[0], etc. */ @@ -30,14 +26,9 @@ PyAPI_FUNC(void) _PyList_DebugMallocStats(FILE *out); /* Macro, trading safety for speed */ -/* Cast argument to PyTupleObject* type. */ +/* Cast argument to PyListObject* type. */ #define _PyList_CAST(op) (assert(PyList_Check(op)), (PyListObject *)(op)) #define PyList_GET_ITEM(op, i) (_PyList_CAST(op)->ob_item[i]) -#define PyList_SET_ITEM(op, i, v) (_PyList_CAST(op)->ob_item[i] = (v)) +#define PyList_SET_ITEM(op, i, v) ((void)(_PyList_CAST(op)->ob_item[i] = (v))) #define PyList_GET_SIZE(op) Py_SIZE(_PyList_CAST(op)) -#define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item) - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/object.h b/Include/cpython/object.h index 444f832f..84c60e55 100644 --- a/Include/cpython/object.h +++ b/Include/cpython/object.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - PyAPI_FUNC(void) _Py_NewReference(PyObject *op); #ifdef Py_TRACE_REFS @@ -13,10 +9,6 @@ PyAPI_FUNC(void) _Py_NewReference(PyObject *op); PyAPI_FUNC(void) _Py_ForgetReference(PyObject *); #endif -/* Update the Python traceback of an object. This function must be called - when a memory block is reused from a free list. */ -PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op); - #ifdef Py_REF_DEBUG PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); #endif @@ -43,12 +35,13 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void); _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*. */ typedef struct _Py_Identifier { - struct _Py_Identifier *next; const char* string; - PyObject *object; + // Index in PyInterpreterState.unicode.ids.array. It is process-wide + // unique and must be initialized to -1. + Py_ssize_t index; } _Py_Identifier; -#define _Py_static_string_init(value) { .next = NULL, .string = value, .object = NULL } +#define _Py_static_string_init(value) { .string = value, .index = -1 } #define _Py_static_string(varname, value) static _Py_Identifier varname = _Py_static_string_init(value) #define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) @@ -175,10 +168,13 @@ typedef struct { objobjargproc mp_ass_subscript; } PyMappingMethods; +typedef PySendResult (*sendfunc)(PyObject *iter, PyObject *value, PyObject **result); + typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; + sendfunc am_send; } PyAsyncMethods; typedef struct { @@ -190,6 +186,8 @@ typedef struct { * backwards-compatibility */ typedef Py_ssize_t printfunc; +// If this structure is modified, Doc/includes/typestruct.h should be updated +// as well. struct _typeobject { PyObject_VAR_HEAD const char *tp_name; /* For printing, in format "." */ @@ -249,6 +247,7 @@ struct _typeobject { struct PyMethodDef *tp_methods; struct PyMemberDef *tp_members; struct PyGetSetDef *tp_getset; + // Strong reference on a heap type, borrowed reference on a static type struct _typeobject *tp_base; PyObject *tp_dict; descrgetfunc tp_descr_get; @@ -304,6 +303,8 @@ PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, _Py_Identifier *); PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyType_GetDocFromInternalDoc(const char *, const char *); PyAPI_FUNC(PyObject *) _PyType_GetTextSignatureFromInternalDoc(const char *, const char *); +struct PyModuleDef; +PyAPI_FUNC(PyObject *) _PyType_GetModuleByDef(PyTypeObject *, struct PyModuleDef *); struct _Py_Identifier; PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); @@ -314,7 +315,6 @@ PyAPI_FUNC(int) _PyObject_IsFreed(PyObject *); PyAPI_FUNC(int) _PyObject_IsAbstract(PyObject *); PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *); PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *); -PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); /* Replacements of PyObject_GetAttr() and _PyObject_GetAttrId() which don't raise AttributeError. @@ -519,6 +519,8 @@ struct _ts; /* Python 3.9 private API, invoked by the macros below. */ PyAPI_FUNC(int) _PyTrash_begin(struct _ts *tstate, PyObject *op); PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); +/* Python 3.10 private API, invoked by the Py_TRASHCAN_BEGIN(). */ +PyAPI_FUNC(int) _PyTrash_cond(PyObject *op, destructor dealloc); #define PyTrash_UNWIND_LEVEL 50 @@ -528,7 +530,7 @@ PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); /* If "cond" is false, then _tstate remains NULL and the deallocator \ * is run normally without involving the trashcan */ \ if (cond) { \ - _tstate = PyThreadState_GET(); \ + _tstate = PyThreadState_Get(); \ if (_PyTrash_begin(_tstate, _PyObject_CAST(op))) { \ break; \ } \ @@ -542,13 +544,9 @@ PyAPI_FUNC(void) _PyTrash_end(struct _ts *tstate); #define Py_TRASHCAN_BEGIN(op, dealloc) \ Py_TRASHCAN_BEGIN_CONDITION(op, \ - Py_TYPE(op)->tp_dealloc == (destructor)(dealloc)) + _PyTrash_cond(_PyObject_CAST(op), (destructor)dealloc)) /* For backwards compatibility, these macros enable the trashcan * unconditionally */ #define Py_TRASHCAN_SAFE_BEGIN(op) Py_TRASHCAN_BEGIN_CONDITION(op, 1) #define Py_TRASHCAN_SAFE_END(op) Py_TRASHCAN_END - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/objimpl.h b/Include/cpython/objimpl.h index b835936d..d83700e2 100644 --- a/Include/cpython/objimpl.h +++ b/Include/cpython/objimpl.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - #define _PyObject_SIZE(typeobj) ( (typeobj)->tp_basicsize ) /* _PyObject_VAR_SIZE returns the number of bytes (as size_t) allocated for a @@ -41,8 +37,9 @@ extern "C" { PyObject *op; op = (PyObject *) Your_Allocator(_PyObject_SIZE(YourTypeStruct)); - if (op == NULL) - return PyErr_NoMemory(); + if (op == NULL) { + return PyErr_NoMemory(); + } PyObject_Init(op, &YourTypeStruct); @@ -55,40 +52,6 @@ extern "C" { the 1st step is performed automatically for you, so in a C++ class constructor you would start directly with PyObject_Init/InitVar. */ - -/* Inline functions trading binary compatibility for speed: - PyObject_INIT() is the fast version of PyObject_Init(), and - PyObject_INIT_VAR() is the fast version of PyObject_InitVar(). - - These inline functions must not be called with op=NULL. */ -static inline PyObject* -_PyObject_INIT(PyObject *op, PyTypeObject *typeobj) -{ - assert(op != NULL); - Py_SET_TYPE(op, typeobj); - if (PyType_GetFlags(typeobj) & Py_TPFLAGS_HEAPTYPE) { - Py_INCREF(typeobj); - } - _Py_NewReference(op); - return op; -} - -#define PyObject_INIT(op, typeobj) \ - _PyObject_INIT(_PyObject_CAST(op), (typeobj)) - -static inline PyVarObject* -_PyObject_INIT_VAR(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) -{ - assert(op != NULL); - Py_SET_SIZE(op, size); - PyObject_INIT((PyObject *)op, typeobj); - return op; -} - -#define PyObject_INIT_VAR(op, typeobj, size) \ - _PyObject_INIT_VAR(_PyVarObject_CAST(op), (typeobj), (size)) - - /* This function returns the number of allocated memory blocks, regardless of size */ PyAPI_FUNC(Py_ssize_t) _Py_GetAllocatedBlocks(void); @@ -116,10 +79,6 @@ PyAPI_FUNC(void) PyObject_GetArenaAllocator(PyObjectArenaAllocator *allocator); PyAPI_FUNC(void) PyObject_SetArenaAllocator(PyObjectArenaAllocator *allocator); -PyAPI_FUNC(Py_ssize_t) _PyGC_CollectNoFail(void); -PyAPI_FUNC(Py_ssize_t) _PyGC_CollectIfEnabled(void); - - /* Test if an object implements the garbage collector protocol */ PyAPI_FUNC(int) PyObject_IS_GC(PyObject *obj); @@ -139,7 +98,3 @@ PyAPI_FUNC(PyObject *) _PyObject_GC_Calloc(size_t size); #define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) PyAPI_FUNC(PyObject **) PyObject_GET_WEAKREFS_LISTPTR(PyObject *op); - -#ifdef __cplusplus -} -#endif diff --git a/Include/odictobject.h b/Include/cpython/odictobject.h similarity index 100% rename from Include/odictobject.h rename to Include/cpython/odictobject.h diff --git a/Include/picklebufobject.h b/Include/cpython/picklebufobject.h similarity index 100% rename from Include/picklebufobject.h rename to Include/cpython/picklebufobject.h diff --git a/Include/pyctype.h b/Include/cpython/pyctype.h similarity index 100% rename from Include/pyctype.h rename to Include/cpython/pyctype.h diff --git a/Include/pydebug.h b/Include/cpython/pydebug.h similarity index 100% rename from Include/pydebug.h rename to Include/cpython/pydebug.h diff --git a/Include/cpython/pyerrors.h b/Include/cpython/pyerrors.h index 9c87b539..5e57129c 100644 --- a/Include/cpython/pyerrors.h +++ b/Include/cpython/pyerrors.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - /* Error objects */ /* PyException_HEAD defines the initial segment of every exception class. */ @@ -24,6 +20,8 @@ typedef struct { PyObject *filename; PyObject *lineno; PyObject *offset; + PyObject *end_lineno; + PyObject *end_offset; PyObject *text; PyObject *print_file_and_line; } PySyntaxErrorObject; @@ -66,6 +64,17 @@ typedef struct { PyObject *value; } PyStopIterationObject; +typedef struct { + PyException_HEAD + PyObject *name; +} PyNameErrorObject; + +typedef struct { + PyException_HEAD + PyObject *obj; + PyObject *name; +} PyAttributeErrorObject; + /* Compatibility typedefs */ typedef PyOSErrorObject PyEnvironmentErrorObject; #ifdef MS_WINDOWS @@ -82,10 +91,6 @@ PyAPI_FUNC(void) _PyErr_GetExcInfo(PyThreadState *, PyObject **, PyObject **, Py PyAPI_FUNC(void) _PyErr_ChainExceptions(PyObject *, PyObject *, PyObject *); -/* */ - -#define PyExceptionClass_Name(x) (((PyTypeObject*)(x))->tp_name) - /* Convenience functions */ #ifdef MS_WINDOWS @@ -145,6 +150,13 @@ PyAPI_FUNC(void) PyErr_SyntaxLocationObject( int lineno, int col_offset); +PyAPI_FUNC(void) PyErr_RangedSyntaxLocationObject( + PyObject *filename, + int lineno, + int col_offset, + int end_lineno, + int end_col_offset); + PyAPI_FUNC(PyObject *) PyErr_ProgramTextObject( PyObject *filename, int lineno); @@ -194,7 +206,3 @@ PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalErrorFormat( ...); #define Py_FatalError(message) _Py_FatalErrorFunc(__func__, message) - -#ifdef __cplusplus -} -#endif diff --git a/Include/pyfpe.h b/Include/cpython/pyfpe.h similarity index 100% rename from Include/pyfpe.h rename to Include/cpython/pyfpe.h diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h index eb523b82..5faeb353 100644 --- a/Include/cpython/pylifecycle.h +++ b/Include/cpython/pylifecycle.h @@ -2,9 +2,9 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif +/* Py_FrozenMain is kept out of the Limited API until documented and present + in all builds of Python */ +PyAPI_FUNC(int) Py_FrozenMain(int argc, char **argv); /* Only used by applications that embed the interpreter and need to * override the standard encoding determination mechanism @@ -39,15 +39,11 @@ PyAPI_FUNC(int) Py_RunMain(void); PyAPI_FUNC(void) _Py_NO_RETURN Py_ExitStatusException(PyStatus err); -/* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level - * exit functions. - */ -PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(PyObject *), PyObject *); - /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */ PyAPI_FUNC(void) _Py_RestoreSignals(void); PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *); +PyAPI_FUNC(int) _Py_FdIsInteractive(FILE *fp, PyObject *filename); PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *); @@ -66,7 +62,3 @@ PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn); PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category); PyAPI_FUNC(PyThreadState *) _Py_NewInterpreter(int isolated_subinterpreter); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/pymem.h b/Include/cpython/pymem.h index 79f063b1..d1054d76 100644 --- a/Include/cpython/pymem.h +++ b/Include/cpython/pymem.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); @@ -14,8 +10,6 @@ PyAPI_FUNC(void) PyMem_RawFree(void *ptr); /* Try to get the allocators name set by _PyMem_SetupAllocators(). */ PyAPI_FUNC(const char*) _PyMem_GetCurrentAllocatorName(void); -PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); - /* strdup() using PyMem_RawMalloc() */ PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); @@ -102,7 +96,3 @@ PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain, The function does nothing if Python is not compiled is debug mode. */ PyAPI_FUNC(void) PyMem_SetupDebugHooks(void); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 0eb601fd..e3ccc543 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -2,9 +2,7 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif +#include "cpython/initconfig.h" PyAPI_FUNC(int) _PyInterpreterState_RequiresIDRef(PyInterpreterState *); PyAPI_FUNC(void) _PyInterpreterState_RequireIDRef(PyInterpreterState *, int); @@ -31,6 +29,21 @@ typedef int (*Py_tracefunc)(PyObject *, PyFrameObject *, int, PyObject *); #define PyTrace_OPCODE 7 +typedef struct _cframe { + /* This struct will be threaded through the C stack + * allowing fast access to per-thread state that needs + * to be accessed quickly by the interpreter, but can + * be modified outside of the interpreter. + * + * WARNING: This makes data on the C stack accessible from + * heap objects. Care must be taken to maintain stack + * discipline and make sure that instances of this struct cannot + * accessed outside of their lifetime. + */ + int use_tracing; + struct _cframe *previous; +} CFrame; + typedef struct _err_stackitem { /* This struct represents an entry on the exception stack, which is a * per-coroutine state. (Coroutine in the computer science sense, @@ -56,17 +69,17 @@ struct _ts { /* Borrowed reference to the current frame (it can be NULL) */ PyFrameObject *frame; int recursion_depth; - char overflowed; /* The stack has overflowed. Allow 50 more calls - to handle the runtime error. */ - char recursion_critical; /* The current calls must not cause - a stack overflow. */ + int recursion_headroom; /* Allow 50 more calls to handle any errors. */ int stackcheck_counter; /* 'tracing' keeps track of the execution depth when tracing/profiling. This is to prevent the actual trace/profile code from being recorded in the trace/profile. */ int tracing; - int use_tracing; + + /* Pointer to current CFrame in the C stack frame of the currently, + * or most recently, executing _PyEval_EvalFrameDefault. */ + CFrame *cframe; Py_tracefunc c_profilefunc; Py_tracefunc c_tracefunc; @@ -134,6 +147,8 @@ struct _ts { /* Unique thread state id. */ uint64_t id; + CFrame root_cframe; + /* XXX signal handlers should also be here */ }; @@ -171,6 +186,11 @@ PyAPI_FUNC(PyInterpreterState *) _PyGILState_GetInterpreterStateUnsafe(void); */ PyAPI_FUNC(PyObject *) _PyThread_CurrentFrames(void); +/* The implementation of sys._current_exceptions() Returns a dict mapping + thread id to that thread's current exception. +*/ +PyAPI_FUNC(PyObject *) _PyThread_CurrentExceptions(void); + /* Routines for advanced debuggers, requested by David Beazley. Don't use unless you know what you are doing! */ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Main(void); @@ -192,6 +212,36 @@ PyAPI_FUNC(void) _PyInterpreterState_SetEvalFrameFunc( PyAPI_FUNC(const PyConfig*) _PyInterpreterState_GetConfig(PyInterpreterState *interp); +/* Get a copy of the current interpreter configuration. + + Return 0 on success. Raise an exception and return -1 on error. + + The caller must initialize 'config', using PyConfig_InitPythonConfig() + for example. + + Python must be preinitialized to call this method. + The caller must hold the GIL. */ +PyAPI_FUNC(int) _PyInterpreterState_GetConfigCopy( + struct PyConfig *config); + +/* Set the configuration of the current interpreter. + + This function should be called during or just after the Python + initialization. + + Update the sys module with the new configuration. If the sys module was + modified directly after the Python initialization, these changes are lost. + + Some configuration like faulthandler or warnoptions can be updated in the + configuration, but don't reconfigure Python (don't enable/disable + faulthandler and don't reconfigure warnings filters). + + Return 0 on success. Raise an exception and return -1 on error. + + The configuration should come from _PyInterpreterState_GetConfigCopy(). */ +PyAPI_FUNC(int) _PyInterpreterState_SetConfig( + const struct PyConfig *config); + // Get the configuration of the currrent interpreter. // The caller must hold the GIL. PyAPI_FUNC(const PyConfig*) _Py_GetConfig(void); @@ -255,7 +305,3 @@ typedef int (*crossinterpdatafunc)(PyObject *, struct _xid *); PyAPI_FUNC(int) _PyCrossInterpreterData_RegisterClass(PyTypeObject *, crossinterpdatafunc); PyAPI_FUNC(crossinterpdatafunc) _PyCrossInterpreterData_Lookup(PyObject *); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/pythonrun.h b/Include/cpython/pythonrun.h new file mode 100644 index 00000000..2e72d082 --- /dev/null +++ b/Include/cpython/pythonrun.h @@ -0,0 +1,121 @@ +#ifndef Py_CPYTHON_PYTHONRUN_H +# error "this header file must not be included directly" +#endif + +PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); +PyAPI_FUNC(int) _PyRun_SimpleFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_AnyFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) _PyRun_AnyFileObject( + FILE *fp, + PyObject *filename, + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_SimpleFileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int closeit, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveOneObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); +PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + PyCompilerFlags *flags); +PyAPI_FUNC(int) _PyRun_InteractiveLoopObject( + FILE *fp, + PyObject *filename, + PyCompilerFlags *flags); + + +PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, + PyObject *, PyCompilerFlags *); + +PyAPI_FUNC(PyObject *) PyRun_FileExFlags( + FILE *fp, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyObject *globals, + PyObject *locals, + int closeit, + PyCompilerFlags *flags); + + +PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( + const char *str, + const char *filename, /* decoded from the filesystem encoding */ + int start, + PyCompilerFlags *flags, + int optimize); +PyAPI_FUNC(PyObject *) Py_CompileStringObject( + const char *str, + PyObject *filename, int start, + PyCompilerFlags *flags, + int optimize); + +#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) +#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) + + +PyAPI_FUNC(const char *) _Py_SourceAsString( + PyObject *cmd, + const char *funcname, + const char *what, + PyCompilerFlags *cf, + PyObject **cmd_copy); + + +/* A function flavor is also exported by libpython. It is required when + libpython is accessed directly rather than using header files which defines + macros below. On Windows, for example, PyAPI_FUNC() uses dllexport to + export functions in pythonXX.dll. */ +PyAPI_FUNC(PyObject *) PyRun_String(const char *str, int s, PyObject *g, PyObject *l); +PyAPI_FUNC(int) PyRun_AnyFile(FILE *fp, const char *name); +PyAPI_FUNC(int) PyRun_AnyFileEx(FILE *fp, const char *name, int closeit); +PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); +PyAPI_FUNC(int) PyRun_SimpleString(const char *s); +PyAPI_FUNC(int) PyRun_SimpleFile(FILE *f, const char *p); +PyAPI_FUNC(int) PyRun_SimpleFileEx(FILE *f, const char *p, int c); +PyAPI_FUNC(int) PyRun_InteractiveOne(FILE *f, const char *p); +PyAPI_FUNC(int) PyRun_InteractiveLoop(FILE *f, const char *p); +PyAPI_FUNC(PyObject *) PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l); +PyAPI_FUNC(PyObject *) PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c); +PyAPI_FUNC(PyObject *) PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, PyCompilerFlags *flags); + +/* Use macros for a bunch of old variants */ +#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) +#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) +#define PyRun_AnyFileEx(fp, name, closeit) \ + PyRun_AnyFileExFlags(fp, name, closeit, NULL) +#define PyRun_AnyFileFlags(fp, name, flags) \ + PyRun_AnyFileExFlags(fp, name, 0, flags) +#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) +#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) +#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) +#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) +#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) +#define PyRun_File(fp, p, s, g, l) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) +#define PyRun_FileEx(fp, p, s, g, l, c) \ + PyRun_FileExFlags(fp, p, s, g, l, c, NULL) +#define PyRun_FileFlags(fp, p, s, g, l, flags) \ + PyRun_FileExFlags(fp, p, s, g, l, 0, flags) + + +/* Stuff with no proper home (yet) */ +PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); +PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; +PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); diff --git a/Include/pytime.h b/Include/cpython/pytime.h similarity index 89% rename from Include/pytime.h rename to Include/cpython/pytime.h index c79eba2f..56607d19 100644 --- a/Include/pytime.h +++ b/Include/cpython/pytime.h @@ -2,9 +2,6 @@ #ifndef Py_PYTIME_H #define Py_PYTIME_H -#include "pyconfig.h" /* include for defines */ -#include "object.h" - /************************************************************************** Symbols and macros to supply platform-independent interfaces to time related functions and constants @@ -91,13 +88,13 @@ PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns); PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t, PyObject *obj); -/* Convert a number of seconds (Python float or int) to a timestamp. +/* Convert a number of seconds (Python float or int) to a timetamp. Raise an exception and return -1 on error, return 0 on success. */ PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t, PyObject *obj, _PyTime_round_t round); -/* Convert a number of milliseconds (Python float or int, 10^-3) to a timestamp. +/* Convert a number of milliseconds (Python float or int, 10^-3) to a timetamp. Raise an exception and return -1 on error, return 0 on success. */ PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t, PyObject *obj, @@ -164,22 +161,6 @@ PyAPI_FUNC(_PyTime_t) _PyTime_MulDiv(_PyTime_t ticks, _PyTime_t mul, _PyTime_t div); -/* Get the current time from the system clock. - - The function cannot fail. _PyTime_Init() ensures that the system clock - works. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); - -/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. - The clock is not affected by system clock updates. The reference point of - the returned value is undefined, so that only the difference between the - results of consecutive calls is valid. - - The function cannot fail. _PyTime_Init() ensures that a monotonic clock - is available and works. */ -PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); - - /* Structure used by time.get_clock_info() */ typedef struct { const char *implementation; @@ -189,13 +170,34 @@ typedef struct { } _Py_clock_info_t; /* Get the current time from the system clock. - * Fill clock information if info is not NULL. - * Raise an exception and return -1 on error, return 0 on success. + + If the internal clock fails, silently ignore the error and return 0. + On integer overflow, silently ignore the overflow and truncated the clock to + _PyTime_MIN or _PyTime_MAX. + + Use _PyTime_GetSystemClockWithInfo() to check for failure. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); + +/* Get the current time from the system clock. + * On success, set *t and *info (if not NULL), and return 0. + * On error, raise an exception and return -1. */ PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo( _PyTime_t *t, _Py_clock_info_t *info); +/* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. + The clock is not affected by system clock updates. The reference point of + the returned value is undefined, so that only the difference between the + results of consecutive calls is valid. + + If the internal clock fails, silently ignore the error and return 0. + On integer overflow, silently ignore the overflow and truncated the clock to + _PyTime_MIN or _PyTime_MAX. + + Use _PyTime_GetMonotonicClockWithInfo() to check for failure. */ +PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); + /* Get the time of a monotonic clock, i.e. a clock that cannot go backwards. The clock is not affected by system clock updates. The reference point of the returned value is undefined, so that only the difference between the @@ -209,10 +211,6 @@ PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( _Py_clock_info_t *info); -/* Initialize time. - Return 0 on success, raise an exception and return -1 on error. */ -PyAPI_FUNC(int) _PyTime_Init(void); - /* Converts a timestamp to the Gregorian time, using the local time zone. Return 0 on success, raise an exception and return -1 on error. */ PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); @@ -224,8 +222,11 @@ PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); /* Get the performance counter: clock with the highest available resolution to measure a short duration. - The function cannot fail. _PyTime_Init() ensures that the system clock - works. */ + If the internal clock fails, silently ignore the error and return 0. + On integer overflow, silently ignore the overflow and truncated the clock to + _PyTime_MIN or _PyTime_MAX. + + Use _PyTime_GetPerfCounterWithInfo() to check for failure. */ PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); /* Get the performance counter: clock with the highest available resolution to diff --git a/Include/cpython/sysmodule.h b/Include/cpython/sysmodule.h index 1802b5b3..fc4c899b 100644 --- a/Include/cpython/sysmodule.h +++ b/Include/cpython/sysmodule.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - PyAPI_FUNC(PyObject *) _PySys_GetObjectId(_Py_Identifier *key); PyAPI_FUNC(int) _PySys_SetObjectId(_Py_Identifier *key, PyObject *); @@ -18,7 +14,3 @@ PyAPI_FUNC(int) PySys_Audit( const char *argFormat, ...); PyAPI_FUNC(int) PySys_AddAuditHook(Py_AuditHookFunction, void*); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/traceback.h b/Include/cpython/traceback.h index 837470c3..aac5b42c 100644 --- a/Include/cpython/traceback.h +++ b/Include/cpython/traceback.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - typedef struct _traceback { PyObject_HEAD struct _traceback *tb_next; @@ -16,7 +12,3 @@ typedef struct _traceback { PyAPI_FUNC(int) _Py_DisplaySourceLine(PyObject *, PyObject *, int, int); PyAPI_FUNC(void) _PyTraceback_Add(const char *, const char *, int); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/tupleobject.h b/Include/cpython/tupleobject.h index 1565f2a5..7cada884 100644 --- a/Include/cpython/tupleobject.h +++ b/Include/cpython/tupleobject.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - typedef struct { PyObject_VAR_HEAD /* ob_item contains space for 'ob_size' elements. @@ -27,10 +23,6 @@ PyAPI_FUNC(void) _PyTuple_MaybeUntrack(PyObject *); #define PyTuple_GET_ITEM(op, i) (_PyTuple_CAST(op)->ob_item[i]) /* Macro, *only* to be used to fill in brand new tuples */ -#define PyTuple_SET_ITEM(op, i, v) (_PyTuple_CAST(op)->ob_item[i] = v) +#define PyTuple_SET_ITEM(op, i, v) ((void)(_PyTuple_CAST(op)->ob_item[i] = v)) PyAPI_FUNC(void) _PyTuple_DebugMallocStats(FILE *out); - -#ifdef __cplusplus -} -#endif diff --git a/Include/cpython/unicodeobject.h b/Include/cpython/unicodeobject.h index 1b460c9f..0b5067f5 100644 --- a/Include/cpython/unicodeobject.h +++ b/Include/cpython/unicodeobject.h @@ -2,10 +2,6 @@ # error "this header file must not be included directly" #endif -#ifdef __cplusplus -extern "C" { -#endif - /* Py_UNICODE was the native Unicode storage format (code unit) used by Python and represents a single Unicode element in the Unicode type. With PEP 393, Py_UNICODE is deprecated and replaced with a @@ -15,6 +11,10 @@ extern "C" { /* --- Internal Unicode Operations ---------------------------------------- */ +#ifndef USE_UNICODE_WCHAR_CACHE +# define USE_UNICODE_WCHAR_CACHE 1 +#endif /* USE_UNICODE_WCHAR_CACHE */ + /* Since splitting on whitespace is an important use case, and whitespace in most situations is solely ASCII whitespace, we optimize for the common case by using a quick look-up table @@ -583,7 +583,7 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( /* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string contains null characters. */ -Py_DEPRECATED(3.3) PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( +PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( PyObject *unicode /* Unicode object */ ); @@ -597,9 +597,6 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( Py_ssize_t *size /* location where to save the length */ ); -/* Get the maximum ordinal for a Unicode character. */ -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void); - /* --- _PyUnicodeWriter API ----------------------------------------------- */ @@ -729,26 +726,6 @@ PyAPI_FUNC(int) _PyUnicode_FormatAdvancedWriter( /* --- Manage the default encoding ---------------------------------------- */ -/* Returns a pointer to the default encoding (UTF-8) of the - Unicode object unicode and the size of the encoded representation - in bytes stored in *size. - - In case of an error, no *size is set. - - This function caches the UTF-8 encoded string in the unicodeobject - and subsequent calls will return the same string. The memory is released - when the unicodeobject is deallocated. - - _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to - support the previous internal function with the same behaviour. -*/ - -PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( - PyObject *unicode, - Py_ssize_t *size); - -#define _PyUnicode_AsStringAndSize PyUnicode_AsUTF8AndSize - /* Returns a pointer to the default encoding (UTF-8) of the Unicode object unicode. @@ -857,20 +834,12 @@ PyAPI_FUNC(PyObject*) _PyUnicode_EncodeUTF16( /* --- Unicode-Escape Codecs ---------------------------------------------- */ -/* Variant of PyUnicode_DecodeUnicodeEscape that supports partial decoding. */ -PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeStateful( - const char *string, /* Unicode-Escape encoded string */ - Py_ssize_t length, /* size of string */ - const char *errors, /* error handling */ - Py_ssize_t *consumed /* bytes consumed */ -); /* Helper for PyUnicode_DecodeUnicodeEscape that detects invalid escape chars. */ -PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscapeInternal( +PyAPI_FUNC(PyObject*) _PyUnicode_DecodeUnicodeEscape( const char *string, /* Unicode-Escape encoded string */ Py_ssize_t length, /* size of string */ const char *errors, /* error handling */ - Py_ssize_t *consumed, /* bytes consumed */ const char **first_invalid_escape /* on return, points to first invalid escaped char in string. */ @@ -888,14 +857,6 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_EncodeRawUnicodeEscape( Py_ssize_t length /* Number of Py_UNICODE chars to encode */ ); -/* Variant of PyUnicode_DecodeRawUnicodeEscape that supports partial decoding. */ -PyAPI_FUNC(PyObject*) _PyUnicode_DecodeRawUnicodeEscapeStateful( - const char *string, /* Unicode-Escape encoded string */ - Py_ssize_t length, /* size of string */ - const char *errors, /* error handling */ - Py_ssize_t *consumed /* bytes consumed */ -); - /* --- Latin-1 Codecs ----------------------------------------------------- */ PyAPI_FUNC(PyObject*) _PyUnicode_AsLatin1String( @@ -1176,53 +1137,8 @@ PyAPI_FUNC(int) _PyUnicode_IsAlpha( Py_UCS4 ch /* Unicode character */ ); -Py_DEPRECATED(3.3) PyAPI_FUNC(size_t) Py_UNICODE_strlen( - const Py_UNICODE *u - ); - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcpy( - Py_UNICODE *s1, - const Py_UNICODE *s2); - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strcat( - Py_UNICODE *s1, const Py_UNICODE *s2); - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strncpy( - Py_UNICODE *s1, - const Py_UNICODE *s2, - size_t n); - -Py_DEPRECATED(3.3) PyAPI_FUNC(int) Py_UNICODE_strcmp( - const Py_UNICODE *s1, - const Py_UNICODE *s2 - ); - -Py_DEPRECATED(3.3) PyAPI_FUNC(int) Py_UNICODE_strncmp( - const Py_UNICODE *s1, - const Py_UNICODE *s2, - size_t n - ); - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strchr( - const Py_UNICODE *s, - Py_UNICODE c - ); - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) Py_UNICODE_strrchr( - const Py_UNICODE *s, - Py_UNICODE c - ); - PyAPI_FUNC(PyObject*) _PyUnicode_FormatLong(PyObject *, int, int, int); -/* Create a copy of a unicode string ending with a nul character. Return NULL - and raise a MemoryError exception on memory allocation failure, otherwise - return a new allocated buffer (use PyMem_Free() to free the buffer). */ - -Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE*) PyUnicode_AsUnicodeCopy( - PyObject *unicode - ); - /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); @@ -1230,8 +1146,7 @@ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); and where the hash values are equal (i.e. a very probable match) */ PyAPI_FUNC(int) _PyUnicode_EQ(PyObject *, PyObject *); -PyAPI_FUNC(Py_ssize_t) _PyUnicode_ScanIdentifier(PyObject *); +PyAPI_FUNC(int) _PyUnicode_WideCharString_Converter(PyObject *, void *); +PyAPI_FUNC(int) _PyUnicode_WideCharString_Opt_Converter(PyObject *, void *); -#ifdef __cplusplus -} -#endif +PyAPI_FUNC(Py_ssize_t) _PyUnicode_ScanIdentifier(PyObject *); diff --git a/Include/datetime.h b/Include/datetime.h index 5d9f2558..bb565201 100644 --- a/Include/datetime.h +++ b/Include/datetime.h @@ -115,6 +115,10 @@ typedef struct /* Apply for date and datetime instances. */ + +// o is a pointer to a time or a datetime object. +#define _PyDateTime_HAS_TZINFO(o) (((_PyDateTime_BaseTZInfo *)(o))->hastzinfo) + #define PyDateTime_GET_YEAR(o) ((((PyDateTime_Date*)o)->data[0] << 8) | \ ((PyDateTime_Date*)o)->data[1]) #define PyDateTime_GET_MONTH(o) (((PyDateTime_Date*)o)->data[2]) @@ -128,6 +132,8 @@ typedef struct (((PyDateTime_DateTime*)o)->data[8] << 8) | \ ((PyDateTime_DateTime*)o)->data[9]) #define PyDateTime_DATE_GET_FOLD(o) (((PyDateTime_DateTime*)o)->fold) +#define PyDateTime_DATE_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \ + ((PyDateTime_DateTime *)(o))->tzinfo : Py_None) /* Apply for time instances. */ #define PyDateTime_TIME_GET_HOUR(o) (((PyDateTime_Time*)o)->data[0]) @@ -138,6 +144,8 @@ typedef struct (((PyDateTime_Time*)o)->data[4] << 8) | \ ((PyDateTime_Time*)o)->data[5]) #define PyDateTime_TIME_GET_FOLD(o) (((PyDateTime_Time*)o)->fold) +#define PyDateTime_TIME_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \ + ((PyDateTime_Time *)(o))->tzinfo : Py_None) /* Apply for time delta instances */ #define PyDateTime_DELTA_GET_DAYS(o) (((PyDateTime_Delta*)o)->days) diff --git a/Include/descrobject.h b/Include/descrobject.h index ead269d1..703bc8fd 100644 --- a/Include/descrobject.h +++ b/Include/descrobject.h @@ -93,7 +93,7 @@ PyAPI_FUNC(PyObject *) PyDescr_NewGetSet(PyTypeObject *, #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) PyDescr_NewWrapper(PyTypeObject *, struct wrapperbase *, void *); -#define PyDescr_IsData(d) (Py_TYPE(d)->tp_descr_set != NULL) +PyAPI_FUNC(int) PyDescr_IsData(PyObject *); #endif PyAPI_FUNC(PyObject *) PyDictProxy_New(PyObject *); diff --git a/Include/dictobject.h b/Include/dictobject.h index c88b0aa0..da5a36ba 100644 --- a/Include/dictobject.h +++ b/Include/dictobject.h @@ -57,6 +57,9 @@ PyAPI_FUNC(int) PyDict_MergeFromSeq2(PyObject *d, PyAPI_FUNC(PyObject *) PyDict_GetItemString(PyObject *dp, const char *key); PyAPI_FUNC(int) PyDict_SetItemString(PyObject *dp, const char *key, PyObject *item); PyAPI_FUNC(int) PyDict_DelItemString(PyObject *dp, const char *key); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); +#endif /* Dictionary (keys, values, items) views */ diff --git a/Include/errcode.h b/Include/errcode.h index 790518b8..2e07fc2c 100644 --- a/Include/errcode.h +++ b/Include/errcode.h @@ -26,10 +26,9 @@ extern "C" { #define E_TOODEEP 20 /* Too many indentation levels */ #define E_DEDENT 21 /* No matching outer block for dedent */ #define E_DECODE 22 /* Error in decoding into Unicode */ -#define E_EOFS 23 /* EOF in triple-quoted string */ -#define E_EOLS 24 /* EOL in single-quoted string */ #define E_LINECONT 25 /* Unexpected characters after a line continuation */ #define E_BADSINGLE 27 /* Ill-formed single statement input */ +#define E_INTERACT_STOP 28 /* Interactive mode stopped tokenization */ #ifdef __cplusplus } diff --git a/Include/eval.h b/Include/eval.h index 2c1c2d05..eda28df8 100644 --- a/Include/eval.h +++ b/Include/eval.h @@ -18,16 +18,6 @@ PyAPI_FUNC(PyObject *) PyEval_EvalCodeEx(PyObject *co, PyObject *kwdefs, PyObject *closure); #ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) _PyEval_EvalCodeWithName( - PyObject *co, - PyObject *globals, PyObject *locals, - PyObject *const *args, Py_ssize_t argcount, - PyObject *const *kwnames, PyObject *const *kwargs, - Py_ssize_t kwcount, int kwstep, - PyObject *const *defs, Py_ssize_t defcount, - PyObject *kwdefs, PyObject *closure, - PyObject *name, PyObject *qualname); - PyAPI_FUNC(PyObject *) _PyEval_CallTracing(PyObject *func, PyObject *args); #endif diff --git a/Include/fileutils.h b/Include/fileutils.h index 12bd071c..16f3b635 100644 --- a/Include/fileutils.h +++ b/Include/fileutils.h @@ -12,10 +12,6 @@ PyAPI_FUNC(wchar_t *) Py_DecodeLocale( PyAPI_FUNC(char*) Py_EncodeLocale( const wchar_t *text, size_t *error_pos); - -PyAPI_FUNC(char*) _Py_EncodeLocaleRaw( - const wchar_t *text, - size_t *error_pos); #endif #ifndef Py_LIMITED_API diff --git a/Include/funcobject.h b/Include/funcobject.h index c5cc9d26..d7acd18c 100644 --- a/Include/funcobject.h +++ b/Include/funcobject.h @@ -7,6 +7,21 @@ extern "C" { #endif + +#define COMMON_FIELDS(PREFIX) \ + PyObject *PREFIX ## globals; \ + PyObject *PREFIX ## builtins; \ + PyObject *PREFIX ## name; \ + PyObject *PREFIX ## qualname; \ + PyObject *PREFIX ## code; /* A code object, the __code__ attribute */ \ + PyObject *PREFIX ## defaults; /* NULL or a tuple */ \ + PyObject *PREFIX ## kwdefaults; /* NULL or a dict */ \ + PyObject *PREFIX ## closure; /* NULL or a tuple of cell objects */ + +typedef struct { + COMMON_FIELDS(fc_) +} PyFrameConstructor; + /* Function objects and code objects should not be confused with each other: * * Function objects are created by the execution of the 'def' statement. @@ -20,18 +35,12 @@ extern "C" { typedef struct { PyObject_HEAD - PyObject *func_code; /* A code object, the __code__ attribute */ - PyObject *func_globals; /* A dictionary (other mappings won't do) */ - PyObject *func_defaults; /* NULL or a tuple */ - PyObject *func_kwdefaults; /* NULL or a dict */ - PyObject *func_closure; /* NULL or a tuple of cell objects */ + COMMON_FIELDS(func_) PyObject *func_doc; /* The __doc__ attribute, can be anything */ - PyObject *func_name; /* The __name__ attribute, a string object */ PyObject *func_dict; /* The __dict__ attribute, a dict or NULL */ PyObject *func_weakreflist; /* List of weak references */ PyObject *func_module; /* The __module__ attribute, can be anything */ PyObject *func_annotations; /* Annotations, a dict or NULL */ - PyObject *func_qualname; /* The qualified name */ vectorcallfunc vectorcall; /* Invariant: @@ -84,6 +93,9 @@ PyAPI_FUNC(PyObject *) _PyFunction_Vectorcall( #define PyFunction_GET_ANNOTATIONS(func) \ (((PyFunctionObject *)func) -> func_annotations) +#define PyFunction_AS_FRAME_CONSTRUCTOR(func) \ + ((PyFrameConstructor *)&((PyFunctionObject *)(func))->func_globals) + /* The classmethod and staticmethod types lives here, too */ PyAPI_DATA(PyTypeObject) PyClassMethod_Type; PyAPI_DATA(PyTypeObject) PyStaticMethod_Type; diff --git a/Include/genobject.h b/Include/genobject.h index 8ffd1564..e965334a 100644 --- a/Include/genobject.h +++ b/Include/genobject.h @@ -9,6 +9,7 @@ extern "C" { #endif #include "pystate.h" /* _PyErr_StackItem */ +#include "abstract.h" /* PySendResult */ /* _PyGenObject_HEAD defines the initial segment of generator and coroutine objects. */ @@ -16,8 +17,6 @@ extern "C" { PyObject_HEAD \ /* Note: gi_frame can be NULL if the generator is "finished" */ \ PyFrameObject *prefix##_frame; \ - /* True if generator is being executed. */ \ - char prefix##_running; \ /* The code object backing the generator */ \ PyObject *prefix##_code; \ /* List of weak reference. */ \ @@ -43,7 +42,6 @@ PyAPI_FUNC(PyObject *) PyGen_NewWithQualName(PyFrameObject *, PyObject *name, PyObject *qualname); PyAPI_FUNC(int) _PyGen_SetStopIterationValue(PyObject *); PyAPI_FUNC(int) _PyGen_FetchStopIterationValue(PyObject **); -PyAPI_FUNC(PyObject *) _PyGen_Send(PyGenObject *, PyObject *); PyObject *_PyGen_yf(PyGenObject *); PyAPI_FUNC(void) _PyGen_Finalize(PyObject *self); diff --git a/Include/graminit.h b/Include/graminit.h deleted file mode 100644 index d1027b7a..00000000 --- a/Include/graminit.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Generated by Parser/pgen */ - -#define single_input 256 -#define file_input 257 -#define eval_input 258 -#define decorator 259 -#define decorators 260 -#define decorated 261 -#define async_funcdef 262 -#define funcdef 263 -#define parameters 264 -#define typedargslist 265 -#define tfpdef 266 -#define varargslist 267 -#define vfpdef 268 -#define stmt 269 -#define simple_stmt 270 -#define small_stmt 271 -#define expr_stmt 272 -#define annassign 273 -#define testlist_star_expr 274 -#define augassign 275 -#define del_stmt 276 -#define pass_stmt 277 -#define flow_stmt 278 -#define break_stmt 279 -#define continue_stmt 280 -#define return_stmt 281 -#define yield_stmt 282 -#define raise_stmt 283 -#define import_stmt 284 -#define import_name 285 -#define import_from 286 -#define import_as_name 287 -#define dotted_as_name 288 -#define import_as_names 289 -#define dotted_as_names 290 -#define dotted_name 291 -#define global_stmt 292 -#define nonlocal_stmt 293 -#define assert_stmt 294 -#define compound_stmt 295 -#define async_stmt 296 -#define if_stmt 297 -#define while_stmt 298 -#define for_stmt 299 -#define try_stmt 300 -#define with_stmt 301 -#define with_item 302 -#define except_clause 303 -#define suite 304 -#define namedexpr_test 305 -#define test 306 -#define test_nocond 307 -#define lambdef 308 -#define lambdef_nocond 309 -#define or_test 310 -#define and_test 311 -#define not_test 312 -#define comparison 313 -#define comp_op 314 -#define star_expr 315 -#define expr 316 -#define xor_expr 317 -#define and_expr 318 -#define shift_expr 319 -#define arith_expr 320 -#define term 321 -#define factor 322 -#define power 323 -#define atom_expr 324 -#define atom 325 -#define testlist_comp 326 -#define trailer 327 -#define subscriptlist 328 -#define subscript 329 -#define sliceop 330 -#define exprlist 331 -#define testlist 332 -#define dictorsetmaker 333 -#define classdef 334 -#define arglist 335 -#define argument 336 -#define comp_iter 337 -#define sync_comp_for 338 -#define comp_for 339 -#define comp_if 340 -#define encoding_decl 341 -#define yield_expr 342 -#define yield_arg 343 -#define func_body_suite 344 -#define func_type_input 345 -#define func_type 346 -#define typelist 347 diff --git a/Include/grammar.h b/Include/grammar.h deleted file mode 100644 index 4b66b1e9..00000000 --- a/Include/grammar.h +++ /dev/null @@ -1,77 +0,0 @@ - -/* Grammar interface */ - -#ifndef Py_GRAMMAR_H -#define Py_GRAMMAR_H -#ifdef __cplusplus -extern "C" { -#endif - -#include "bitset.h" /* Sigh... */ - -/* A label of an arc */ - -typedef struct { - int lb_type; - const char *lb_str; -} label; - -#define EMPTY 0 /* Label number 0 is by definition the empty label */ - -/* A list of labels */ - -typedef struct { - int ll_nlabels; - const label *ll_label; -} labellist; - -/* An arc from one state to another */ - -typedef struct { - short a_lbl; /* Label of this arc */ - short a_arrow; /* State where this arc goes to */ -} arc; - -/* A state in a DFA */ - -typedef struct { - int s_narcs; - const arc *s_arc; /* Array of arcs */ - - /* Optional accelerators */ - int s_lower; /* Lowest label index */ - int s_upper; /* Highest label index */ - int *s_accel; /* Accelerator */ - int s_accept; /* Nonzero for accepting state */ -} state; - -/* A DFA */ - -typedef struct { - int d_type; /* Non-terminal this represents */ - char *d_name; /* For printing */ - int d_nstates; - state *d_state; /* Array of states */ - bitset d_first; -} dfa; - -/* A grammar */ - -typedef struct { - int g_ndfas; - const dfa *g_dfa; /* Array of DFAs */ - const labellist g_ll; - int g_start; /* Start symbol of the grammar */ - int g_accel; /* Set if accelerators present */ -} grammar; - -/* FUNCTIONS */ -const dfa *PyGrammar_FindDFA(grammar *g, int type); -const char *PyGrammar_LabelRepr(label *lb); -void PyGrammar_AddAccelerators(grammar *g); -void PyGrammar_RemoveAccelerators(grammar *); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_GRAMMAR_H */ diff --git a/Include/internal/pegen_interface.h b/Include/internal/pegen_interface.h deleted file mode 100644 index ee4c77ec..00000000 --- a/Include/internal/pegen_interface.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef Py_PEGENINTERFACE -#define Py_PEGENINTERFACE -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#include "Python.h" -#include "Python-ast.h" - -PyAPI_FUNC(mod_ty) PyPegen_ASTFromString( - const char *str, - const char *filename, - int mode, - PyCompilerFlags *flags, - PyArena *arena); -PyAPI_FUNC(mod_ty) PyPegen_ASTFromStringObject( - const char *str, - PyObject* filename, - int mode, - PyCompilerFlags *flags, - PyArena *arena); -PyAPI_FUNC(mod_ty) PyPegen_ASTFromFileObject( - FILE *fp, - PyObject *filename_ob, - int mode, - const char *enc, - const char *ps1, - const char *ps2, - PyCompilerFlags *flags, - int *errcode, - PyArena *arena); -PyAPI_FUNC(mod_ty) PyPegen_ASTFromFilename( - const char *filename, - int mode, - PyCompilerFlags *flags, - PyArena *arena); - - -#ifdef __cplusplus -} -#endif -#endif /* !Py_PEGENINTERFACE*/ diff --git a/Include/internal/pycore_asdl.h b/Include/internal/pycore_asdl.h new file mode 100644 index 00000000..c0b07c31 --- /dev/null +++ b/Include/internal/pycore_asdl.h @@ -0,0 +1,112 @@ +#ifndef Py_INTERNAL_ASDL_H +#define Py_INTERNAL_ASDL_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_pyarena.h" // _PyArena_Malloc() + +typedef PyObject * identifier; +typedef PyObject * string; +typedef PyObject * object; +typedef PyObject * constant; + +/* It would be nice if the code generated by asdl_c.py was completely + independent of Python, but it is a goal the requires too much work + at this stage. So, for example, I'll represent identifiers as + interned Python strings. +*/ + +#define _ASDL_SEQ_HEAD \ + Py_ssize_t size; \ + void **elements; + +typedef struct { + _ASDL_SEQ_HEAD +} asdl_seq; + +typedef struct { + _ASDL_SEQ_HEAD + void *typed_elements[1]; +} asdl_generic_seq; + +typedef struct { + _ASDL_SEQ_HEAD + PyObject *typed_elements[1]; +} asdl_identifier_seq; + +typedef struct { + _ASDL_SEQ_HEAD + int typed_elements[1]; +} asdl_int_seq; + +asdl_generic_seq *_Py_asdl_generic_seq_new(Py_ssize_t size, PyArena *arena); +asdl_identifier_seq *_Py_asdl_identifier_seq_new(Py_ssize_t size, PyArena *arena); +asdl_int_seq *_Py_asdl_int_seq_new(Py_ssize_t size, PyArena *arena); + + +#define GENERATE_ASDL_SEQ_CONSTRUCTOR(NAME, TYPE) \ +asdl_ ## NAME ## _seq *_Py_asdl_ ## NAME ## _seq_new(Py_ssize_t size, PyArena *arena) \ +{ \ + asdl_ ## NAME ## _seq *seq = NULL; \ + size_t n; \ + /* check size is sane */ \ + if (size < 0 || \ + (size && (((size_t)size - 1) > (SIZE_MAX / sizeof(void *))))) { \ + PyErr_NoMemory(); \ + return NULL; \ + } \ + n = (size ? (sizeof(TYPE *) * (size - 1)) : 0); \ + /* check if size can be added safely */ \ + if (n > SIZE_MAX - sizeof(asdl_ ## NAME ## _seq)) { \ + PyErr_NoMemory(); \ + return NULL; \ + } \ + n += sizeof(asdl_ ## NAME ## _seq); \ + seq = (asdl_ ## NAME ## _seq *)_PyArena_Malloc(arena, n); \ + if (!seq) { \ + PyErr_NoMemory(); \ + return NULL; \ + } \ + memset(seq, 0, n); \ + seq->size = size; \ + seq->elements = (void**)seq->typed_elements; \ + return seq; \ +} + +#define asdl_seq_GET_UNTYPED(S, I) (S)->elements[(I)] +#define asdl_seq_GET(S, I) (S)->typed_elements[(I)] +#define asdl_seq_LEN(S) ((S) == NULL ? 0 : (S)->size) + +#ifdef Py_DEBUG +# define asdl_seq_SET(S, I, V) \ + do { \ + Py_ssize_t _asdl_i = (I); \ + assert((S) != NULL); \ + assert(0 <= _asdl_i && _asdl_i < (S)->size); \ + (S)->typed_elements[_asdl_i] = (V); \ + } while (0) +#else +# define asdl_seq_SET(S, I, V) (S)->typed_elements[I] = (V) +#endif + +#ifdef Py_DEBUG +# define asdl_seq_SET_UNTYPED(S, I, V) \ + do { \ + Py_ssize_t _asdl_i = (I); \ + assert((S) != NULL); \ + assert(0 <= _asdl_i && _asdl_i < (S)->size); \ + (S)->elements[_asdl_i] = (V); \ + } while (0) +#else +# define asdl_seq_SET_UNTYPED(S, I, V) (S)->elements[I] = (V) +#endif + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_ASDL_H */ diff --git a/Include/internal/pycore_ast.h b/Include/internal/pycore_ast.h new file mode 100644 index 00000000..ebb6a900 --- /dev/null +++ b/Include/internal/pycore_ast.h @@ -0,0 +1,855 @@ +// File automatically generated by Parser/asdl_c.py. + +#ifndef Py_INTERNAL_AST_H +#define Py_INTERNAL_AST_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "pycore_asdl.h" + +typedef struct _mod *mod_ty; + +typedef struct _stmt *stmt_ty; + +typedef struct _expr *expr_ty; + +typedef enum _expr_context { Load=1, Store=2, Del=3 } expr_context_ty; + +typedef enum _boolop { And=1, Or=2 } boolop_ty; + +typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7, + LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12, + FloorDiv=13 } operator_ty; + +typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; + +typedef enum _cmpop { Eq=1, NotEq=2, Lt=3, LtE=4, Gt=5, GtE=6, Is=7, IsNot=8, + In=9, NotIn=10 } cmpop_ty; + +typedef struct _comprehension *comprehension_ty; + +typedef struct _excepthandler *excepthandler_ty; + +typedef struct _arguments *arguments_ty; + +typedef struct _arg *arg_ty; + +typedef struct _keyword *keyword_ty; + +typedef struct _alias *alias_ty; + +typedef struct _withitem *withitem_ty; + +typedef struct _match_case *match_case_ty; + +typedef struct _pattern *pattern_ty; + +typedef struct _type_ignore *type_ignore_ty; + + +typedef struct { + _ASDL_SEQ_HEAD + mod_ty typed_elements[1]; +} asdl_mod_seq; + +asdl_mod_seq *_Py_asdl_mod_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + stmt_ty typed_elements[1]; +} asdl_stmt_seq; + +asdl_stmt_seq *_Py_asdl_stmt_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + expr_ty typed_elements[1]; +} asdl_expr_seq; + +asdl_expr_seq *_Py_asdl_expr_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + comprehension_ty typed_elements[1]; +} asdl_comprehension_seq; + +asdl_comprehension_seq *_Py_asdl_comprehension_seq_new(Py_ssize_t size, PyArena + *arena); + +typedef struct { + _ASDL_SEQ_HEAD + excepthandler_ty typed_elements[1]; +} asdl_excepthandler_seq; + +asdl_excepthandler_seq *_Py_asdl_excepthandler_seq_new(Py_ssize_t size, PyArena + *arena); + +typedef struct { + _ASDL_SEQ_HEAD + arguments_ty typed_elements[1]; +} asdl_arguments_seq; + +asdl_arguments_seq *_Py_asdl_arguments_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + arg_ty typed_elements[1]; +} asdl_arg_seq; + +asdl_arg_seq *_Py_asdl_arg_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + keyword_ty typed_elements[1]; +} asdl_keyword_seq; + +asdl_keyword_seq *_Py_asdl_keyword_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + alias_ty typed_elements[1]; +} asdl_alias_seq; + +asdl_alias_seq *_Py_asdl_alias_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + withitem_ty typed_elements[1]; +} asdl_withitem_seq; + +asdl_withitem_seq *_Py_asdl_withitem_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + match_case_ty typed_elements[1]; +} asdl_match_case_seq; + +asdl_match_case_seq *_Py_asdl_match_case_seq_new(Py_ssize_t size, PyArena + *arena); + +typedef struct { + _ASDL_SEQ_HEAD + pattern_ty typed_elements[1]; +} asdl_pattern_seq; + +asdl_pattern_seq *_Py_asdl_pattern_seq_new(Py_ssize_t size, PyArena *arena); + +typedef struct { + _ASDL_SEQ_HEAD + type_ignore_ty typed_elements[1]; +} asdl_type_ignore_seq; + +asdl_type_ignore_seq *_Py_asdl_type_ignore_seq_new(Py_ssize_t size, PyArena + *arena); + + +enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, + FunctionType_kind=4}; +struct _mod { + enum _mod_kind kind; + union { + struct { + asdl_stmt_seq *body; + asdl_type_ignore_seq *type_ignores; + } Module; + + struct { + asdl_stmt_seq *body; + } Interactive; + + struct { + expr_ty body; + } Expression; + + struct { + asdl_expr_seq *argtypes; + expr_ty returns; + } FunctionType; + + } v; +}; + +enum _stmt_kind {FunctionDef_kind=1, AsyncFunctionDef_kind=2, ClassDef_kind=3, + Return_kind=4, Delete_kind=5, Assign_kind=6, + AugAssign_kind=7, AnnAssign_kind=8, For_kind=9, + AsyncFor_kind=10, While_kind=11, If_kind=12, With_kind=13, + AsyncWith_kind=14, Match_kind=15, Raise_kind=16, Try_kind=17, + Assert_kind=18, Import_kind=19, ImportFrom_kind=20, + Global_kind=21, Nonlocal_kind=22, Expr_kind=23, Pass_kind=24, + Break_kind=25, Continue_kind=26}; +struct _stmt { + enum _stmt_kind kind; + union { + struct { + identifier name; + arguments_ty args; + asdl_stmt_seq *body; + asdl_expr_seq *decorator_list; + expr_ty returns; + string type_comment; + } FunctionDef; + + struct { + identifier name; + arguments_ty args; + asdl_stmt_seq *body; + asdl_expr_seq *decorator_list; + expr_ty returns; + string type_comment; + } AsyncFunctionDef; + + struct { + identifier name; + asdl_expr_seq *bases; + asdl_keyword_seq *keywords; + asdl_stmt_seq *body; + asdl_expr_seq *decorator_list; + } ClassDef; + + struct { + expr_ty value; + } Return; + + struct { + asdl_expr_seq *targets; + } Delete; + + struct { + asdl_expr_seq *targets; + expr_ty value; + string type_comment; + } Assign; + + struct { + expr_ty target; + operator_ty op; + expr_ty value; + } AugAssign; + + struct { + expr_ty target; + expr_ty annotation; + expr_ty value; + int simple; + } AnnAssign; + + struct { + expr_ty target; + expr_ty iter; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; + string type_comment; + } For; + + struct { + expr_ty target; + expr_ty iter; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; + string type_comment; + } AsyncFor; + + struct { + expr_ty test; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; + } While; + + struct { + expr_ty test; + asdl_stmt_seq *body; + asdl_stmt_seq *orelse; + } If; + + struct { + asdl_withitem_seq *items; + asdl_stmt_seq *body; + string type_comment; + } With; + + struct { + asdl_withitem_seq *items; + asdl_stmt_seq *body; + string type_comment; + } AsyncWith; + + struct { + expr_ty subject; + asdl_match_case_seq *cases; + } Match; + + struct { + expr_ty exc; + expr_ty cause; + } Raise; + + struct { + asdl_stmt_seq *body; + asdl_excepthandler_seq *handlers; + asdl_stmt_seq *orelse; + asdl_stmt_seq *finalbody; + } Try; + + struct { + expr_ty test; + expr_ty msg; + } Assert; + + struct { + asdl_alias_seq *names; + } Import; + + struct { + identifier module; + asdl_alias_seq *names; + int level; + } ImportFrom; + + struct { + asdl_identifier_seq *names; + } Global; + + struct { + asdl_identifier_seq *names; + } Nonlocal; + + struct { + expr_ty value; + } Expr; + + } v; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +enum _expr_kind {BoolOp_kind=1, NamedExpr_kind=2, BinOp_kind=3, UnaryOp_kind=4, + Lambda_kind=5, IfExp_kind=6, Dict_kind=7, Set_kind=8, + ListComp_kind=9, SetComp_kind=10, DictComp_kind=11, + GeneratorExp_kind=12, Await_kind=13, Yield_kind=14, + YieldFrom_kind=15, Compare_kind=16, Call_kind=17, + FormattedValue_kind=18, JoinedStr_kind=19, Constant_kind=20, + Attribute_kind=21, Subscript_kind=22, Starred_kind=23, + Name_kind=24, List_kind=25, Tuple_kind=26, Slice_kind=27}; +struct _expr { + enum _expr_kind kind; + union { + struct { + boolop_ty op; + asdl_expr_seq *values; + } BoolOp; + + struct { + expr_ty target; + expr_ty value; + } NamedExpr; + + struct { + expr_ty left; + operator_ty op; + expr_ty right; + } BinOp; + + struct { + unaryop_ty op; + expr_ty operand; + } UnaryOp; + + struct { + arguments_ty args; + expr_ty body; + } Lambda; + + struct { + expr_ty test; + expr_ty body; + expr_ty orelse; + } IfExp; + + struct { + asdl_expr_seq *keys; + asdl_expr_seq *values; + } Dict; + + struct { + asdl_expr_seq *elts; + } Set; + + struct { + expr_ty elt; + asdl_comprehension_seq *generators; + } ListComp; + + struct { + expr_ty elt; + asdl_comprehension_seq *generators; + } SetComp; + + struct { + expr_ty key; + expr_ty value; + asdl_comprehension_seq *generators; + } DictComp; + + struct { + expr_ty elt; + asdl_comprehension_seq *generators; + } GeneratorExp; + + struct { + expr_ty value; + } Await; + + struct { + expr_ty value; + } Yield; + + struct { + expr_ty value; + } YieldFrom; + + struct { + expr_ty left; + asdl_int_seq *ops; + asdl_expr_seq *comparators; + } Compare; + + struct { + expr_ty func; + asdl_expr_seq *args; + asdl_keyword_seq *keywords; + } Call; + + struct { + expr_ty value; + int conversion; + expr_ty format_spec; + } FormattedValue; + + struct { + asdl_expr_seq *values; + } JoinedStr; + + struct { + constant value; + string kind; + } Constant; + + struct { + expr_ty value; + identifier attr; + expr_context_ty ctx; + } Attribute; + + struct { + expr_ty value; + expr_ty slice; + expr_context_ty ctx; + } Subscript; + + struct { + expr_ty value; + expr_context_ty ctx; + } Starred; + + struct { + identifier id; + expr_context_ty ctx; + } Name; + + struct { + asdl_expr_seq *elts; + expr_context_ty ctx; + } List; + + struct { + asdl_expr_seq *elts; + expr_context_ty ctx; + } Tuple; + + struct { + expr_ty lower; + expr_ty upper; + expr_ty step; + } Slice; + + } v; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +struct _comprehension { + expr_ty target; + expr_ty iter; + asdl_expr_seq *ifs; + int is_async; +}; + +enum _excepthandler_kind {ExceptHandler_kind=1}; +struct _excepthandler { + enum _excepthandler_kind kind; + union { + struct { + expr_ty type; + identifier name; + asdl_stmt_seq *body; + } ExceptHandler; + + } v; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +struct _arguments { + asdl_arg_seq *posonlyargs; + asdl_arg_seq *args; + arg_ty vararg; + asdl_arg_seq *kwonlyargs; + asdl_expr_seq *kw_defaults; + arg_ty kwarg; + asdl_expr_seq *defaults; +}; + +struct _arg { + identifier arg; + expr_ty annotation; + string type_comment; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +struct _keyword { + identifier arg; + expr_ty value; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +struct _alias { + identifier name; + identifier asname; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +struct _withitem { + expr_ty context_expr; + expr_ty optional_vars; +}; + +struct _match_case { + pattern_ty pattern; + expr_ty guard; + asdl_stmt_seq *body; +}; + +enum _pattern_kind {MatchValue_kind=1, MatchSingleton_kind=2, + MatchSequence_kind=3, MatchMapping_kind=4, + MatchClass_kind=5, MatchStar_kind=6, MatchAs_kind=7, + MatchOr_kind=8}; +struct _pattern { + enum _pattern_kind kind; + union { + struct { + expr_ty value; + } MatchValue; + + struct { + constant value; + } MatchSingleton; + + struct { + asdl_pattern_seq *patterns; + } MatchSequence; + + struct { + asdl_expr_seq *keys; + asdl_pattern_seq *patterns; + identifier rest; + } MatchMapping; + + struct { + expr_ty cls; + asdl_pattern_seq *patterns; + asdl_identifier_seq *kwd_attrs; + asdl_pattern_seq *kwd_patterns; + } MatchClass; + + struct { + identifier name; + } MatchStar; + + struct { + pattern_ty pattern; + identifier name; + } MatchAs; + + struct { + asdl_pattern_seq *patterns; + } MatchOr; + + } v; + int lineno; + int col_offset; + int end_lineno; + int end_col_offset; +}; + +enum _type_ignore_kind {TypeIgnore_kind=1}; +struct _type_ignore { + enum _type_ignore_kind kind; + union { + struct { + int lineno; + string tag; + } TypeIgnore; + + } v; +}; + + +// Note: these macros affect function definitions, not only call sites. +mod_ty _PyAST_Module(asdl_stmt_seq * body, asdl_type_ignore_seq * type_ignores, + PyArena *arena); +mod_ty _PyAST_Interactive(asdl_stmt_seq * body, PyArena *arena); +mod_ty _PyAST_Expression(expr_ty body, PyArena *arena); +mod_ty _PyAST_FunctionType(asdl_expr_seq * argtypes, expr_ty returns, PyArena + *arena); +stmt_ty _PyAST_FunctionDef(identifier name, arguments_ty args, asdl_stmt_seq * + body, asdl_expr_seq * decorator_list, expr_ty + returns, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +stmt_ty _PyAST_AsyncFunctionDef(identifier name, arguments_ty args, + asdl_stmt_seq * body, asdl_expr_seq * + decorator_list, expr_ty returns, string + type_comment, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_ClassDef(identifier name, asdl_expr_seq * bases, + asdl_keyword_seq * keywords, asdl_stmt_seq * body, + asdl_expr_seq * decorator_list, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +stmt_ty _PyAST_Return(expr_ty value, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Delete(asdl_expr_seq * targets, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Assign(asdl_expr_seq * targets, expr_ty value, string + type_comment, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +stmt_ty _PyAST_AugAssign(expr_ty target, operator_ty op, expr_ty value, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int + simple, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +stmt_ty _PyAST_For(expr_ty target, expr_ty iter, asdl_stmt_seq * body, + asdl_stmt_seq * orelse, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +stmt_ty _PyAST_AsyncFor(expr_ty target, expr_ty iter, asdl_stmt_seq * body, + asdl_stmt_seq * orelse, string type_comment, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_While(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * + orelse, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_If(expr_ty test, asdl_stmt_seq * body, asdl_stmt_seq * orelse, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_With(asdl_withitem_seq * items, asdl_stmt_seq * body, string + type_comment, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +stmt_ty _PyAST_AsyncWith(asdl_withitem_seq * items, asdl_stmt_seq * body, + string type_comment, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Match(expr_ty subject, asdl_match_case_seq * cases, int lineno, + int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +stmt_ty _PyAST_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Try(asdl_stmt_seq * body, asdl_excepthandler_seq * handlers, + asdl_stmt_seq * orelse, asdl_stmt_seq * finalbody, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +stmt_ty _PyAST_Assert(expr_ty test, expr_ty msg, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Import(asdl_alias_seq * names, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_ImportFrom(identifier module, asdl_alias_seq * names, int level, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_Global(asdl_identifier_seq * names, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Nonlocal(asdl_identifier_seq * names, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +stmt_ty _PyAST_Expr(expr_ty value, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +stmt_ty _PyAST_Pass(int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_Break(int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +stmt_ty _PyAST_Continue(int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_BoolOp(boolop_ty op, asdl_expr_seq * values, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_NamedExpr(expr_ty target, expr_ty value, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +expr_ty _PyAST_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, + int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +expr_ty _PyAST_UnaryOp(unaryop_ty op, expr_ty operand, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_Lambda(arguments_ty args, expr_ty body, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_IfExp(expr_ty test, expr_ty body, expr_ty orelse, int lineno, + int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +expr_ty _PyAST_Dict(asdl_expr_seq * keys, asdl_expr_seq * values, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_Set(asdl_expr_seq * elts, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +expr_ty _PyAST_ListComp(expr_ty elt, asdl_comprehension_seq * generators, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_SetComp(expr_ty elt, asdl_comprehension_seq * generators, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_DictComp(expr_ty key, expr_ty value, asdl_comprehension_seq * + generators, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +expr_ty _PyAST_GeneratorExp(expr_ty elt, asdl_comprehension_seq * generators, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_Await(expr_ty value, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +expr_ty _PyAST_Yield(expr_ty value, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +expr_ty _PyAST_YieldFrom(expr_ty value, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +expr_ty _PyAST_Compare(expr_ty left, asdl_int_seq * ops, asdl_expr_seq * + comparators, int lineno, int col_offset, int end_lineno, + int end_col_offset, PyArena *arena); +expr_ty _PyAST_Call(expr_ty func, asdl_expr_seq * args, asdl_keyword_seq * + keywords, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_FormattedValue(expr_ty value, int conversion, expr_ty + format_spec, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +expr_ty _PyAST_JoinedStr(asdl_expr_seq * values, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); +expr_ty _PyAST_Constant(constant value, string kind, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_Attribute(expr_ty value, identifier attr, expr_context_ty ctx, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_Subscript(expr_ty value, expr_ty slice, expr_context_ty ctx, int + lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +expr_ty _PyAST_Starred(expr_ty value, expr_context_ty ctx, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_Name(identifier id, expr_context_ty ctx, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_List(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_Tuple(asdl_expr_seq * elts, expr_context_ty ctx, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +expr_ty _PyAST_Slice(expr_ty lower, expr_ty upper, expr_ty step, int lineno, + int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +comprehension_ty _PyAST_comprehension(expr_ty target, expr_ty iter, + asdl_expr_seq * ifs, int is_async, + PyArena *arena); +excepthandler_ty _PyAST_ExceptHandler(expr_ty type, identifier name, + asdl_stmt_seq * body, int lineno, int + col_offset, int end_lineno, int + end_col_offset, PyArena *arena); +arguments_ty _PyAST_arguments(asdl_arg_seq * posonlyargs, asdl_arg_seq * args, + arg_ty vararg, asdl_arg_seq * kwonlyargs, + asdl_expr_seq * kw_defaults, arg_ty kwarg, + asdl_expr_seq * defaults, PyArena *arena); +arg_ty _PyAST_arg(identifier arg, expr_ty annotation, string type_comment, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +keyword_ty _PyAST_keyword(identifier arg, expr_ty value, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +alias_ty _PyAST_alias(identifier name, identifier asname, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena + *arena); +withitem_ty _PyAST_withitem(expr_ty context_expr, expr_ty optional_vars, + PyArena *arena); +match_case_ty _PyAST_match_case(pattern_ty pattern, expr_ty guard, + asdl_stmt_seq * body, PyArena *arena); +pattern_ty _PyAST_MatchValue(expr_ty value, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +pattern_ty _PyAST_MatchSingleton(constant value, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena + *arena); +pattern_ty _PyAST_MatchSequence(asdl_pattern_seq * patterns, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +pattern_ty _PyAST_MatchMapping(asdl_expr_seq * keys, asdl_pattern_seq * + patterns, identifier rest, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +pattern_ty _PyAST_MatchClass(expr_ty cls, asdl_pattern_seq * patterns, + asdl_identifier_seq * kwd_attrs, asdl_pattern_seq + * kwd_patterns, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +pattern_ty _PyAST_MatchStar(identifier name, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +pattern_ty _PyAST_MatchAs(pattern_ty pattern, identifier name, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +pattern_ty _PyAST_MatchOr(asdl_pattern_seq * patterns, int lineno, int + col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +type_ignore_ty _PyAST_TypeIgnore(int lineno, string tag, PyArena *arena); + + +PyObject* PyAST_mod2obj(mod_ty t); +mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); +int PyAST_Check(PyObject* obj); + +extern int _PyAST_Validate(mod_ty); + +/* _PyAST_ExprAsUnicode is defined in ast_unparse.c */ +extern PyObject* _PyAST_ExprAsUnicode(expr_ty); + +/* Return the borrowed reference to the first literal string in the + sequence of statements or NULL if it doesn't start from a literal string. + Doesn't set exception. */ +extern PyObject* _PyAST_GetDocString(asdl_stmt_seq *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_AST_H */ diff --git a/Include/internal/pycore_ast_state.h b/Include/internal/pycore_ast_state.h new file mode 100644 index 00000000..882cd09c --- /dev/null +++ b/Include/internal/pycore_ast_state.h @@ -0,0 +1,255 @@ +// File automatically generated by Parser/asdl_c.py. + +#ifndef Py_INTERNAL_AST_STATE_H +#define Py_INTERNAL_AST_STATE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +struct ast_state { + int initialized; + PyObject *AST_type; + PyObject *Add_singleton; + PyObject *Add_type; + PyObject *And_singleton; + PyObject *And_type; + PyObject *AnnAssign_type; + PyObject *Assert_type; + PyObject *Assign_type; + PyObject *AsyncFor_type; + PyObject *AsyncFunctionDef_type; + PyObject *AsyncWith_type; + PyObject *Attribute_type; + PyObject *AugAssign_type; + PyObject *Await_type; + PyObject *BinOp_type; + PyObject *BitAnd_singleton; + PyObject *BitAnd_type; + PyObject *BitOr_singleton; + PyObject *BitOr_type; + PyObject *BitXor_singleton; + PyObject *BitXor_type; + PyObject *BoolOp_type; + PyObject *Break_type; + PyObject *Call_type; + PyObject *ClassDef_type; + PyObject *Compare_type; + PyObject *Constant_type; + PyObject *Continue_type; + PyObject *Del_singleton; + PyObject *Del_type; + PyObject *Delete_type; + PyObject *DictComp_type; + PyObject *Dict_type; + PyObject *Div_singleton; + PyObject *Div_type; + PyObject *Eq_singleton; + PyObject *Eq_type; + PyObject *ExceptHandler_type; + PyObject *Expr_type; + PyObject *Expression_type; + PyObject *FloorDiv_singleton; + PyObject *FloorDiv_type; + PyObject *For_type; + PyObject *FormattedValue_type; + PyObject *FunctionDef_type; + PyObject *FunctionType_type; + PyObject *GeneratorExp_type; + PyObject *Global_type; + PyObject *GtE_singleton; + PyObject *GtE_type; + PyObject *Gt_singleton; + PyObject *Gt_type; + PyObject *IfExp_type; + PyObject *If_type; + PyObject *ImportFrom_type; + PyObject *Import_type; + PyObject *In_singleton; + PyObject *In_type; + PyObject *Interactive_type; + PyObject *Invert_singleton; + PyObject *Invert_type; + PyObject *IsNot_singleton; + PyObject *IsNot_type; + PyObject *Is_singleton; + PyObject *Is_type; + PyObject *JoinedStr_type; + PyObject *LShift_singleton; + PyObject *LShift_type; + PyObject *Lambda_type; + PyObject *ListComp_type; + PyObject *List_type; + PyObject *Load_singleton; + PyObject *Load_type; + PyObject *LtE_singleton; + PyObject *LtE_type; + PyObject *Lt_singleton; + PyObject *Lt_type; + PyObject *MatMult_singleton; + PyObject *MatMult_type; + PyObject *MatchAs_type; + PyObject *MatchClass_type; + PyObject *MatchMapping_type; + PyObject *MatchOr_type; + PyObject *MatchSequence_type; + PyObject *MatchSingleton_type; + PyObject *MatchStar_type; + PyObject *MatchValue_type; + PyObject *Match_type; + PyObject *Mod_singleton; + PyObject *Mod_type; + PyObject *Module_type; + PyObject *Mult_singleton; + PyObject *Mult_type; + PyObject *Name_type; + PyObject *NamedExpr_type; + PyObject *Nonlocal_type; + PyObject *NotEq_singleton; + PyObject *NotEq_type; + PyObject *NotIn_singleton; + PyObject *NotIn_type; + PyObject *Not_singleton; + PyObject *Not_type; + PyObject *Or_singleton; + PyObject *Or_type; + PyObject *Pass_type; + PyObject *Pow_singleton; + PyObject *Pow_type; + PyObject *RShift_singleton; + PyObject *RShift_type; + PyObject *Raise_type; + PyObject *Return_type; + PyObject *SetComp_type; + PyObject *Set_type; + PyObject *Slice_type; + PyObject *Starred_type; + PyObject *Store_singleton; + PyObject *Store_type; + PyObject *Sub_singleton; + PyObject *Sub_type; + PyObject *Subscript_type; + PyObject *Try_type; + PyObject *Tuple_type; + PyObject *TypeIgnore_type; + PyObject *UAdd_singleton; + PyObject *UAdd_type; + PyObject *USub_singleton; + PyObject *USub_type; + PyObject *UnaryOp_type; + PyObject *While_type; + PyObject *With_type; + PyObject *YieldFrom_type; + PyObject *Yield_type; + PyObject *__dict__; + PyObject *__doc__; + PyObject *__match_args__; + PyObject *__module__; + PyObject *_attributes; + PyObject *_fields; + PyObject *alias_type; + PyObject *annotation; + PyObject *arg; + PyObject *arg_type; + PyObject *args; + PyObject *argtypes; + PyObject *arguments_type; + PyObject *asname; + PyObject *ast; + PyObject *attr; + PyObject *bases; + PyObject *body; + PyObject *boolop_type; + PyObject *cases; + PyObject *cause; + PyObject *cls; + PyObject *cmpop_type; + PyObject *col_offset; + PyObject *comparators; + PyObject *comprehension_type; + PyObject *context_expr; + PyObject *conversion; + PyObject *ctx; + PyObject *decorator_list; + PyObject *defaults; + PyObject *elt; + PyObject *elts; + PyObject *end_col_offset; + PyObject *end_lineno; + PyObject *exc; + PyObject *excepthandler_type; + PyObject *expr_context_type; + PyObject *expr_type; + PyObject *finalbody; + PyObject *format_spec; + PyObject *func; + PyObject *generators; + PyObject *guard; + PyObject *handlers; + PyObject *id; + PyObject *ifs; + PyObject *is_async; + PyObject *items; + PyObject *iter; + PyObject *key; + PyObject *keys; + PyObject *keyword_type; + PyObject *keywords; + PyObject *kind; + PyObject *kw_defaults; + PyObject *kwarg; + PyObject *kwd_attrs; + PyObject *kwd_patterns; + PyObject *kwonlyargs; + PyObject *left; + PyObject *level; + PyObject *lineno; + PyObject *lower; + PyObject *match_case_type; + PyObject *mod_type; + PyObject *module; + PyObject *msg; + PyObject *name; + PyObject *names; + PyObject *op; + PyObject *operand; + PyObject *operator_type; + PyObject *ops; + PyObject *optional_vars; + PyObject *orelse; + PyObject *pattern; + PyObject *pattern_type; + PyObject *patterns; + PyObject *posonlyargs; + PyObject *rest; + PyObject *returns; + PyObject *right; + PyObject *simple; + PyObject *slice; + PyObject *step; + PyObject *stmt_type; + PyObject *subject; + PyObject *tag; + PyObject *target; + PyObject *targets; + PyObject *test; + PyObject *type; + PyObject *type_comment; + PyObject *type_ignore_type; + PyObject *type_ignores; + PyObject *unaryop_type; + PyObject *upper; + PyObject *value; + PyObject *values; + PyObject *vararg; + PyObject *withitem_type; +}; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_AST_STATE_H */ + diff --git a/Include/internal/pycore_atomic.h b/Include/internal/pycore_atomic.h index 1d5c5621..3d42e544 100644 --- a/Include/internal/pycore_atomic.h +++ b/Include/internal/pycore_atomic.h @@ -11,8 +11,8 @@ extern "C" { #include "dynamic_annotations.h" /* _Py_ANNOTATE_MEMORY_ORDER */ #include "pyconfig.h" -#if defined(HAVE_STD_ATOMIC) -#include +#ifdef HAVE_STD_ATOMIC +# include #endif @@ -62,7 +62,7 @@ typedef struct _Py_atomic_int { #define _Py_atomic_load_explicit(ATOMIC_VAL, ORDER) \ atomic_load_explicit(&((ATOMIC_VAL)->_value), ORDER) -/* Use builtin atomic operations in GCC >= 4.7 */ +// Use builtin atomic operations in GCC >= 4.7 and clang #elif defined(HAVE_BUILTIN_ATOMIC) typedef enum _Py_memory_order { diff --git a/Include/internal/pycore_atomic_funcs.h b/Include/internal/pycore_atomic_funcs.h new file mode 100644 index 00000000..a708789c --- /dev/null +++ b/Include/internal/pycore_atomic_funcs.h @@ -0,0 +1,94 @@ +/* Atomic functions: similar to pycore_atomic.h, but don't need + to declare variables as atomic. + + Py_ssize_t type: + + * value = _Py_atomic_size_get(&var) + * _Py_atomic_size_set(&var, value) + + Use sequentially-consistent ordering (__ATOMIC_SEQ_CST memory order): + enforce total ordering with all other atomic functions. +*/ +#ifndef Py_ATOMIC_FUNC_H +#define Py_ATOMIC_FUNC_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#if defined(_MSC_VER) +# include // _InterlockedExchange() +#endif + + +// Use builtin atomic operations in GCC >= 4.7 and clang +#ifdef HAVE_BUILTIN_ATOMIC + +static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) +{ + return __atomic_load_n(var, __ATOMIC_SEQ_CST); +} + +static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) +{ + __atomic_store_n(var, value, __ATOMIC_SEQ_CST); +} + +#elif defined(_MSC_VER) + +static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) +{ +#if SIZEOF_VOID_P == 8 + Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); + volatile __int64 *volatile_var = (volatile __int64 *)var; + __int64 old; + do { + old = *volatile_var; + } while(_InterlockedCompareExchange64(volatile_var, old, old) != old); +#else + Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); + volatile long *volatile_var = (volatile long *)var; + long old; + do { + old = *volatile_var; + } while(_InterlockedCompareExchange(volatile_var, old, old) != old); +#endif + return old; +} + +static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) +{ +#if SIZEOF_VOID_P == 8 + Py_BUILD_ASSERT(sizeof(__int64) == sizeof(*var)); + volatile __int64 *volatile_var = (volatile __int64 *)var; + _InterlockedExchange64(volatile_var, value); +#else + Py_BUILD_ASSERT(sizeof(long) == sizeof(*var)); + volatile long *volatile_var = (volatile long *)var; + _InterlockedExchange(volatile_var, value); +#endif +} + +#else +// Fallback implementation using volatile + +static inline Py_ssize_t _Py_atomic_size_get(Py_ssize_t *var) +{ + volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; + return *volatile_var; +} + +static inline void _Py_atomic_size_set(Py_ssize_t *var, Py_ssize_t value) +{ + volatile Py_ssize_t *volatile_var = (volatile Py_ssize_t *)var; + *volatile_var = value; +} +#endif + +#ifdef __cplusplus +} +#endif +#endif /* Py_ATOMIC_FUNC_H */ diff --git a/Include/internal/pycore_bitutils.h b/Include/internal/pycore_bitutils.h new file mode 100644 index 00000000..e4aa7a3d --- /dev/null +++ b/Include/internal/pycore_bitutils.h @@ -0,0 +1,176 @@ +/* Bit and bytes utilities. + + Bytes swap functions, reverse order of bytes: + + - _Py_bswap16(uint16_t) + - _Py_bswap32(uint32_t) + - _Py_bswap64(uint64_t) +*/ + +#ifndef Py_INTERNAL_BITUTILS_H +#define Py_INTERNAL_BITUTILS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#if defined(__GNUC__) \ + && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) + /* __builtin_bswap16() is available since GCC 4.8, + __builtin_bswap32() is available since GCC 4.3, + __builtin_bswap64() is available since GCC 4.3. */ +# define _PY_HAVE_BUILTIN_BSWAP +#endif + +#ifdef _MSC_VER + /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */ +# include +#endif + +static inline uint16_t +_Py_bswap16(uint16_t word) +{ +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap16) + return __builtin_bswap16(word); +#elif defined(_MSC_VER) + Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short)); + return _byteswap_ushort(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT16_C(0x00FF)) << 8) + | ((word & UINT16_C(0xFF00)) >> 8)); +#endif +} + +static inline uint32_t +_Py_bswap32(uint32_t word) +{ +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap32) + return __builtin_bswap32(word); +#elif defined(_MSC_VER) + Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long)); + return _byteswap_ulong(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT32_C(0x000000FF)) << 24) + | ((word & UINT32_C(0x0000FF00)) << 8) + | ((word & UINT32_C(0x00FF0000)) >> 8) + | ((word & UINT32_C(0xFF000000)) >> 24)); +#endif +} + +static inline uint64_t +_Py_bswap64(uint64_t word) +{ +#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap64) + return __builtin_bswap64(word); +#elif defined(_MSC_VER) + return _byteswap_uint64(word); +#else + // Portable implementation which doesn't rely on circular bit shift + return ( ((word & UINT64_C(0x00000000000000FF)) << 56) + | ((word & UINT64_C(0x000000000000FF00)) << 40) + | ((word & UINT64_C(0x0000000000FF0000)) << 24) + | ((word & UINT64_C(0x00000000FF000000)) << 8) + | ((word & UINT64_C(0x000000FF00000000)) >> 8) + | ((word & UINT64_C(0x0000FF0000000000)) >> 24) + | ((word & UINT64_C(0x00FF000000000000)) >> 40) + | ((word & UINT64_C(0xFF00000000000000)) >> 56)); +#endif +} + + +// Population count: count the number of 1's in 'x' +// (number of bits set to 1), also known as the hamming weight. +// +// Implementation note. CPUID is not used, to test if x86 POPCNT instruction +// can be used, to keep the implementation simple. For example, Visual Studio +// __popcnt() is not used this reason. The clang and GCC builtin function can +// use the x86 POPCNT instruction if the target architecture has SSE4a or +// newer. +static inline int +_Py_popcount32(uint32_t x) +{ +#if (defined(__clang__) || defined(__GNUC__)) + +#if SIZEOF_INT >= 4 + Py_BUILD_ASSERT(sizeof(x) <= sizeof(unsigned int)); + return __builtin_popcount(x); +#else + // The C standard guarantees that unsigned long will always be big enough + // to hold a uint32_t value without losing information. + Py_BUILD_ASSERT(sizeof(x) <= sizeof(unsigned long)); + return __builtin_popcountl(x); +#endif + +#else + // 32-bit SWAR (SIMD Within A Register) popcount + + // Binary: 0 1 0 1 ... + const uint32_t M1 = 0x55555555; + // Binary: 00 11 00 11. .. + const uint32_t M2 = 0x33333333; + // Binary: 0000 1111 0000 1111 ... + const uint32_t M4 = 0x0F0F0F0F; + // 256**4 + 256**3 + 256**2 + 256**1 + const uint32_t SUM = 0x01010101; + + // Put count of each 2 bits into those 2 bits + x = x - ((x >> 1) & M1); + // Put count of each 4 bits into those 4 bits + x = (x & M2) + ((x >> 2) & M2); + // Put count of each 8 bits into those 8 bits + x = (x + (x >> 4)) & M4; + // Sum of the 4 byte counts + return (uint32_t)((uint64_t)x * (uint64_t)SUM) >> 24; +#endif +} + + +// Return the index of the most significant 1 bit in 'x'. This is the smallest +// integer k such that x < 2**k. Equivalent to floor(log2(x)) + 1 for x != 0. +static inline int +_Py_bit_length(unsigned long x) +{ +#if (defined(__clang__) || defined(__GNUC__)) + if (x != 0) { + // __builtin_clzl() is available since GCC 3.4. + // Undefined behavior for x == 0. + return (int)sizeof(unsigned long) * 8 - __builtin_clzl(x); + } + else { + return 0; + } +#elif defined(_MSC_VER) + // _BitScanReverse() is documented to search 32 bits. + Py_BUILD_ASSERT(sizeof(unsigned long) <= 4); + unsigned long msb; + if (_BitScanReverse(&msb, x)) { + return (int)msb + 1; + } + else { + return 0; + } +#else + const int BIT_LENGTH_TABLE[32] = { + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 + }; + int msb = 0; + while (x >= 32) { + msb += 6; + x >>= 6; + } + msb += BIT_LENGTH_TABLE[x]; + return msb; +#endif +} + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_BITUTILS_H */ diff --git a/Include/internal/pycore_blocks_output_buffer.h b/Include/internal/pycore_blocks_output_buffer.h new file mode 100644 index 00000000..28cf6fba --- /dev/null +++ b/Include/internal/pycore_blocks_output_buffer.h @@ -0,0 +1,317 @@ +/* + _BlocksOutputBuffer is used to maintain an output buffer + that has unpredictable size. Suitable for compression/decompression + API (bz2/lzma/zlib) that has stream->next_out and stream->avail_out: + + stream->next_out: point to the next output position. + stream->avail_out: the number of available bytes left in the buffer. + + It maintains a list of bytes object, so there is no overhead of resizing + the buffer. + + Usage: + + 1, Initialize the struct instance like this: + _BlocksOutputBuffer buffer = {.list = NULL}; + Set .list to NULL for _BlocksOutputBuffer_OnError() + + 2, Initialize the buffer use one of these functions: + _BlocksOutputBuffer_InitAndGrow() + _BlocksOutputBuffer_InitWithSize() + + 3, If (avail_out == 0), grow the buffer: + _BlocksOutputBuffer_Grow() + + 4, Get the current outputted data size: + _BlocksOutputBuffer_GetDataSize() + + 5, Finish the buffer, and return a bytes object: + _BlocksOutputBuffer_Finish() + + 6, Clean up the buffer when an error occurred: + _BlocksOutputBuffer_OnError() +*/ + +#ifndef Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H +#define Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "Python.h" + +typedef struct { + // List of bytes objects + PyObject *list; + // Number of whole allocated size + Py_ssize_t allocated; + // Max length of the buffer, negative number means unlimited length. + Py_ssize_t max_length; +} _BlocksOutputBuffer; + +static const char unable_allocate_msg[] = "Unable to allocate output buffer."; + +/* In 32-bit build, the max block size should <= INT32_MAX. */ +#define OUTPUT_BUFFER_MAX_BLOCK_SIZE (256*1024*1024) + +/* Block size sequence */ +#define KB (1024) +#define MB (1024*1024) +static const Py_ssize_t BUFFER_BLOCK_SIZE[] = + { 32*KB, 64*KB, 256*KB, 1*MB, 4*MB, 8*MB, 16*MB, 16*MB, + 32*MB, 32*MB, 32*MB, 32*MB, 64*MB, 64*MB, 128*MB, 128*MB, + OUTPUT_BUFFER_MAX_BLOCK_SIZE }; +#undef KB +#undef MB + +/* According to the block sizes defined by BUFFER_BLOCK_SIZE, the whole + allocated size growth step is: + 1 32 KB +32 KB + 2 96 KB +64 KB + 3 352 KB +256 KB + 4 1.34 MB +1 MB + 5 5.34 MB +4 MB + 6 13.34 MB +8 MB + 7 29.34 MB +16 MB + 8 45.34 MB +16 MB + 9 77.34 MB +32 MB + 10 109.34 MB +32 MB + 11 141.34 MB +32 MB + 12 173.34 MB +32 MB + 13 237.34 MB +64 MB + 14 301.34 MB +64 MB + 15 429.34 MB +128 MB + 16 557.34 MB +128 MB + 17 813.34 MB +256 MB + 18 1069.34 MB +256 MB + 19 1325.34 MB +256 MB + 20 1581.34 MB +256 MB + 21 1837.34 MB +256 MB + 22 2093.34 MB +256 MB + ... +*/ + +/* Initialize the buffer, and grow the buffer. + + max_length: Max length of the buffer, -1 for unlimited length. + + On success, return allocated size (>=0) + On failure, return -1 +*/ +static inline Py_ssize_t +_BlocksOutputBuffer_InitAndGrow(_BlocksOutputBuffer *buffer, + const Py_ssize_t max_length, + void **next_out) +{ + PyObject *b; + Py_ssize_t block_size; + + // ensure .list was set to NULL + assert(buffer->list == NULL); + + // get block size + if (0 <= max_length && max_length < BUFFER_BLOCK_SIZE[0]) { + block_size = max_length; + } else { + block_size = BUFFER_BLOCK_SIZE[0]; + } + + // the first block + b = PyBytes_FromStringAndSize(NULL, block_size); + if (b == NULL) { + return -1; + } + + // create the list + buffer->list = PyList_New(1); + if (buffer->list == NULL) { + Py_DECREF(b); + return -1; + } + PyList_SET_ITEM(buffer->list, 0, b); + + // set variables + buffer->allocated = block_size; + buffer->max_length = max_length; + + *next_out = PyBytes_AS_STRING(b); + return block_size; +} + +/* Initialize the buffer, with an initial size. + + Check block size limit in the outer wrapper function. For example, some libs + accept UINT32_MAX as the maximum block size, then init_size should <= it. + + On success, return allocated size (>=0) + On failure, return -1 +*/ +static inline Py_ssize_t +_BlocksOutputBuffer_InitWithSize(_BlocksOutputBuffer *buffer, + const Py_ssize_t init_size, + void **next_out) +{ + PyObject *b; + + // ensure .list was set to NULL + assert(buffer->list == NULL); + + // the first block + b = PyBytes_FromStringAndSize(NULL, init_size); + if (b == NULL) { + PyErr_SetString(PyExc_MemoryError, unable_allocate_msg); + return -1; + } + + // create the list + buffer->list = PyList_New(1); + if (buffer->list == NULL) { + Py_DECREF(b); + return -1; + } + PyList_SET_ITEM(buffer->list, 0, b); + + // set variables + buffer->allocated = init_size; + buffer->max_length = -1; + + *next_out = PyBytes_AS_STRING(b); + return init_size; +} + +/* Grow the buffer. The avail_out must be 0, please check it before calling. + + On success, return allocated size (>=0) + On failure, return -1 +*/ +static inline Py_ssize_t +_BlocksOutputBuffer_Grow(_BlocksOutputBuffer *buffer, + void **next_out, + const Py_ssize_t avail_out) +{ + PyObject *b; + const Py_ssize_t list_len = Py_SIZE(buffer->list); + Py_ssize_t block_size; + + // ensure no gaps in the data + if (avail_out != 0) { + PyErr_SetString(PyExc_SystemError, + "avail_out is non-zero in _BlocksOutputBuffer_Grow()."); + return -1; + } + + // get block size + if (list_len < (Py_ssize_t) Py_ARRAY_LENGTH(BUFFER_BLOCK_SIZE)) { + block_size = BUFFER_BLOCK_SIZE[list_len]; + } else { + block_size = BUFFER_BLOCK_SIZE[Py_ARRAY_LENGTH(BUFFER_BLOCK_SIZE) - 1]; + } + + // check max_length + if (buffer->max_length >= 0) { + // if (rest == 0), should not grow the buffer. + Py_ssize_t rest = buffer->max_length - buffer->allocated; + assert(rest > 0); + + // block_size of the last block + if (block_size > rest) { + block_size = rest; + } + } + + // check buffer->allocated overflow + if (block_size > PY_SSIZE_T_MAX - buffer->allocated) { + PyErr_SetString(PyExc_MemoryError, unable_allocate_msg); + return -1; + } + + // create the block + b = PyBytes_FromStringAndSize(NULL, block_size); + if (b == NULL) { + PyErr_SetString(PyExc_MemoryError, unable_allocate_msg); + return -1; + } + if (PyList_Append(buffer->list, b) < 0) { + Py_DECREF(b); + return -1; + } + Py_DECREF(b); + + // set variables + buffer->allocated += block_size; + + *next_out = PyBytes_AS_STRING(b); + return block_size; +} + +/* Return the current outputted data size. */ +static inline Py_ssize_t +_BlocksOutputBuffer_GetDataSize(_BlocksOutputBuffer *buffer, + const Py_ssize_t avail_out) +{ + return buffer->allocated - avail_out; +} + +/* Finish the buffer. + + Return a bytes object on success + Return NULL on failure +*/ +static inline PyObject * +_BlocksOutputBuffer_Finish(_BlocksOutputBuffer *buffer, + const Py_ssize_t avail_out) +{ + PyObject *result, *block; + const Py_ssize_t list_len = Py_SIZE(buffer->list); + + // fast path for single block + if ((list_len == 1 && avail_out == 0) || + (list_len == 2 && Py_SIZE(PyList_GET_ITEM(buffer->list, 1)) == avail_out)) + { + block = PyList_GET_ITEM(buffer->list, 0); + Py_INCREF(block); + + Py_CLEAR(buffer->list); + return block; + } + + // final bytes object + result = PyBytes_FromStringAndSize(NULL, buffer->allocated - avail_out); + if (result == NULL) { + PyErr_SetString(PyExc_MemoryError, unable_allocate_msg); + return NULL; + } + + // memory copy + if (list_len > 0) { + char *posi = PyBytes_AS_STRING(result); + + // blocks except the last one + Py_ssize_t i = 0; + for (; i < list_len-1; i++) { + block = PyList_GET_ITEM(buffer->list, i); + memcpy(posi, PyBytes_AS_STRING(block), Py_SIZE(block)); + posi += Py_SIZE(block); + } + // the last block + block = PyList_GET_ITEM(buffer->list, i); + memcpy(posi, PyBytes_AS_STRING(block), Py_SIZE(block) - avail_out); + } else { + assert(Py_SIZE(result) == 0); + } + + Py_CLEAR(buffer->list); + return result; +} + +/* Clean up the buffer when an error occurred. */ +static inline void +_BlocksOutputBuffer_OnError(_BlocksOutputBuffer *buffer) +{ + Py_CLEAR(buffer->list); +} + +#ifdef __cplusplus +} +#endif +#endif /* Py_INTERNAL_BLOCKS_OUTPUT_BUFFER_H */ \ No newline at end of file diff --git a/Include/internal/pycore_byteswap.h b/Include/internal/pycore_byteswap.h deleted file mode 100644 index 2b20fc6c..00000000 --- a/Include/internal/pycore_byteswap.h +++ /dev/null @@ -1,88 +0,0 @@ -/* Bytes swap functions, reverse order of bytes: - - - _Py_bswap16(uint16_t) - - _Py_bswap32(uint32_t) - - _Py_bswap64(uint64_t) -*/ - -#ifndef Py_INTERNAL_BSWAP_H -#define Py_INTERNAL_BSWAP_H -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef Py_BUILD_CORE -# error "this header requires Py_BUILD_CORE define" -#endif - -#if defined(__GNUC__) \ - && ((__GNUC__ >= 5) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) - /* __builtin_bswap16() is available since GCC 4.8, - __builtin_bswap32() is available since GCC 4.3, - __builtin_bswap64() is available since GCC 4.3. */ -# define _PY_HAVE_BUILTIN_BSWAP -#endif - -#ifdef _MSC_VER - /* Get _byteswap_ushort(), _byteswap_ulong(), _byteswap_uint64() */ -# include -#endif - -static inline uint16_t -_Py_bswap16(uint16_t word) -{ -#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap16) - return __builtin_bswap16(word); -#elif defined(_MSC_VER) - Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned short)); - return _byteswap_ushort(word); -#else - // Portable implementation which doesn't rely on circular bit shift - return ( ((word & UINT16_C(0x00FF)) << 8) - | ((word & UINT16_C(0xFF00)) >> 8)); -#endif -} - -static inline uint32_t -_Py_bswap32(uint32_t word) -{ -#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap32) - return __builtin_bswap32(word); -#elif defined(_MSC_VER) - Py_BUILD_ASSERT(sizeof(word) == sizeof(unsigned long)); - return _byteswap_ulong(word); -#else - // Portable implementation which doesn't rely on circular bit shift - return ( ((word & UINT32_C(0x000000FF)) << 24) - | ((word & UINT32_C(0x0000FF00)) << 8) - | ((word & UINT32_C(0x00FF0000)) >> 8) - | ((word & UINT32_C(0xFF000000)) >> 24)); -#endif -} - -static inline uint64_t -_Py_bswap64(uint64_t word) -{ -#if defined(_PY_HAVE_BUILTIN_BSWAP) || _Py__has_builtin(__builtin_bswap64) - return __builtin_bswap64(word); -#elif defined(_MSC_VER) - return _byteswap_uint64(word); -#else - // Portable implementation which doesn't rely on circular bit shift - return ( ((word & UINT64_C(0x00000000000000FF)) << 56) - | ((word & UINT64_C(0x000000000000FF00)) << 40) - | ((word & UINT64_C(0x0000000000FF0000)) << 24) - | ((word & UINT64_C(0x00000000FF000000)) << 8) - | ((word & UINT64_C(0x000000FF00000000)) >> 8) - | ((word & UINT64_C(0x0000FF0000000000)) >> 24) - | ((word & UINT64_C(0x00FF000000000000)) >> 40) - | ((word & UINT64_C(0xFF00000000000000)) >> 56)); -#endif -} - - -#ifdef __cplusplus -} -#endif -#endif /* !Py_INTERNAL_BSWAP_H */ - diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index e7ace9bd..f573c3e5 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -23,43 +23,49 @@ PyAPI_FUNC(int) _PyEval_AddPendingCall( PyInterpreterState *interp, int (*func)(void *), void *arg); -PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyThreadState *tstate); +PyAPI_FUNC(void) _PyEval_SignalAsyncExc(PyInterpreterState *interp); #ifdef HAVE_FORK -extern void _PyEval_ReInitThreads(struct pyruntimestate *runtime); +extern PyStatus _PyEval_ReInitThreads(PyThreadState *tstate); #endif PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth( PyThreadState *tstate, int new_depth); -/* Private function */ void _PyEval_Fini(void); + +extern PyObject* _PyEval_GetBuiltins(PyThreadState *tstate); +extern PyObject *_PyEval_BuiltinsFromGlobals( + PyThreadState *tstate, + PyObject *globals); + + static inline PyObject* _PyEval_EvalFrame(PyThreadState *tstate, PyFrameObject *f, int throwflag) { return tstate->interp->eval_frame(tstate, f, throwflag); } -extern PyObject *_PyEval_EvalCode( - PyThreadState *tstate, - PyObject *_co, PyObject *globals, PyObject *locals, - PyObject *const *args, Py_ssize_t argcount, - PyObject *const *kwnames, PyObject *const *kwargs, - Py_ssize_t kwcount, int kwstep, - PyObject *const *defs, Py_ssize_t defcount, - PyObject *kwdefs, PyObject *closure, - PyObject *name, PyObject *qualname); +extern PyObject * +_PyEval_Vector(PyThreadState *tstate, + PyFrameConstructor *desc, PyObject *locals, + PyObject* const* args, size_t argcount, + PyObject *kwnames); +#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS +extern int _PyEval_ThreadsInitialized(PyInterpreterState *interp); +#else extern int _PyEval_ThreadsInitialized(struct pyruntimestate *runtime); +#endif extern PyStatus _PyEval_InitGIL(PyThreadState *tstate); -extern void _PyEval_FiniGIL(PyThreadState *tstate); +extern void _PyEval_FiniGIL(PyInterpreterState *interp); extern void _PyEval_ReleaseLock(PyThreadState *tstate); +extern void _PyEval_DeactivateOpCache(void); -/* --- _Py_EnterRecursiveCall() ----------------------------------------- */ -PyAPI_DATA(int) _Py_CheckRecursionLimit; +/* --- _Py_EnterRecursiveCall() ----------------------------------------- */ #ifdef USE_STACKCHECK /* With USE_STACKCHECK macro defined, trigger stack checks in diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index a1bd6a0b..8ff1863d 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -10,9 +10,16 @@ typedef struct { uint64_t builtins_ver; /* ma_version of builtin dict */ } _PyOpcache_LoadGlobal; +typedef struct { + PyTypeObject *type; + Py_ssize_t hint; + unsigned int tp_version_tag; +} _PyOpCodeOpt_LoadAttr; + struct _PyOpcache { union { _PyOpcache_LoadGlobal lg; + _PyOpCodeOpt_LoadAttr la; } u; char optimized; }; diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h new file mode 100644 index 00000000..06a6082c --- /dev/null +++ b/Include/internal/pycore_compile.h @@ -0,0 +1,44 @@ +#ifndef Py_INTERNAL_COMPILE_H +#define Py_INTERNAL_COMPILE_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +struct _arena; // Type defined in pycore_pyarena.h +struct _mod; // Type defined in pycore_ast.h + +// Export the symbol for test_peg_generator (built as a library) +PyAPI_FUNC(PyCodeObject*) _PyAST_Compile( + struct _mod *mod, + PyObject *filename, + PyCompilerFlags *flags, + int optimize, + struct _arena *arena); +extern PyFutureFeatures* _PyFuture_FromAST( + struct _mod * mod, + PyObject *filename + ); + +extern PyObject* _Py_Mangle(PyObject *p, PyObject *name); + +typedef struct { + int optimize; + int ff_features; + + int recursion_depth; /* current recursion depth */ + int recursion_limit; /* recursion limit */ +} _PyASTOptimizeState; + +extern int _PyAST_Optimize( + struct _mod *, + struct _arena *arena, + _PyASTOptimizeState *state); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_COMPILE_H */ diff --git a/Include/internal/pycore_context.h b/Include/internal/pycore_context.h index f665ad5c..a482dd42 100644 --- a/Include/internal/pycore_context.h +++ b/Include/internal/pycore_context.h @@ -37,6 +37,6 @@ struct _pycontexttokenobject { int _PyContext_Init(void); -void _PyContext_Fini(void); +void _PyContext_Fini(PyInterpreterState *interp); #endif /* !Py_INTERNAL_CONTEXT_H */ diff --git a/Include/internal/pycore_fileutils.h b/Include/internal/pycore_fileutils.h index 8cf137bb..c1c9244a 100644 --- a/Include/internal/pycore_fileutils.h +++ b/Include/internal/pycore_fileutils.h @@ -48,6 +48,11 @@ PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( PyObject **decimal_point, PyObject **thousands_sep); +PyAPI_FUNC(void) _Py_closerange(int first, int last); + +PyAPI_FUNC(wchar_t*) _Py_GetLocaleEncoding(void); +PyAPI_FUNC(PyObject*) _Py_GetLocaleEncodingObject(void); + #ifdef HAVE_NON_UNICODE_WCHAR_T_REPRESENTATION extern int _Py_LocaleUsesNonUnicodeWchar(void); diff --git a/Include/internal/pycore_format.h b/Include/internal/pycore_format.h new file mode 100644 index 00000000..1b8d5753 --- /dev/null +++ b/Include/internal/pycore_format.h @@ -0,0 +1,27 @@ +#ifndef Py_INTERNAL_FORMAT_H +#define Py_INTERNAL_FORMAT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* Format codes + * F_LJUST '-' + * F_SIGN '+' + * F_BLANK ' ' + * F_ALT '#' + * F_ZERO '0' + */ +#define F_LJUST (1<<0) +#define F_SIGN (1<<1) +#define F_BLANK (1<<2) +#define F_ALT (1<<3) +#define F_ZERO (1<<4) + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_FORMAT_H */ diff --git a/Include/internal/pycore_gc.h b/Include/internal/pycore_gc.h index 0511eea7..9db4a471 100644 --- a/Include/internal/pycore_gc.h +++ b/Include/internal/pycore_gc.h @@ -161,17 +161,19 @@ struct _gc_runtime_state { Py_ssize_t long_lived_pending; }; -PyAPI_FUNC(void) _PyGC_InitState(struct _gc_runtime_state *); +extern void _PyGC_InitState(struct _gc_runtime_state *); + +extern Py_ssize_t _PyGC_CollectNoFail(PyThreadState *tstate); // Functions to clear types free lists -extern void _PyFrame_ClearFreeList(void); -extern void _PyTuple_ClearFreeList(void); -extern void _PyFloat_ClearFreeList(void); -extern void _PyList_ClearFreeList(void); -extern void _PyDict_ClearFreeList(void); -extern void _PyAsyncGen_ClearFreeLists(void); -extern void _PyContext_ClearFreeList(void); +extern void _PyFrame_ClearFreeList(PyInterpreterState *interp); +extern void _PyTuple_ClearFreeList(PyInterpreterState *interp); +extern void _PyFloat_ClearFreeList(PyInterpreterState *interp); +extern void _PyList_ClearFreeList(PyInterpreterState *interp); +extern void _PyDict_ClearFreeList(PyInterpreterState *interp); +extern void _PyAsyncGen_ClearFreeLists(PyInterpreterState *interp); +extern void _PyContext_ClearFreeList(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Include/internal/pycore_hamt.h b/Include/internal/pycore_hamt.h index 357d9661..aaf65590 100644 --- a/Include/internal/pycore_hamt.h +++ b/Include/internal/pycore_hamt.h @@ -5,19 +5,7 @@ # error "this header requires Py_BUILD_CORE define" #endif - -/* -HAMT tree is shaped by hashes of keys. Every group of 5 bits of a hash denotes -the exact position of the key in one level of the tree. Since we're using -32 bit hashes, we can have at most 7 such levels. Although if there are -two distinct keys with equal hashes, they will have to occupy the same -cell in the 7th level of the tree -- so we'd put them in a "collision" node. -Which brings the total possible tree depth to 8. Read more about the actual -layout of the HAMT tree in `hamt.c`. - -This constant is used to define a datastucture for storing iteration state. -*/ -#define _Py_HAMT_MAX_TREE_DEPTH 8 +#define _Py_HAMT_MAX_TREE_DEPTH 7 #define PyHamt_Check(o) Py_IS_TYPE(o, &_PyHamt_Type) diff --git a/Include/internal/pycore_import.h b/Include/internal/pycore_import.h index b011ea44..e21ed0a7 100644 --- a/Include/internal/pycore_import.h +++ b/Include/internal/pycore_import.h @@ -5,15 +5,10 @@ extern "C" { #endif -PyAPI_FUNC(PyObject *) _PyImport_FindBuiltin( - PyThreadState *tstate, - const char *name /* UTF-8 encoded string */ - ); - #ifdef HAVE_FORK -extern void _PyImport_ReInitLock(void); +extern PyStatus _PyImport_ReInitLock(void); #endif -extern void _PyImport_Cleanup(PyThreadState *tstate); +extern PyObject* _PyImport_BootstrapImp(PyThreadState *tstate); #ifdef __cplusplus } diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h index ad1b7e55..4b009e81 100644 --- a/Include/internal/pycore_initconfig.h +++ b/Include/internal/pycore_initconfig.h @@ -44,6 +44,8 @@ struct pyruntimestate; #define _PyStatus_UPDATE_FUNC(err) \ do { err.func = _PyStatus_GET_FUNC(); } while (0) +PyObject* _PyErr_SetFromPyStatus(PyStatus status); + /* --- PyWideStringList ------------------------------------------------ */ #define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL} @@ -100,6 +102,7 @@ typedef struct { int isolated; /* -I option */ int use_environment; /* -E option */ int dev_mode; /* -X dev and PYTHONDEVMODE */ + int warn_default_encoding; /* -X warn_default_encoding and PYTHONWARNDEFAULTENCODING */ } _PyPreCmdline; #define _PyPreCmdline_INIT \ @@ -149,14 +152,18 @@ PyAPI_FUNC(void) _PyConfig_InitCompatConfig(PyConfig *config); extern PyStatus _PyConfig_Copy( PyConfig *config, const PyConfig *config2); -extern PyStatus _PyConfig_InitPathConfig(PyConfig *config); +extern PyStatus _PyConfig_InitPathConfig( + PyConfig *config, + int compute_path_config); +extern PyStatus _PyConfig_Read(PyConfig *config, int compute_path_config); extern PyStatus _PyConfig_Write(const PyConfig *config, struct pyruntimestate *runtime); extern PyStatus _PyConfig_SetPyArgv( PyConfig *config, const _PyArgv *args); -extern int _Py_global_config_int_max_str_digits; +PyAPI_FUNC(PyObject*) _PyConfig_AsDict(const PyConfig *config); +PyAPI_FUNC(int) _PyConfig_FromDict(PyConfig *config, PyObject *dict); /* --- Function used for testing ---------------------------------- */ diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 304d704a..bfd082b5 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -8,12 +8,11 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_atomic.h" /* _Py_atomic_address */ -#include "pycore_gil.h" /* struct _gil_runtime_state */ -#include "pycore_gc.h" /* struct _gc_runtime_state */ -#include "pycore_warnings.h" /* struct _warnings_runtime_state */ - -/* ceval state */ +#include "pycore_atomic.h" // _Py_atomic_address +#include "pycore_ast_state.h" // struct ast_state +#include "pycore_gil.h" // struct _gil_runtime_state +#include "pycore_gc.h" // struct _gc_runtime_state +#include "pycore_warnings.h" // struct _warnings_runtime_state struct _pending_calls { PyThread_type_lock lock; @@ -34,18 +33,15 @@ struct _pending_calls { struct _ceval_state { int recursion_limit; - /* Records whether tracing is on for any thread. Counts the number - of threads for which tstate->c_tracefunc is non-NULL, so if the - value is 0, we know we don't have to check this thread's - c_tracefunc. This speeds up the if statement in - _PyEval_EvalFrameDefault() after fast_next_opcode. */ - int tracing_possible; /* This single variable consolidates all requests to break out of the fast path in the eval loop. */ _Py_atomic_int eval_breaker; /* Request for dropping the GIL */ _Py_atomic_int gil_drop_request; struct _pending_calls pending; +#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS + struct _gil_runtime_state gil; +#endif }; /* fs_codec.encoding is initialized to NULL. @@ -57,8 +53,156 @@ struct _Py_unicode_fs_codec { _Py_error_handler error_handler; }; +struct _Py_bytes_state { + PyObject *empty_string; + PyBytesObject *characters[256]; +}; + +struct _Py_unicode_ids { + Py_ssize_t size; + PyObject **array; +}; + struct _Py_unicode_state { + // The empty Unicode object is a singleton to improve performance. + PyObject *empty_string; + /* Single character Unicode strings in the Latin-1 range are being + shared as well. */ + PyObject *latin1[256]; struct _Py_unicode_fs_codec fs_codec; + + /* This dictionary holds all interned unicode strings. Note that references + to strings in this dictionary are *not* counted in the string's ob_refcnt. + When the interned string reaches a refcnt of 0 the string deallocation + function will delete the reference from this dictionary. + + Another way to look at this is that to say that the actual reference + count of a string is: s->ob_refcnt + (s->state ? 2 : 0) + */ + PyObject *interned; + + // Unicode identifiers (_Py_Identifier): see _PyUnicode_FromId() + struct _Py_unicode_ids ids; +}; + +struct _Py_float_state { + /* Special free list + free_list is a singly-linked list of available PyFloatObjects, + linked via abuse of their ob_type members. */ + int numfree; + PyFloatObject *free_list; +}; + +/* Speed optimization to avoid frequent malloc/free of small tuples */ +#ifndef PyTuple_MAXSAVESIZE + // Largest tuple to save on free list +# define PyTuple_MAXSAVESIZE 20 +#endif +#ifndef PyTuple_MAXFREELIST + // Maximum number of tuples of each size to save +# define PyTuple_MAXFREELIST 2000 +#endif + +struct _Py_tuple_state { +#if PyTuple_MAXSAVESIZE > 0 + /* Entries 1 up to PyTuple_MAXSAVESIZE are free lists, + entry 0 is the empty tuple () of which at most one instance + will be allocated. */ + PyTupleObject *free_list[PyTuple_MAXSAVESIZE]; + int numfree[PyTuple_MAXSAVESIZE]; +#endif +}; + +/* Empty list reuse scheme to save calls to malloc and free */ +#ifndef PyList_MAXFREELIST +# define PyList_MAXFREELIST 80 +#endif + +struct _Py_list_state { + PyListObject *free_list[PyList_MAXFREELIST]; + int numfree; +}; + +#ifndef PyDict_MAXFREELIST +# define PyDict_MAXFREELIST 80 +#endif + +struct _Py_dict_state { + /* Dictionary reuse scheme to save calls to malloc and free */ + PyDictObject *free_list[PyDict_MAXFREELIST]; + int numfree; + PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]; + int keys_numfree; +}; + +struct _Py_frame_state { + PyFrameObject *free_list; + /* number of frames currently in free_list */ + int numfree; +}; + +#ifndef _PyAsyncGen_MAXFREELIST +# define _PyAsyncGen_MAXFREELIST 80 +#endif + +struct _Py_async_gen_state { + /* Freelists boost performance 6-10%; they also reduce memory + fragmentation, as _PyAsyncGenWrappedValue and PyAsyncGenASend + are short-living objects that are instantiated for every + __anext__() call. */ + struct _PyAsyncGenWrappedValue* value_freelist[_PyAsyncGen_MAXFREELIST]; + int value_numfree; + + struct PyAsyncGenASend* asend_freelist[_PyAsyncGen_MAXFREELIST]; + int asend_numfree; +}; + +struct _Py_context_state { + // List of free PyContext objects + PyContext *freelist; + int numfree; +}; + +struct _Py_exc_state { + // The dict mapping from errno codes to OSError subclasses + PyObject *errnomap; + PyBaseExceptionObject *memerrors_freelist; + int memerrors_numfree; +}; + + +// atexit state +typedef struct { + PyObject *func; + PyObject *args; + PyObject *kwargs; +} atexit_callback; + +struct atexit_state { + atexit_callback **callbacks; + int ncallbacks; + int callback_len; +}; + + +// Type attribute lookup cache: speed up attribute and method lookups, +// see _PyType_Lookup(). +struct type_cache_entry { + unsigned int version; // initialized from type->tp_version_tag + PyObject *name; // reference to exactly a str or None + PyObject *value; // borrowed reference or NULL +}; + +#define MCACHE_SIZE_EXP 12 +#define MCACHE_STATS 0 + +struct type_cache { + struct type_cache_entry hashtable[1 << MCACHE_SIZE_EXP]; +#if MCACHE_STATS + size_t hits; + size_t misses; + size_t collisions; +#endif }; @@ -67,6 +211,11 @@ struct _Py_unicode_state { #define _PY_NSMALLPOSINTS 257 #define _PY_NSMALLNEGINTS 5 +// _PyLong_GetZero() and _PyLong_GetOne() must always be available +#if _PY_NSMALLPOSINTS < 2 +# error "_PY_NSMALLPOSINTS must be greater than 1" +#endif + // The PyInterpreterState typedef is in Include/pystate.h. struct _is { @@ -88,10 +237,14 @@ struct _is { struct _ceval_state ceval; struct _gc_runtime_state gc; + // sys.modules dictionary PyObject *modules; PyObject *modules_by_index; + // Dictionary of the sys module PyObject *sysdict; + // Dictionary of the builtins module PyObject *builtins; + // importlib module PyObject *importlib; /* Used in Modules/_threadmodule.c. */ @@ -107,8 +260,6 @@ struct _is { PyObject *codec_error_registry; int codecs_initialized; - struct _Py_unicode_state unicode; - PyConfig config; #ifdef HAVE_DLOPEN int dlopenflags; @@ -118,7 +269,7 @@ struct _is { PyObject *builtins_copy; PyObject *import_func; - /* Initialized to PyEval_EvalFrameDefault(). */ + // Initialized to _PyEval_EvalFrameDefault(). _PyFrameEvalFunction eval_frame; Py_ssize_t co_extra_user_count; @@ -129,42 +280,41 @@ struct _is { PyObject *after_forkers_parent; PyObject *after_forkers_child; #endif - /* AtExit module */ - void (*pyexitfunc)(PyObject *); - PyObject *pyexitmodule; uint64_t tstate_next_unique_id; struct _warnings_runtime_state warnings; + struct atexit_state atexit; PyObject *audit_hooks; - struct { - struct { - int level; - int atbol; - } listnode; - } parser; - -#if _PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS > 0 /* Small integers are preallocated in this array so that they can be shared. The integers that are preallocated are those in the range -_PY_NSMALLNEGINTS (inclusive) to _PY_NSMALLPOSINTS (not inclusive). */ PyLongObject* small_ints[_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS]; -#endif - - int int_max_str_digits; + struct _Py_bytes_state bytes; + struct _Py_unicode_state unicode; + struct _Py_float_state float_state; + /* Using a cache is very effective since typically only a single slice is + created and then deleted again. */ + PySliceObject *slice_cache; + + struct _Py_tuple_state tuple; + struct _Py_list_state list; + struct _Py_dict_state dict_state; + struct _Py_frame_state frame; + struct _Py_async_gen_state async_gen; + struct _Py_context_state context; + struct _Py_exc_state exc_state; + + struct ast_state ast; + struct type_cache type_cache; }; -/* Used by _PyImport_Cleanup() */ extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); - -extern PyStatus _PyInterpreterState_SetConfig( - PyInterpreterState *interp, - const PyConfig *config); - +extern void _PyInterpreterState_Clear(PyThreadState *tstate); /* cross-interpreter data registry */ @@ -184,11 +334,10 @@ struct _xidregitem { PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(int64_t); PyAPI_FUNC(int) _PyInterpreterState_IDInitref(struct _is *); -PyAPI_FUNC(void) _PyInterpreterState_IDIncref(struct _is *); +PyAPI_FUNC(int) _PyInterpreterState_IDIncref(struct _is *); PyAPI_FUNC(void) _PyInterpreterState_IDDecref(struct _is *); #ifdef __cplusplus } #endif #endif /* !Py_INTERNAL_INTERP_H */ - diff --git a/Include/internal/pycore_list.h b/Include/internal/pycore_list.h new file mode 100644 index 00000000..f18fb052 --- /dev/null +++ b/Include/internal/pycore_list.h @@ -0,0 +1,20 @@ +#ifndef Py_INTERNAL_LIST_H +#define Py_INTERNAL_LIST_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +#include "listobject.h" // _PyList_CAST() + + +#define _PyList_ITEMS(op) (_PyList_CAST(op)->ob_item) + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_LIST_H */ diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index ae04332a..2bea3a55 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -8,40 +8,31 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -/* - * Default int base conversion size limitation: Denial of Service prevention. - * - * Chosen such that this isn't wildly slow on modern hardware and so that - * everyone's existing deployed numpy test suite passes before - * https://github.com/numpy/numpy/issues/22098 is widely available. - * - * $ python -m timeit -s 's = "1"*4300' 'int(s)' - * 2000 loops, best of 5: 125 usec per loop - * $ python -m timeit -s 's = "1"*4300; v = int(s)' 'str(v)' - * 1000 loops, best of 5: 311 usec per loop - * (zen2 cloud VM) - * - * 4300 decimal digits fits a ~14284 bit number. - */ -#define _PY_LONG_DEFAULT_MAX_STR_DIGITS 4300 -/* - * Threshold for max digits check. For performance reasons int() and - * int.__str__() don't checks values that are smaller than this - * threshold. Acts as a guaranteed minimum size limit for bignums that - * applications can expect from CPython. - * - * % python -m timeit -s 's = "1"*640; v = int(s)' 'str(int(s))' - * 20000 loops, best of 5: 12 usec per loop - * - * "640 digits should be enough for anyone." - gps - * fits a ~2126 bit decimal number. - */ -#define _PY_LONG_MAX_STR_DIGITS_THRESHOLD 640 +#include "pycore_interp.h" // PyInterpreterState.small_ints +#include "pycore_pystate.h" // _PyThreadState_GET() -#if ((_PY_LONG_DEFAULT_MAX_STR_DIGITS != 0) && \ - (_PY_LONG_DEFAULT_MAX_STR_DIGITS < _PY_LONG_MAX_STR_DIGITS_THRESHOLD)) -# error "_PY_LONG_DEFAULT_MAX_STR_DIGITS smaller than threshold." -#endif +// Don't call this function but _PyLong_GetZero() and _PyLong_GetOne() +static inline PyObject* __PyLong_GetSmallInt_internal(int value) +{ + PyInterpreterState *interp = _PyInterpreterState_GET(); + assert(-_PY_NSMALLNEGINTS <= value && value < _PY_NSMALLPOSINTS); + size_t index = _PY_NSMALLNEGINTS + value; + PyObject *obj = (PyObject*)interp->small_ints[index]; + // _PyLong_GetZero(), _PyLong_GetOne() and get_small_int() must not be + // called before _PyLong_Init() nor after _PyLong_Fini(). + assert(obj != NULL); + return obj; +} + +// Return a borrowed reference to the zero singleton. +// The function cannot return NULL. +static inline PyObject* _PyLong_GetZero(void) +{ return __PyLong_GetSmallInt_internal(0); } + +// Return a borrowed reference to the one singleton. +// The function cannot return NULL. +static inline PyObject* _PyLong_GetOne(void) +{ return __PyLong_GetSmallInt_internal(1); } #ifdef __cplusplus } diff --git a/Include/internal/pycore_moduleobject.h b/Include/internal/pycore_moduleobject.h new file mode 100644 index 00000000..e9978abd --- /dev/null +++ b/Include/internal/pycore_moduleobject.h @@ -0,0 +1,42 @@ +#ifndef Py_INTERNAL_MODULEOBJECT_H +#define Py_INTERNAL_MODULEOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +typedef struct { + PyObject_HEAD + PyObject *md_dict; + struct PyModuleDef *md_def; + void *md_state; + PyObject *md_weaklist; + // for logging purposes after md_dict is cleared + PyObject *md_name; +} PyModuleObject; + +static inline PyModuleDef* _PyModule_GetDef(PyObject *mod) { + assert(PyModule_Check(mod)); + return ((PyModuleObject *)mod)->md_def; +} + +static inline void* _PyModule_GetState(PyObject* mod) { + assert(PyModule_Check(mod)); + return ((PyModuleObject *)mod)->md_state; +} + +static inline PyObject* _PyModule_GetDict(PyObject *mod) { + assert(PyModule_Check(mod)); + PyObject *dict = ((PyModuleObject *)mod) -> md_dict; + // _PyModule_GetDict(mod) must not be used after calling module_clear(mod) + assert(dict != NULL); + return dict; +} + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_MODULEOBJECT_H */ diff --git a/Include/internal/pycore_object.h b/Include/internal/pycore_object.h index c66ff12d..6be8cb5e 100644 --- a/Include/internal/pycore_object.h +++ b/Include/internal/pycore_object.h @@ -8,17 +8,56 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif -#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() -#include "pycore_interp.h" // PyInterpreterState.gc -#include "pycore_pystate.h" // _PyThreadState_GET() +#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() +#include "pycore_interp.h" // PyInterpreterState.gc +#include "pycore_pystate.h" // _PyInterpreterState_GET() PyAPI_FUNC(int) _PyType_CheckConsistency(PyTypeObject *type); PyAPI_FUNC(int) _PyDict_CheckConsistency(PyObject *mp, int check_content); -/* Only private in Python 3.10 and 3.9.8+; public in 3.11 */ -extern PyObject *_PyType_GetQualName(PyTypeObject *type); +/* Update the Python traceback of an object. This function must be called + when a memory block is reused from a free list. + + Internal function called by _Py_NewReference(). */ +extern int _PyTraceMalloc_NewReference(PyObject *op); + +// Fast inlined version of PyType_HasFeature() +static inline int +_PyType_HasFeature(PyTypeObject *type, unsigned long feature) { + return ((type->tp_flags & feature) != 0); +} + +extern void _PyType_InitCache(PyInterpreterState *interp); + + +/* Inline functions trading binary compatibility for speed: + _PyObject_Init() is the fast version of PyObject_Init(), and + _PyObject_InitVar() is the fast version of PyObject_InitVar(). + + These inline functions must not be called with op=NULL. */ +static inline void +_PyObject_Init(PyObject *op, PyTypeObject *typeobj) +{ + assert(op != NULL); + Py_SET_TYPE(op, typeobj); + if (_PyType_HasFeature(typeobj, Py_TPFLAGS_HEAPTYPE)) { + Py_INCREF(typeobj); + } + _Py_NewReference(op); +} + +static inline void +_PyObject_InitVar(PyVarObject *op, PyTypeObject *typeobj, Py_ssize_t size) +{ + assert(op != NULL); + Py_SET_SIZE(op, size); + _PyObject_Init((PyObject *)op, typeobj); +} + /* Tell the GC to track this object. + * + * The object must not be tracked by the GC. * * NB: While the object is tracked by the collector, it must be safe to call the * ob_traverse method. @@ -27,23 +66,27 @@ extern PyObject *_PyType_GetQualName(PyTypeObject *type); * because it's not object header. So we don't use _PyGCHead_PREV() and * _PyGCHead_SET_PREV() for it to avoid unnecessary bitwise operations. * - * The PyObject_GC_Track() function is the public version of this macro. + * See also the public PyObject_GC_Track() function. */ -static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, - PyObject *op) +static inline void _PyObject_GC_TRACK( +// The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined +#ifndef NDEBUG + const char *filename, int lineno, +#endif + PyObject *op) { _PyObject_ASSERT_FROM(op, !_PyObject_GC_IS_TRACKED(op), "object already tracked by the garbage collector", - filename, lineno, "_PyObject_GC_TRACK"); + filename, lineno, __func__); PyGC_Head *gc = _Py_AS_GC(op); _PyObject_ASSERT_FROM(op, (gc->_gc_prev & _PyGC_PREV_MASK_COLLECTING) == 0, "object is in generation which is garbage collected", - filename, lineno, "_PyObject_GC_TRACK"); + filename, lineno, __func__); - PyThreadState *tstate = _PyThreadState_GET(); - PyGC_Head *generation0 = tstate->interp->gc.generation0; + PyInterpreterState *interp = _PyInterpreterState_GET(); + PyGC_Head *generation0 = interp->gc.generation0; PyGC_Head *last = (PyGC_Head*)(generation0->_gc_prev); _PyGCHead_SET_NEXT(last, gc); _PyGCHead_SET_PREV(gc, last); @@ -51,9 +94,6 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, generation0->_gc_prev = (uintptr_t)gc; } -#define _PyObject_GC_TRACK(op) \ - _PyObject_GC_TRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op)) - /* Tell the GC to stop tracking this object. * * Internal note: This may be called while GC. So _PyGC_PREV_MASK_COLLECTING @@ -61,14 +101,19 @@ static inline void _PyObject_GC_TRACK_impl(const char *filename, int lineno, * * The object must be tracked by the GC. * - * The PyObject_GC_UnTrack() function is the public version of this macro. + * See also the public PyObject_GC_UnTrack() which accept an object which is + * not tracked. */ -static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno, - PyObject *op) +static inline void _PyObject_GC_UNTRACK( +// The preprocessor removes _PyObject_ASSERT_FROM() calls if NDEBUG is defined +#ifndef NDEBUG + const char *filename, int lineno, +#endif + PyObject *op) { _PyObject_ASSERT_FROM(op, _PyObject_GC_IS_TRACKED(op), "object not tracked by the garbage collector", - filename, lineno, "_PyObject_GC_UNTRACK"); + filename, lineno, __func__); PyGC_Head *gc = _Py_AS_GC(op); PyGC_Head *prev = _PyGCHead_PREV(gc); @@ -79,8 +124,20 @@ static inline void _PyObject_GC_UNTRACK_impl(const char *filename, int lineno, gc->_gc_prev &= _PyGC_PREV_MASK_FINALIZED; } -#define _PyObject_GC_UNTRACK(op) \ - _PyObject_GC_UNTRACK_impl(__FILE__, __LINE__, _PyObject_CAST(op)) +// Macros to accept any type for the parameter, and to automatically pass +// the filename and the filename (if NDEBUG is not defined) where the macro +// is called. +#ifdef NDEBUG +# define _PyObject_GC_TRACK(op) \ + _PyObject_GC_TRACK(_PyObject_CAST(op)) +# define _PyObject_GC_UNTRACK(op) \ + _PyObject_GC_UNTRACK(_PyObject_CAST(op)) +#else +# define _PyObject_GC_TRACK(op) \ + _PyObject_GC_TRACK(__FILE__, __LINE__, _PyObject_CAST(op)) +# define _PyObject_GC_UNTRACK(op) \ + _PyObject_GC_UNTRACK(__FILE__, __LINE__, _PyObject_CAST(op)) +#endif #ifdef Py_REF_DEBUG extern void _PyDebug_PrintTotalRefs(void); @@ -99,12 +156,6 @@ _PyObject_GET_WEAKREFS_LISTPTR(PyObject *op) return (PyObject **)((char *)op + offset); } -// Fast inlined version of PyType_HasFeature() -static inline int -_PyType_HasFeature(PyTypeObject *type, unsigned long feature) { - return ((type->tp_flags & feature) != 0); -} - // Fast inlined version of PyObject_IS_GC() static inline int _PyObject_IS_GC(PyObject *obj) @@ -117,6 +168,16 @@ _PyObject_IS_GC(PyObject *obj) // Fast inlined version of PyType_IS_GC() #define _PyType_IS_GC(t) _PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) +// Usage: assert(_Py_CheckSlotResult(obj, "__getitem__", result != NULL)); +extern int _Py_CheckSlotResult( + PyObject *obj, + const char *slot_name, + int success); + +// PyType_Ready() must be called if _PyType_IsReady() is false. +// See also the Py_TPFLAGS_READY flag. +#define _PyType_IsReady(type) ((type)->tp_dict != NULL) + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_parser.h b/Include/internal/pycore_parser.h new file mode 100644 index 00000000..e2de24e2 --- /dev/null +++ b/Include/internal/pycore_parser.h @@ -0,0 +1,31 @@ +#ifndef Py_INTERNAL_PARSER_H +#define Py_INTERNAL_PARSER_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +extern struct _mod* _PyParser_ASTFromString( + const char *str, + PyObject* filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +extern struct _mod* _PyParser_ASTFromFile( + FILE *fp, + PyObject *filename_ob, + const char *enc, + int mode, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PARSER_H */ diff --git a/Include/internal/pycore_pathconfig.h b/Include/internal/pycore_pathconfig.h index 42d61b1c..15447f54 100644 --- a/Include/internal/pycore_pathconfig.h +++ b/Include/internal/pycore_pathconfig.h @@ -65,6 +65,7 @@ extern wchar_t* _Py_GetDLLPath(void); extern PyStatus _PyConfig_WritePathConfig(const PyConfig *config); extern void _Py_DumpPathConfig(PyThreadState *tstate); +extern PyObject* _PyPathConfig_AsDict(void); #ifdef __cplusplus } diff --git a/Include/internal/pycore_pyarena.h b/Include/internal/pycore_pyarena.h new file mode 100644 index 00000000..d78972a8 --- /dev/null +++ b/Include/internal/pycore_pyarena.h @@ -0,0 +1,64 @@ +/* An arena-like memory interface for the compiler. + */ + +#ifndef Py_INTERNAL_PYARENA_H +#define Py_INTERNAL_PYARENA_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +typedef struct _arena PyArena; + +/* _PyArena_New() and _PyArena_Free() create a new arena and free it, + respectively. Once an arena has been created, it can be used + to allocate memory via _PyArena_Malloc(). Pointers to PyObject can + also be registered with the arena via _PyArena_AddPyObject(), and the + arena will ensure that the PyObjects stay alive at least until + _PyArena_Free() is called. When an arena is freed, all the memory it + allocated is freed, the arena releases internal references to registered + PyObject*, and none of its pointers are valid. + XXX (tim) What does "none of its pointers are valid" mean? Does it + XXX mean that pointers previously obtained via _PyArena_Malloc() are + XXX no longer valid? (That's clearly true, but not sure that's what + XXX the text is trying to say.) + + _PyArena_New() returns an arena pointer. On error, it + returns a negative number and sets an exception. + XXX (tim): Not true. On error, _PyArena_New() actually returns NULL, + XXX and looks like it may or may not set an exception (e.g., if the + XXX internal PyList_New(0) returns NULL, _PyArena_New() passes that on + XXX and an exception is set; OTOH, if the internal + XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but + XXX an exception is not set in that case). +*/ +PyAPI_FUNC(PyArena*) _PyArena_New(void); +PyAPI_FUNC(void) _PyArena_Free(PyArena *); + +/* Mostly like malloc(), return the address of a block of memory spanning + * `size` bytes, or return NULL (without setting an exception) if enough + * new memory can't be obtained. Unlike malloc(0), _PyArena_Malloc() with + * size=0 does not guarantee to return a unique pointer (the pointer + * returned may equal one or more other pointers obtained from + * _PyArena_Malloc()). + * Note that pointers obtained via _PyArena_Malloc() must never be passed to + * the system free() or realloc(), or to any of Python's similar memory- + * management functions. _PyArena_Malloc()-obtained pointers remain valid + * until _PyArena_Free(ar) is called, at which point all pointers obtained + * from the arena `ar` become invalid simultaneously. + */ +PyAPI_FUNC(void*) _PyArena_Malloc(PyArena *, size_t size); + +/* This routine isn't a proper arena allocation routine. It takes + * a PyObject* and records it so that it can be DECREFed when the + * arena is freed. + */ +PyAPI_FUNC(int) _PyArena_AddPyObject(PyArena *, PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_PYARENA_H */ diff --git a/Include/internal/pycore_pyerrors.h b/Include/internal/pycore_pyerrors.h index 2cf1160a..a5e97fe2 100644 --- a/Include/internal/pycore_pyerrors.h +++ b/Include/internal/pycore_pyerrors.h @@ -84,6 +84,12 @@ PyAPI_FUNC(PyObject *) _PyErr_FormatFromCauseTstate( PyAPI_FUNC(int) _PyErr_CheckSignalsTstate(PyThreadState *tstate); +PyAPI_FUNC(void) _Py_DumpExtensionModules(int fd, PyInterpreterState *interp); + +extern PyObject* _Py_Offer_Suggestions(PyObject* exception); +PyAPI_FUNC(Py_ssize_t) _Py_UTF8_Edit_Cost(PyObject *str_a, PyObject *str_b, + Py_ssize_t max_cost); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 50ab645f..524be9d4 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -8,6 +8,24 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#ifdef HAVE_SIGNAL_H +#include +#endif + +#include "pycore_runtime.h" // _PyRuntimeState + +#ifndef NSIG +# if defined(_NSIG) +# define NSIG _NSIG /* For BSD/SysV */ +# elif defined(_SIGMAX) +# define NSIG (_SIGMAX + 1) /* For QNX */ +# elif defined(SIGMAX) +# define NSIG (SIGMAX + 1) /* For djgpp */ +# else +# define NSIG 64 /* Use a reasonable default value */ +# endif +#endif + /* Forward declarations */ struct _PyArgv; struct pyruntimestate; @@ -31,64 +49,71 @@ PyAPI_FUNC(int) _Py_IsLocaleCoercionTarget(const char *ctype_loc); /* Various one-time initializers */ -extern PyStatus _PyUnicode_Init(void); +extern PyStatus _PyUnicode_Init(PyInterpreterState *interp); +extern PyStatus _PyUnicode_InitTypes(void); +extern PyStatus _PyBytes_Init(PyInterpreterState *interp); extern int _PyStructSequence_Init(void); -extern int _PyLong_Init(PyThreadState *tstate); +extern int _PyLong_Init(PyInterpreterState *interp); +extern int _PyLong_InitTypes(void); +extern PyStatus _PyTuple_Init(PyInterpreterState *interp); extern PyStatus _PyFaulthandler_Init(int enable); extern int _PyTraceMalloc_Init(int enable); -extern PyObject * _PyBuiltin_Init(PyThreadState *tstate); +extern PyObject * _PyBuiltin_Init(PyInterpreterState *interp); extern PyStatus _PySys_Create( PyThreadState *tstate, PyObject **sysmod_p); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); -extern int _PySys_InitMain(PyThreadState *tstate); -extern PyStatus _PyExc_Init(void); -extern PyStatus _PyErr_Init(void); +extern int _PySys_UpdateConfig(PyThreadState *tstate); +extern PyStatus _PyExc_Init(PyInterpreterState *interp); +extern PyStatus _PyErr_InitTypes(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); -extern PyStatus _PyImportHooks_Init(PyThreadState *tstate); -extern int _PyFloat_Init(void); +extern void _PyFloat_Init(void); +extern int _PyFloat_InitTypes(void); extern PyStatus _Py_HashRandomization_Init(const PyConfig *); extern PyStatus _PyTypes_Init(void); extern PyStatus _PyTypes_InitSlotDefs(void); extern PyStatus _PyImportZip_Init(PyThreadState *tstate); -extern PyStatus _PyGC_Init(PyThreadState *tstate); +extern PyStatus _PyGC_Init(PyInterpreterState *interp); +extern PyStatus _PyAtExit_Init(PyInterpreterState *interp); /* Various internal finalizers */ -extern void _PyFrame_Fini(void); -extern void _PyDict_Fini(void); -extern void _PyTuple_Fini(void); -extern void _PyList_Fini(void); -extern void _PySet_Fini(void); -extern void _PyBytes_Fini(void); -extern void _PyFloat_Fini(void); -extern void _PySlice_Fini(void); -extern void _PyAsyncGen_Fini(void); +extern void _PyFrame_Fini(PyInterpreterState *interp); +extern void _PyDict_Fini(PyInterpreterState *interp); +extern void _PyTuple_Fini(PyInterpreterState *interp); +extern void _PyList_Fini(PyInterpreterState *interp); +extern void _PyBytes_Fini(PyInterpreterState *interp); +extern void _PyFloat_Fini(PyInterpreterState *interp); +extern void _PySlice_Fini(PyInterpreterState *interp); +extern void _PyAsyncGen_Fini(PyInterpreterState *interp); extern int _PySignal_Init(int install_signal_handlers); -extern void PyOS_FiniInterrupts(void); +extern void _PySignal_Fini(void); -extern void _PyExc_Fini(void); +extern void _PyExc_Fini(PyInterpreterState *interp); extern void _PyImport_Fini(void); extern void _PyImport_Fini2(void); -extern void _PyGC_Fini(PyThreadState *tstate); -extern void _PyType_Fini(void); +extern void _PyGC_Fini(PyInterpreterState *interp); +extern void _PyType_Fini(PyInterpreterState *interp); extern void _Py_HashRandomization_Fini(void); -extern void _PyUnicode_Fini(PyThreadState *tstate); -extern void _PyLong_Fini(PyThreadState *tstate); +extern void _PyUnicode_Fini(PyInterpreterState *interp); +extern void _PyUnicode_ClearInterned(PyInterpreterState *interp); +extern void _PyLong_Fini(PyInterpreterState *interp); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); extern void _PyTraceMalloc_Fini(void); extern void _PyWarnings_Fini(PyInterpreterState *interp); -extern void _PyAST_Fini(void); +extern void _PyAST_Fini(PyInterpreterState *interp); +extern void _PyAtExit_Fini(PyInterpreterState *interp); -extern PyStatus _PyGILState_Init(PyThreadState *tstate); -extern void _PyGILState_Fini(PyThreadState *tstate); +extern PyStatus _PyGILState_Init(_PyRuntimeState *runtime); +extern PyStatus _PyGILState_SetTstate(PyThreadState *tstate); +extern void _PyGILState_Fini(PyInterpreterState *interp); -PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyThreadState *tstate); +PyAPI_FUNC(void) _PyGC_DumpShutdownStats(PyInterpreterState *interp); PyAPI_FUNC(PyStatus) _Py_PreInitializeFromPyArgv( const PyPreConfig *src_config, @@ -108,6 +133,8 @@ PyAPI_FUNC(void) _PyErr_Display(PyObject *file, PyObject *exception, PyAPI_FUNC(void) _PyThreadState_DeleteCurrent(PyThreadState *tstate); +extern void _PyAtExit_Call(PyInterpreterState *interp); + #ifdef __cplusplus } #endif diff --git a/Include/internal/pycore_pymem.h b/Include/internal/pycore_pymem.h index 9bcb5f5e..49af1714 100644 --- a/Include/internal/pycore_pymem.h +++ b/Include/internal/pycore_pymem.h @@ -69,9 +69,6 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName( PYMEM_ALLOCATOR_NOT_SET does nothing. */ PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator); -/* bpo-35053: Expose _Py_tracemalloc_config for _Py_NewReference() - which access directly _Py_tracemalloc_config.tracing for best - performances. */ struct _PyTraceMalloc_Config { /* Module initialized? Variable protected by the GIL */ diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 835d6e02..4b894f3e 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -22,11 +22,11 @@ _Py_IsMainThread(void) static inline int -_Py_IsMainInterpreter(PyThreadState* tstate) +_Py_IsMainInterpreter(PyInterpreterState *interp) { /* Use directly _PyRuntime rather than tstate->interp->runtime, since this function is used in performance critical code path (ceval) */ - return (tstate->interp == _PyRuntime.interpreters.main); + return (interp == _PyRuntime.interpreters.main); } @@ -49,10 +49,18 @@ _Py_ThreadCanHandlePendingCalls(void) /* Variable and macro for in-line access to current thread and interpreter state */ +#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS +PyAPI_FUNC(PyThreadState*) _PyThreadState_GetTSS(void); +#endif + static inline PyThreadState* _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) { +#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS + return _PyThreadState_GetTSS(); +#else return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current); +#endif } /* Get the current Python thread state. @@ -67,7 +75,11 @@ _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime) static inline PyThreadState* _PyThreadState_GET(void) { +#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS + return _PyThreadState_GetTSS(); +#else return _PyRuntimeState_GetThreadState(&_PyRuntime); +#endif } /* Redefine PyThreadState_GET() as an alias to _PyThreadState_GET() */ @@ -119,9 +131,12 @@ PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap( PyThreadState *newts); PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); -PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); +#ifdef HAVE_FORK +extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime); +extern PyStatus _PyGILState_Reinit(_PyRuntimeState *runtime); +extern void _PySignal_AfterFork(void); +#endif PyAPI_FUNC(int) _PyState_AddModule( diff --git a/Include/internal/pycore_runtime.h b/Include/internal/pycore_runtime.h index 34eb492b..bcd710c4 100644 --- a/Include/internal/pycore_runtime.h +++ b/Include/internal/pycore_runtime.h @@ -19,7 +19,9 @@ struct _ceval_runtime_state { the main thread of the main interpreter can handle signals: see _Py_ThreadCanHandleSignals(). */ _Py_atomic_int signals_pending; +#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS struct _gil_runtime_state gil; +#endif }; /* GIL state */ @@ -47,6 +49,13 @@ typedef struct _Py_AuditHookEntry { void *userData; } _Py_AuditHookEntry; +struct _Py_unicode_runtime_ids { + PyThread_type_lock lock; + // next_index value must be preserved when Py_Initialize()/Py_Finalize() + // is called multiple times: see _PyUnicode_FromId() implementation. + Py_ssize_t next_index; +}; + /* Full Python runtime state */ typedef struct pyruntimestate { @@ -100,10 +109,14 @@ typedef struct pyruntimestate { PyPreConfig preconfig; + // Audit values must be preserved when Py_Initialize()/Py_Finalize() + // is called multiple times. Py_OpenCodeHookFunction open_code_hook; void *open_code_userdata; _Py_AuditHookEntry *audit_hook_head; + struct _Py_unicode_runtime_ids unicode_ids; + // XXX Consolidate globals found via the check-c-globals script. } _PyRuntimeState; @@ -118,7 +131,7 @@ PyAPI_FUNC(PyStatus) _PyRuntimeState_Init(_PyRuntimeState *runtime); PyAPI_FUNC(void) _PyRuntimeState_Fini(_PyRuntimeState *runtime); #ifdef HAVE_FORK -PyAPI_FUNC(void) _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); +extern PyStatus _PyRuntimeState_ReInitThreads(_PyRuntimeState *runtime); #endif /* Initialize _PyRuntimeState. diff --git a/Include/internal/pycore_structseq.h b/Include/internal/pycore_structseq.h new file mode 100644 index 00000000..84c8d477 --- /dev/null +++ b/Include/internal/pycore_structseq.h @@ -0,0 +1,21 @@ +#ifndef Py_INTERNAL_STRUCTSEQ_H +#define Py_INTERNAL_STRUCTSEQ_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + + +PyAPI_FUNC(int) _PyStructSequence_InitType( + PyTypeObject *type, + PyStructSequence_Desc *desc, + unsigned long tp_flags); + + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_STRUCTSEQ_H */ diff --git a/Include/symtable.h b/Include/internal/pycore_symtable.h similarity index 86% rename from Include/symtable.h rename to Include/internal/pycore_symtable.h index abd19a79..f3505f89 100644 --- a/Include/symtable.h +++ b/Include/internal/pycore_symtable.h @@ -1,17 +1,16 @@ -#ifndef Py_LIMITED_API -#ifndef Py_SYMTABLE_H -#define Py_SYMTABLE_H +#ifndef Py_INTERNAL_SYMTABLE_H +#define Py_INTERNAL_SYMTABLE_H #ifdef __cplusplus extern "C" { #endif -#include "Python-ast.h" /* mod_ty */ +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif -/* XXX(ncoghlan): This is a weird mix of public names and interpreter internal - * names. - */ +struct _mod; // Type defined in pycore_ast.h -typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock } +typedef enum _block_type { FunctionBlock, ClassBlock, ModuleBlock, AnnotationBlock } _Py_block_ty; struct _symtable_entry; @@ -62,28 +61,26 @@ typedef struct _symtable_entry { int ste_comp_iter_expr; /* non-zero if visiting a comprehension range expression */ int ste_lineno; /* first line of block */ int ste_col_offset; /* offset of first line of block */ + int ste_end_lineno; /* end line of block */ + int ste_end_col_offset; /* end offset of first line of block */ int ste_opt_lineno; /* lineno of last exec or import * */ int ste_opt_col_offset; /* offset of last exec or import * */ struct symtable *ste_table; } PySTEntryObject; -PyAPI_DATA(PyTypeObject) PySTEntry_Type; +extern PyTypeObject PySTEntry_Type; #define PySTEntry_Check(op) Py_IS_TYPE(op, &PySTEntry_Type) -PyAPI_FUNC(int) PyST_GetScope(PySTEntryObject *, PyObject *); +extern int _PyST_GetScope(PySTEntryObject *, PyObject *); -PyAPI_FUNC(struct symtable *) PySymtable_Build( - mod_ty mod, - const char *filename, /* decoded from the filesystem encoding */ - PyFutureFeatures *future); -PyAPI_FUNC(struct symtable *) PySymtable_BuildObject( - mod_ty mod, +extern struct symtable* _PySymtable_Build( + struct _mod *mod, PyObject *filename, PyFutureFeatures *future); PyAPI_FUNC(PySTEntryObject *) PySymtable_Lookup(struct symtable *, void *); -PyAPI_FUNC(void) PySymtable_Free(struct symtable *); +extern void _PySymtable_Free(struct symtable *); /* Flags for def-use information */ @@ -116,8 +113,14 @@ PyAPI_FUNC(void) PySymtable_Free(struct symtable *); #define GENERATOR 1 #define GENERATOR_EXPRESSION 2 +// Used by symtablemodule.c +extern struct symtable* _Py_SymtableStringObjectFlags( + const char *str, + PyObject *filename, + int start, + PyCompilerFlags *flags); + #ifdef __cplusplus } #endif -#endif /* !Py_SYMTABLE_H */ -#endif /* !Py_LIMITED_API */ +#endif /* !Py_INTERNAL_SYMTABLE_H */ diff --git a/Include/internal/pycore_traceback.h b/Include/internal/pycore_traceback.h index c23290eb..4d282308 100644 --- a/Include/internal/pycore_traceback.h +++ b/Include/internal/pycore_traceback.h @@ -51,7 +51,7 @@ PyAPI_FUNC(void) _Py_DumpTraceback( _PyGILState_GetInterpreterStateUnsafe() in last resort. It is better to pass NULL to interp and current_tstate, the function tries - different options to retrieve this information. + different options to retrieve these informations. This function is signal safe. */ @@ -74,17 +74,13 @@ PyAPI_FUNC(void) _Py_DumpASCII(int fd, PyObject *text); This function is signal safe. */ PyAPI_FUNC(void) _Py_DumpDecimal( int fd, - unsigned long value); + size_t value); -/* Format an integer as hexadecimal into the file descriptor fd with at least - width digits. - - The maximum width is sizeof(unsigned long)*2 digits. - - This function is signal safe. */ +/* Format an integer as hexadecimal with width digits into fd file descriptor. + The function is signal safe. */ PyAPI_FUNC(void) _Py_DumpHexadecimal( int fd, - unsigned long value, + uintptr_t value, Py_ssize_t width); PyAPI_FUNC(PyObject*) _PyTraceBack_FromFrame( diff --git a/Include/internal/pycore_tupleobject.h b/Include/internal/pycore_tuple.h similarity index 75% rename from Include/internal/pycore_tupleobject.h rename to Include/internal/pycore_tuple.h index f95f16c0..5353e18d 100644 --- a/Include/internal/pycore_tupleobject.h +++ b/Include/internal/pycore_tuple.h @@ -1,5 +1,5 @@ -#ifndef Py_INTERNAL_TUPLEOBJECT_H -#define Py_INTERNAL_TUPLEOBJECT_H +#ifndef Py_INTERNAL_TUPLE_H +#define Py_INTERNAL_TUPLE_H #ifdef __cplusplus extern "C" { #endif @@ -11,9 +11,10 @@ extern "C" { #include "tupleobject.h" /* _PyTuple_CAST() */ #define _PyTuple_ITEMS(op) (_PyTuple_CAST(op)->ob_item) + PyAPI_FUNC(PyObject *) _PyTuple_FromArray(PyObject *const *, Py_ssize_t); #ifdef __cplusplus } #endif -#endif /* !Py_INTERNAL_TUPLEOBJECT_H */ +#endif /* !Py_INTERNAL_TUPLE_H */ diff --git a/Include/internal/pycore_ucnhash.h b/Include/internal/pycore_ucnhash.h new file mode 100644 index 00000000..187dd68e --- /dev/null +++ b/Include/internal/pycore_ucnhash.h @@ -0,0 +1,34 @@ +/* Unicode name database interface */ +#ifndef Py_INTERNAL_UCNHASH_H +#define Py_INTERNAL_UCNHASH_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +/* revised ucnhash CAPI interface (exported through a "wrapper") */ + +#define PyUnicodeData_CAPSULE_NAME "unicodedata._ucnhash_CAPI" + +typedef struct { + + /* Get name for a given character code. + Returns non-zero if success, zero if not. + Does not set Python exceptions. */ + int (*getname)(Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq); + + /* Get character code for a given name. + Same error handling as for getname(). */ + int (*getcode)(const char* name, int namelen, Py_UCS4* code, + int with_named_seq); + +} _PyUnicode_Name_CAPI; + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_UCNHASH_H */ diff --git a/Include/internal/pycore_unionobject.h b/Include/internal/pycore_unionobject.h new file mode 100644 index 00000000..9962f576 --- /dev/null +++ b/Include/internal/pycore_unionobject.h @@ -0,0 +1,22 @@ +#ifndef Py_INTERNAL_UNIONOBJECT_H +#define Py_INTERNAL_UNIONOBJECT_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef Py_BUILD_CORE +# error "this header requires Py_BUILD_CORE define" +#endif + +extern PyTypeObject _PyUnion_Type; +#define _PyUnion_Check(op) Py_IS_TYPE(op, &_PyUnion_Type) +extern PyObject *_Py_union_type_or(PyObject *, PyObject *); + +#define _PyGenericAlias_Check(op) PyObject_TypeCheck(op, &Py_GenericAliasType) +extern PyObject *_Py_subs_parameters(PyObject *, PyObject *, PyObject *, PyObject *); +extern PyObject *_Py_make_parameters(PyObject *); + +#ifdef __cplusplus +} +#endif +#endif /* !Py_INTERNAL_UNIONOBJECT_H */ diff --git a/Include/internal/pycore_warnings.h b/Include/internal/pycore_warnings.h index cafe305e..f728ec30 100644 --- a/Include/internal/pycore_warnings.h +++ b/Include/internal/pycore_warnings.h @@ -17,7 +17,7 @@ struct _warnings_runtime_state { long filters_version; }; -extern PyStatus _PyWarnings_InitState(PyThreadState *tstate); +extern int _PyWarnings_InitState(PyInterpreterState *interp); #ifdef __cplusplus } diff --git a/Include/intrcheck.h b/Include/intrcheck.h index e5bf5a83..b8cc6560 100644 --- a/Include/intrcheck.h +++ b/Include/intrcheck.h @@ -1,4 +1,3 @@ - #ifndef Py_INTRCHECK_H #define Py_INTRCHECK_H #ifdef __cplusplus @@ -6,7 +5,6 @@ extern "C" { #endif PyAPI_FUNC(int) PyOS_InterruptOccurred(void); -PyAPI_FUNC(void) PyOS_InitInterrupts(void); #ifdef HAVE_FORK #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03070000 PyAPI_FUNC(void) PyOS_BeforeFork(void); @@ -19,7 +17,6 @@ Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyOS_AfterFork(void); #ifndef Py_LIMITED_API PyAPI_FUNC(int) _PyOS_IsMainThread(void); -PyAPI_FUNC(void) _PySignal_AfterFork(void); #ifdef MS_WINDOWS /* windows.h is not included by Python.h so use void* instead of HANDLE */ diff --git a/Include/iterobject.h b/Include/iterobject.h index 51139bf1..6454611a 100644 --- a/Include/iterobject.h +++ b/Include/iterobject.h @@ -7,6 +7,9 @@ extern "C" { PyAPI_DATA(PyTypeObject) PySeqIter_Type; PyAPI_DATA(PyTypeObject) PyCallIter_Type; +#ifdef Py_BUILD_CORE +extern PyTypeObject _PyAnextAwaitable_Type; +#endif #define PySeqIter_Check(op) Py_IS_TYPE(op, &PySeqIter_Type) diff --git a/Include/longobject.h b/Include/longobject.h index 1b288099..e2301d7a 100644 --- a/Include/longobject.h +++ b/Include/longobject.h @@ -102,8 +102,6 @@ PyAPI_FUNC(long long) PyLong_AsLongLongAndOverflow(PyObject *, int *); PyAPI_FUNC(PyObject *) PyLong_FromString(const char *, char **, int); #ifndef Py_LIMITED_API -Py_DEPRECATED(3.3) -PyAPI_FUNC(PyObject *) PyLong_FromUnicode(Py_UNICODE*, Py_ssize_t, int); PyAPI_FUNC(PyObject *) PyLong_FromUnicodeObject(PyObject *u, int base); PyAPI_FUNC(PyObject *) _PyLong_FromBytes(const char *, Py_ssize_t, int); #endif @@ -173,23 +171,6 @@ PyAPI_FUNC(int) _PyLong_AsByteArray(PyLongObject* v, unsigned char* bytes, size_t n, int little_endian, int is_signed); -/* _PyLong_FromNbInt: Convert the given object to a PyLongObject - using the nb_int slot, if available. Raise TypeError if either the - nb_int slot is not available or the result of the call to nb_int - returns something not of type int. -*/ -PyAPI_FUNC(PyObject *) _PyLong_FromNbInt(PyObject *); - -/* Convert the given object to a PyLongObject using the nb_index or - nb_int slots, if available (the latter is deprecated). - Raise TypeError if either nb_index and nb_int slots are not - available or the result of the call to nb_index or nb_int - returns something not of type int. - Should be replaced with PyNumber_Index after the end of the - deprecation period. -*/ -PyAPI_FUNC(PyObject *) _PyLong_FromNbIndexOrNbInt(PyObject *); - /* _PyLong_Format: Convert the long to a string object with given base, appending a base prefix of 0[box] if base is 2, 8 or 16. */ PyAPI_FUNC(PyObject *) _PyLong_Format(PyObject *obj, int base); @@ -229,9 +210,6 @@ PyAPI_FUNC(PyObject *) _PyLong_GCD(PyObject *, PyObject *); #endif /* !Py_LIMITED_API */ #ifndef Py_LIMITED_API -PyAPI_DATA(PyObject *) _PyLong_Zero; -PyAPI_DATA(PyObject *) _PyLong_One; - PyAPI_FUNC(PyObject *) _PyLong_Rshift(PyObject *, size_t); PyAPI_FUNC(PyObject *) _PyLong_Lshift(PyObject *, size_t); #endif diff --git a/Include/methodobject.h b/Include/methodobject.h index 12e049b4..9ffe8e1a 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -41,7 +41,13 @@ struct PyMethodDef { }; typedef struct PyMethodDef PyMethodDef; +/* PyCFunction_New is declared as a function for stable ABI (declaration is + * needed for e.g. GCC with -fvisibility=hidden), but redefined as a macro + * that calls PyCFunction_NewEx. */ +PyAPI_FUNC(PyObject *) PyCFunction_New(PyMethodDef *, PyObject *); #define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL) + +/* PyCFunction_NewEx is similar: on 3.9+, this calls PyCMethod_New. */ PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *, PyObject *); @@ -73,15 +79,15 @@ PyAPI_FUNC(PyObject *) PyCMethod_New(PyMethodDef *, PyObject *, #define METH_COEXIST 0x0040 -#ifndef Py_LIMITED_API -#define METH_FASTCALL 0x0080 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030a0000 +# define METH_FASTCALL 0x0080 #endif /* This bit is preserved for Stackless Python */ #ifdef STACKLESS -#define METH_STACKLESS 0x0100 +# define METH_STACKLESS 0x0100 #else -#define METH_STACKLESS 0x0000 +# define METH_STACKLESS 0x0000 #endif /* METH_METHOD means the function stores an diff --git a/Include/modsupport.h b/Include/modsupport.h index 4c4aab65..f009d586 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -136,7 +136,15 @@ PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywords( void _PyArg_Fini(void); #endif /* Py_LIMITED_API */ -PyAPI_FUNC(int) PyModule_AddObject(PyObject *, const char *, PyObject *); +// Add an attribute with name 'name' and value 'obj' to the module 'mod. +// On success, return 0 on success. +// On error, raise an exception and return -1. +PyAPI_FUNC(int) PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value); + +// Similar to PyModule_AddObjectRef() but steal a reference to 'obj' +// (Py_DECREF(obj)) on success (if it returns 0). +PyAPI_FUNC(int) PyModule_AddObject(PyObject *mod, const char *, PyObject *value); + PyAPI_FUNC(int) PyModule_AddIntConstant(PyObject *, const char *, long); PyAPI_FUNC(int) PyModule_AddStringConstant(PyObject *, const char *, const char *); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 diff --git a/Include/moduleobject.h b/Include/moduleobject.h index cf9ad40c..49b116ca 100644 --- a/Include/moduleobject.h +++ b/Include/moduleobject.h @@ -84,6 +84,12 @@ typedef struct PyModuleDef{ freefunc m_free; } PyModuleDef; + +// Internal C API +#ifdef Py_BUILD_CORE +extern int _PyModule_IsExtension(PyObject *obj); +#endif + #ifdef __cplusplus } #endif diff --git a/Include/node.h b/Include/node.h deleted file mode 100644 index ca24f289..00000000 --- a/Include/node.h +++ /dev/null @@ -1,47 +0,0 @@ - -/* Parse tree node interface */ - -#ifndef Py_NODE_H -#define Py_NODE_H -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct _node { - short n_type; - char *n_str; - int n_lineno; - int n_col_offset; - int n_nchildren; - struct _node *n_child; - int n_end_lineno; - int n_end_col_offset; -} node; - -PyAPI_FUNC(node *) PyNode_New(int type); -PyAPI_FUNC(int) PyNode_AddChild(node *n, int type, - char *str, int lineno, int col_offset, - int end_lineno, int end_col_offset); -PyAPI_FUNC(void) PyNode_Free(node *n); -#ifndef Py_LIMITED_API -PyAPI_FUNC(Py_ssize_t) _PyNode_SizeOf(node *n); -#endif - -/* Node access functions */ -#define NCH(n) ((n)->n_nchildren) - -#define CHILD(n, i) (&(n)->n_child[i]) -#define TYPE(n) ((n)->n_type) -#define STR(n) ((n)->n_str) -#define LINENO(n) ((n)->n_lineno) - -/* Assert that the type of a node is what we expect */ -#define REQ(n, type) assert(TYPE(n) == (type)) - -PyAPI_FUNC(void) PyNode_ListTree(node *); -void _PyNode_FinalizeEndPos(node *n); // helper also used in parsetok.c - -#ifdef __cplusplus -} -#endif -#endif /* !Py_NODE_H */ diff --git a/Include/object.h b/Include/object.h index 9c1a7f47..9e6a8f46 100644 --- a/Include/object.h +++ b/Include/object.h @@ -54,11 +54,11 @@ whose size is determined when the object is allocated. /* Py_DEBUG implies Py_REF_DEBUG. */ #if defined(Py_DEBUG) && !defined(Py_REF_DEBUG) -#define Py_REF_DEBUG +# define Py_REF_DEBUG #endif -#if defined(Py_LIMITED_API) && defined(Py_REF_DEBUG) -#error Py_LIMITED_API is incompatible with Py_DEBUG, Py_TRACE_REFS, and Py_REF_DEBUG +#if defined(Py_LIMITED_API) && defined(Py_TRACE_REFS) +# error Py_LIMITED_API is incompatible with Py_TRACE_REFS #endif /* PyTypeObject structure is defined in cpython/object.h. @@ -74,8 +74,8 @@ typedef struct _typeobject PyTypeObject; #define _PyObject_EXTRA_INIT 0, 0, #else -#define _PyObject_HEAD_EXTRA -#define _PyObject_EXTRA_INIT +# define _PyObject_HEAD_EXTRA +# define _PyObject_EXTRA_INIT #endif /* PyObject_HEAD defines the initial segment of every PyObject. */ @@ -119,26 +119,47 @@ typedef struct { /* Cast argument to PyVarObject* type. */ #define _PyVarObject_CAST(op) ((PyVarObject*)(op)) +#define _PyVarObject_CAST_CONST(op) ((const PyVarObject*)(op)) -#define Py_REFCNT(ob) (_PyObject_CAST(ob)->ob_refcnt) + +// Test if the 'x' object is the 'y' object, the same as "x is y" in Python. +PyAPI_FUNC(int) Py_Is(PyObject *x, PyObject *y); +#define Py_Is(x, y) ((x) == (y)) + + +static inline Py_ssize_t _Py_REFCNT(const PyObject *ob) { + return ob->ob_refcnt; +} +#define Py_REFCNT(ob) _Py_REFCNT(_PyObject_CAST_CONST(ob)) + + +// bpo-39573: The Py_SET_TYPE() function must be used to set an object type. #define Py_TYPE(ob) (_PyObject_CAST(ob)->ob_type) + +// bpo-39573: The Py_SET_SIZE() function must be used to set an object size. #define Py_SIZE(ob) (_PyVarObject_CAST(ob)->ob_size) + static inline int _Py_IS_TYPE(const PyObject *ob, const PyTypeObject *type) { + // bpo-44378: Don't use Py_TYPE() since Py_TYPE() requires a non-const + // object. return ob->ob_type == type; } #define Py_IS_TYPE(ob, type) _Py_IS_TYPE(_PyObject_CAST_CONST(ob), type) + static inline void _Py_SET_REFCNT(PyObject *ob, Py_ssize_t refcnt) { ob->ob_refcnt = refcnt; } #define Py_SET_REFCNT(ob, refcnt) _Py_SET_REFCNT(_PyObject_CAST(ob), refcnt) + static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = type; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE(_PyObject_CAST(ob), type) + static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } @@ -221,8 +242,11 @@ PyAPI_FUNC(void *) PyType_GetModuleState(struct _typeobject *); /* Generic type check */ PyAPI_FUNC(int) PyType_IsSubtype(PyTypeObject *, PyTypeObject *); -#define PyObject_TypeCheck(ob, tp) \ - (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp))) + +static inline int _PyObject_TypeCheck(PyObject *ob, PyTypeObject *type) { + return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type); +} +#define PyObject_TypeCheck(ob, type) _PyObject_TypeCheck(_PyObject_CAST(ob), type) PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */ PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */ @@ -298,6 +322,20 @@ Code can use PyType_HasFeature(type_ob, flag_value) to test whether the given type object has a specified feature. */ +#ifndef Py_LIMITED_API +/* Set if instances of the type object are treated as sequences for pattern matching */ +#define Py_TPFLAGS_SEQUENCE (1 << 5) +/* Set if instances of the type object are treated as mappings for pattern matching */ +#define Py_TPFLAGS_MAPPING (1 << 6) +#endif + +/* Disallow creating instances of the type: set tp_new to NULL and don't create + * the "__new__" key in the type dictionary. */ +#define Py_TPFLAGS_DISALLOW_INSTANTIATION (1UL << 7) + +/* Set if the type object is immutable: type attributes cannot be set nor deleted */ +#define Py_TPFLAGS_IMMUTABLETYPE (1UL << 8) + /* Set if the type object is dynamically allocated */ #define Py_TPFLAGS_HEAPTYPE (1UL << 9) @@ -330,13 +368,17 @@ given type object has a specified feature. /* Objects behave like an unbound method */ #define Py_TPFLAGS_METHOD_DESCRIPTOR (1UL << 17) -/* Objects support type attribute cache */ -#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) +/* Object has up-to-date type attribute cache */ #define Py_TPFLAGS_VALID_VERSION_TAG (1UL << 19) /* Type is abstract and cannot be instantiated */ #define Py_TPFLAGS_IS_ABSTRACT (1UL << 20) +// This undocumented flag gives certain built-ins their unique pattern-matching +// behavior, which allows a single positional subpattern to match against the +// subject itself (rather than a mapped attribute on it): +#define _Py_TPFLAGS_MATCH_SELF (1UL << 22) + /* These flags are used to determine if a type is a subclass. */ #define Py_TPFLAGS_LONG_SUBCLASS (1UL << 24) #define Py_TPFLAGS_LIST_SUBCLASS (1UL << 25) @@ -349,19 +391,23 @@ given type object has a specified feature. #define Py_TPFLAGS_DEFAULT ( \ Py_TPFLAGS_HAVE_STACKLESS_EXTENSION | \ - Py_TPFLAGS_HAVE_VERSION_TAG | \ 0) -/* NOTE: The following flags reuse lower bits (removed as part of the +/* NOTE: Some of the following flags reuse lower bits (removed as part of the * Python 3.0 transition). */ -/* The following flag is kept for compatibility. Starting with 3.8, - * binary compatibility of C extensions across feature releases of - * Python is not supported anymore, except when using the stable ABI. +/* The following flags are kept for compatibility; in previous + * versions they indicated presence of newer tp_* fields on the + * type struct. + * Starting with 3.8, binary compatibility of C extensions across + * feature releases of Python is not supported anymore (except when + * using the stable ABI, in which all classes are created dynamically, + * using the interpreter's memory layout.) + * Note that older extensions using the stable ABI set these flags, + * so the bits must not be repurposed. */ - -/* Type structure has tp_finalize member (3.4) */ #define Py_TPFLAGS_HAVE_FINALIZE (1UL << 0) +#define Py_TPFLAGS_HAVE_VERSION_TAG (1UL << 18) /* @@ -400,22 +446,46 @@ PyAPI_FUNC(void) _Py_NegativeRefcount(const char *filename, int lineno, PyAPI_FUNC(void) _Py_Dealloc(PyObject *); +/* +These are provided as conveniences to Python runtime embedders, so that +they can have object code that is not dependent on Python compilation flags. +*/ +PyAPI_FUNC(void) Py_IncRef(PyObject *); +PyAPI_FUNC(void) Py_DecRef(PyObject *); + +// Similar to Py_IncRef() and Py_DecRef() but the argument must be non-NULL. +// Private functions used by Py_INCREF() and Py_DECREF(). +PyAPI_FUNC(void) _Py_IncRef(PyObject *); +PyAPI_FUNC(void) _Py_DecRef(PyObject *); + static inline void _Py_INCREF(PyObject *op) { +#if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 + // Stable ABI for Python 3.10 built in debug mode. + _Py_IncRef(op); +#else + // Non-limited C API and limited C API for Python 3.9 and older access + // directly PyObject.ob_refcnt. #ifdef Py_REF_DEBUG _Py_RefTotal++; #endif op->ob_refcnt++; +#endif } - #define Py_INCREF(op) _Py_INCREF(_PyObject_CAST(op)) static inline void _Py_DECREF( -#ifdef Py_REF_DEBUG +#if defined(Py_REF_DEBUG) && !(defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000) const char *filename, int lineno, #endif PyObject *op) { +#if defined(Py_REF_DEBUG) && defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000 + // Stable ABI for Python 3.10 built in debug mode. + _Py_DecRef(op); +#else + // Non-limited C API and limited C API for Python 3.9 and older access + // directly PyObject.ob_refcnt. #ifdef Py_REF_DEBUG _Py_RefTotal--; #endif @@ -429,9 +499,9 @@ static inline void _Py_DECREF( else { _Py_Dealloc(op); } +#endif } - -#ifdef Py_REF_DEBUG +#if defined(Py_REF_DEBUG) && !(defined(Py_LIMITED_API) && Py_LIMITED_API+0 >= 0x030A0000) # define Py_DECREF(op) _Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op)) #else # define Py_DECREF(op) _Py_DECREF(_PyObject_CAST(op)) @@ -500,12 +570,31 @@ static inline void _Py_XDECREF(PyObject *op) #define Py_XDECREF(op) _Py_XDECREF(_PyObject_CAST(op)) -/* -These are provided as conveniences to Python runtime embedders, so that -they can have object code that is not dependent on Python compilation flags. -*/ -PyAPI_FUNC(void) Py_IncRef(PyObject *); -PyAPI_FUNC(void) Py_DecRef(PyObject *); +// Create a new strong reference to an object: +// increment the reference count of the object and return the object. +PyAPI_FUNC(PyObject*) Py_NewRef(PyObject *obj); + +// Similar to Py_NewRef(), but the object can be NULL. +PyAPI_FUNC(PyObject*) Py_XNewRef(PyObject *obj); + +static inline PyObject* _Py_NewRef(PyObject *obj) +{ + Py_INCREF(obj); + return obj; +} + +static inline PyObject* _Py_XNewRef(PyObject *obj) +{ + Py_XINCREF(obj); + return obj; +} + +// Py_NewRef() and Py_XNewRef() are exported as functions for the stable ABI. +// Names overriden with macros by static inline functions for best +// performances. +#define Py_NewRef(obj) _Py_NewRef(_PyObject_CAST(obj)) +#define Py_XNewRef(obj) _Py_XNewRef(_PyObject_CAST(obj)) + /* _Py_NoneStruct is an object of undefined type which can be used in contexts @@ -516,8 +605,12 @@ Don't forget to apply Py_INCREF() when returning this value!!! PyAPI_DATA(PyObject) _Py_NoneStruct; /* Don't use this directly */ #define Py_None (&_Py_NoneStruct) +// Test if an object is the None singleton, the same as "x is None" in Python. +PyAPI_FUNC(int) Py_IsNone(PyObject *x); +#define Py_IsNone(x) Py_Is((x), Py_None) + /* Macro for returning Py_None from a function */ -#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None +#define Py_RETURN_NONE return Py_NewRef(Py_None) /* Py_NotImplemented is a singleton used to signal that an operation is @@ -527,8 +620,7 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ #define Py_NotImplemented (&_Py_NotImplementedStruct) /* Macro for returning Py_NotImplemented from a function */ -#define Py_RETURN_NOTIMPLEMENTED \ - return Py_INCREF(Py_NotImplemented), Py_NotImplemented +#define Py_RETURN_NOTIMPLEMENTED return Py_NewRef(Py_NotImplemented) /* Rich comparison opcodes */ #define Py_LT 0 @@ -538,6 +630,15 @@ PyAPI_DATA(PyObject) _Py_NotImplementedStruct; /* Don't use this directly */ #define Py_GT 4 #define Py_GE 5 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +/* Result of calling PyIter_Send */ +typedef enum { + PYGEN_RETURN = 0, + PYGEN_ERROR = -1, + PYGEN_NEXT = 1, +} PySendResult; +#endif + /* * Macro for implementing rich comparisons * diff --git a/Include/objimpl.h b/Include/objimpl.h index 030d7eee..450befad 100644 --- a/Include/objimpl.h +++ b/Include/objimpl.h @@ -38,7 +38,7 @@ Functions and macros for modules that implement new object types. object with room for n items. In addition to the refcount and type pointer fields, this also fills in the ob_size field. - - PyObject_Del(op) releases the memory allocated for an object. It does not + - PyObject_Free(op) releases the memory allocated for an object. It does not run a destructor -- it only frees the memory. PyObject_Free is identical. - PyObject_Init(op, typeobj) and PyObject_InitVar(op, typeobj, n) don't @@ -48,8 +48,8 @@ Functions and macros for modules that implement new object types. Note that objects created with PyObject_{New, NewVar} are allocated using the specialized Python allocator (implemented in obmalloc.c), if WITH_PYMALLOC is -enabled. In addition, a special debugging allocator is used if PYMALLOC_DEBUG -is also #defined. +enabled. In addition, a special debugging allocator is used if Py_DEBUG +macro is also defined. In case a specific form of memory management is needed (for example, if you must use the platform malloc heap(s), or shared memory, or C++ local storage or @@ -102,7 +102,9 @@ PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size); PyAPI_FUNC(void) PyObject_Free(void *ptr); -/* Macros */ +// Deprecated aliases only kept for backward compatibility. +// PyObject_Del and PyObject_DEL are defined with no parameter to be able to +// use them as function pointers (ex: tp_free = PyObject_Del). #define PyObject_MALLOC PyObject_Malloc #define PyObject_REALLOC PyObject_Realloc #define PyObject_FREE PyObject_Free @@ -118,7 +120,14 @@ PyAPI_FUNC(void) PyObject_Free(void *ptr); /* Functions */ PyAPI_FUNC(PyObject *) PyObject_Init(PyObject *, PyTypeObject *); PyAPI_FUNC(PyVarObject *) PyObject_InitVar(PyVarObject *, - PyTypeObject *, Py_ssize_t); + PyTypeObject *, Py_ssize_t); + +#define PyObject_INIT(op, typeobj) \ + PyObject_Init(_PyObject_CAST(op), (typeobj)) +#define PyObject_INIT_VAR(op, typeobj, size) \ + PyObject_InitVar(_PyVarObject_CAST(op), (typeobj), (size)) + + PyAPI_FUNC(PyObject *) _PyObject_New(PyTypeObject *); PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); @@ -131,31 +140,22 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t); #define PyObject_NewVar(type, typeobj, n) \ ( (type *) _PyObject_NewVar((typeobj), (n)) ) -// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly -// PyObject_MALLOC() with _PyObject_VAR_SIZE(). +// Alias to PyObject_NewVar(). In Python 3.8, PyObject_NEW_VAR() called +// directly PyObject_MALLOC() with _PyObject_VAR_SIZE(). #define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar(type, typeobj, n) -#ifdef Py_LIMITED_API -/* Define PyObject_INIT() and PyObject_INIT_VAR() as aliases to PyObject_Init() - and PyObject_InitVar() in the limited C API for compatibility with the - CPython C API. */ -# define PyObject_INIT(op, typeobj) \ - PyObject_Init(_PyObject_CAST(op), (typeobj)) -# define PyObject_INIT_VAR(op, typeobj, size) \ - PyObject_InitVar(_PyVarObject_CAST(op), (typeobj), (size)) -#else -/* PyObject_INIT() and PyObject_INIT_VAR() are defined in cpython/objimpl.h */ -#endif - - /* * Garbage Collection Support * ========================== */ -/* C equivalent of gc.collect() which ignores the state of gc.enabled. */ +/* C equivalent of gc.collect(). */ PyAPI_FUNC(Py_ssize_t) PyGC_Collect(void); +/* C API for controlling the state of the garbage collector */ +PyAPI_FUNC(int) PyGC_Enable(void); +PyAPI_FUNC(int) PyGC_Disable(void); +PyAPI_FUNC(int) PyGC_IsEnabled(void); /* Test if a type has a GC head */ #define PyType_IS_GC(t) PyType_HasFeature((t), Py_TPFLAGS_HAVE_GC) diff --git a/Include/opcode.h b/Include/opcode.h index 19944fac..52039754 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -30,7 +30,11 @@ extern "C" { #define BINARY_TRUE_DIVIDE 27 #define INPLACE_FLOOR_DIVIDE 28 #define INPLACE_TRUE_DIVIDE 29 -#define RERAISE 48 +#define GET_LEN 30 +#define MATCH_MAPPING 31 +#define MATCH_SEQUENCE 32 +#define MATCH_KEYS 33 +#define COPY_DICT_WITHOUT_KEYS 34 #define WITH_EXCEPT_START 49 #define GET_AITER 50 #define GET_ANEXT 51 @@ -77,6 +81,7 @@ extern "C" { #define DELETE_ATTR 96 #define STORE_GLOBAL 97 #define DELETE_GLOBAL 98 +#define ROT_N 99 #define LOAD_CONST 100 #define LOAD_NAME 101 #define BUILD_TUPLE 102 @@ -96,11 +101,13 @@ extern "C" { #define LOAD_GLOBAL 116 #define IS_OP 117 #define CONTAINS_OP 118 +#define RERAISE 119 #define JUMP_IF_NOT_EXC_MATCH 121 #define SETUP_FINALLY 122 #define LOAD_FAST 124 #define STORE_FAST 125 #define DELETE_FAST 126 +#define GEN_START 129 #define RAISE_VARARGS 130 #define CALL_FUNCTION 131 #define MAKE_FUNCTION 132 @@ -117,6 +124,7 @@ extern "C" { #define SET_ADD 146 #define MAP_ADD 147 #define LOAD_CLASSDEREF 148 +#define MATCH_CLASS 152 #define SETUP_ASYNC_WITH 154 #define FORMAT_VALUE 155 #define BUILD_CONST_KEY_MAP 156 @@ -127,6 +135,28 @@ extern "C" { #define SET_UPDATE 163 #define DICT_MERGE 164 #define DICT_UPDATE 165 +#ifdef NEED_OPCODE_JUMP_TABLES +static uint32_t _PyOpcode_RelativeJump[8] = { + 0U, + 0U, + 536870912U, + 67125248U, + 67141632U, + 0U, + 0U, + 0U, +}; +static uint32_t _PyOpcode_Jump[8] = { + 0U, + 0U, + 536870912U, + 101695488U, + 67141632U, + 0U, + 0U, + 0U, +}; +#endif /* OPCODE_TABLES */ /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here diff --git a/Include/parsetok.h b/Include/parsetok.h deleted file mode 100644 index 935d733e..00000000 --- a/Include/parsetok.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Parser-tokenizer link interface */ - -#ifndef Py_LIMITED_API -#ifndef Py_PARSETOK_H -#define Py_PARSETOK_H -#ifdef __cplusplus -extern "C" { -#endif - -#include "grammar.h" /* grammar */ -#include "node.h" /* node */ - -typedef struct { - int error; - PyObject *filename; - int lineno; - int offset; - char *text; /* UTF-8-encoded string */ - int token; - int expected; -} perrdetail; - -#if 0 -#define PyPARSE_YIELD_IS_KEYWORD 0x0001 -#endif - -#define PyPARSE_DONT_IMPLY_DEDENT 0x0002 - -#if 0 -#define PyPARSE_WITH_IS_KEYWORD 0x0003 -#define PyPARSE_PRINT_IS_FUNCTION 0x0004 -#define PyPARSE_UNICODE_LITERALS 0x0008 -#endif - -#define PyPARSE_IGNORE_COOKIE 0x0010 -#define PyPARSE_BARRY_AS_BDFL 0x0020 -#define PyPARSE_TYPE_COMMENTS 0x0040 -#define PyPARSE_ASYNC_HACKS 0x0080 - -PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, - perrdetail *); -PyAPI_FUNC(node *) PyParser_ParseFile (FILE *, const char *, grammar *, int, - const char *, const char *, - perrdetail *); - -PyAPI_FUNC(node *) PyParser_ParseStringFlags(const char *, grammar *, int, - perrdetail *, int); -PyAPI_FUNC(node *) PyParser_ParseFileFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - const char *enc, - grammar *g, - int start, - const char *ps1, - const char *ps2, - perrdetail *err_ret, - int flags); -PyAPI_FUNC(node *) PyParser_ParseFileFlagsEx( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - const char *enc, - grammar *g, - int start, - const char *ps1, - const char *ps2, - perrdetail *err_ret, - int *flags); -PyAPI_FUNC(node *) PyParser_ParseFileObject( - FILE *fp, - PyObject *filename, - const char *enc, - grammar *g, - int start, - const char *ps1, - const char *ps2, - perrdetail *err_ret, - int *flags); - -PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilename( - const char *s, - const char *filename, /* decoded from the filesystem encoding */ - grammar *g, - int start, - perrdetail *err_ret, - int flags); -PyAPI_FUNC(node *) PyParser_ParseStringFlagsFilenameEx( - const char *s, - const char *filename, /* decoded from the filesystem encoding */ - grammar *g, - int start, - perrdetail *err_ret, - int *flags); -PyAPI_FUNC(node *) PyParser_ParseStringObject( - const char *s, - PyObject *filename, - grammar *g, - int start, - perrdetail *err_ret, - int *flags); - -/* Note that the following functions are defined in pythonrun.c, - not in parsetok.c */ -PyAPI_FUNC(void) PyParser_SetError(perrdetail *); -PyAPI_FUNC(void) PyParser_ClearError(perrdetail *); - -#ifdef __cplusplus -} -#endif -#endif /* !Py_PARSETOK_H */ -#endif /* !Py_LIMITED_API */ diff --git a/Include/patchlevel.h b/Include/patchlevel.h index e33d9a1d..afa621e6 100644 --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -17,13 +17,13 @@ /* Version parsed out into numeric values */ /*--start constants--*/ #define PY_MAJOR_VERSION 3 -#define PY_MINOR_VERSION 9 -#define PY_MICRO_VERSION 16 +#define PY_MINOR_VERSION 10 +#define PY_MICRO_VERSION 0 #define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL #define PY_RELEASE_SERIAL 0 /* Version as a string */ -#define PY_VERSION "3.9.16" +#define PY_VERSION "3.10.0" /*--end constants--*/ /* Version as a single 4-byte hex number, e.g. 0x010502B2 == 1.5.2b2. diff --git a/Include/pyarena.h b/Include/pyarena.h deleted file mode 100644 index db3ad018..00000000 --- a/Include/pyarena.h +++ /dev/null @@ -1,64 +0,0 @@ -/* An arena-like memory interface for the compiler. - */ - -#ifndef Py_LIMITED_API -#ifndef Py_PYARENA_H -#define Py_PYARENA_H - -#ifdef __cplusplus -extern "C" { -#endif - - typedef struct _arena PyArena; - - /* PyArena_New() and PyArena_Free() create a new arena and free it, - respectively. Once an arena has been created, it can be used - to allocate memory via PyArena_Malloc(). Pointers to PyObject can - also be registered with the arena via PyArena_AddPyObject(), and the - arena will ensure that the PyObjects stay alive at least until - PyArena_Free() is called. When an arena is freed, all the memory it - allocated is freed, the arena releases internal references to registered - PyObject*, and none of its pointers are valid. - XXX (tim) What does "none of its pointers are valid" mean? Does it - XXX mean that pointers previously obtained via PyArena_Malloc() are - XXX no longer valid? (That's clearly true, but not sure that's what - XXX the text is trying to say.) - - PyArena_New() returns an arena pointer. On error, it - returns a negative number and sets an exception. - XXX (tim): Not true. On error, PyArena_New() actually returns NULL, - XXX and looks like it may or may not set an exception (e.g., if the - XXX internal PyList_New(0) returns NULL, PyArena_New() passes that on - XXX and an exception is set; OTOH, if the internal - XXX block_new(DEFAULT_BLOCK_SIZE) returns NULL, that's passed on but - XXX an exception is not set in that case). - */ - PyAPI_FUNC(PyArena *) PyArena_New(void); - PyAPI_FUNC(void) PyArena_Free(PyArena *); - - /* Mostly like malloc(), return the address of a block of memory spanning - * `size` bytes, or return NULL (without setting an exception) if enough - * new memory can't be obtained. Unlike malloc(0), PyArena_Malloc() with - * size=0 does not guarantee to return a unique pointer (the pointer - * returned may equal one or more other pointers obtained from - * PyArena_Malloc()). - * Note that pointers obtained via PyArena_Malloc() must never be passed to - * the system free() or realloc(), or to any of Python's similar memory- - * management functions. PyArena_Malloc()-obtained pointers remain valid - * until PyArena_Free(ar) is called, at which point all pointers obtained - * from the arena `ar` become invalid simultaneously. - */ - PyAPI_FUNC(void *) PyArena_Malloc(PyArena *, size_t size); - - /* This routine isn't a proper arena allocation routine. It takes - * a PyObject* and records it so that it can be DECREFed when the - * arena is freed. - */ - PyAPI_FUNC(int) PyArena_AddPyObject(PyArena *, PyObject *); - -#ifdef __cplusplus -} -#endif - -#endif /* !Py_PYARENA_H */ -#endif /* Py_LIMITED_API */ diff --git a/Include/pyerrors.h b/Include/pyerrors.h index 979a26ba..f5d1c711 100644 --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -30,12 +30,6 @@ PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *); macro is defined. */ PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message); -#if defined(Py_DEBUG) || defined(Py_LIMITED_API) -#define _PyErr_OCCURRED() PyErr_Occurred() -#else -#define _PyErr_OCCURRED() (PyThreadState_GET()->curexc_type) -#endif - /* Error testing and normalization */ PyAPI_FUNC(int) PyErr_GivenExceptionMatches(PyObject *, PyObject *); PyAPI_FUNC(int) PyErr_ExceptionMatches(PyObject *); @@ -152,6 +146,7 @@ PyAPI_DATA(PyObject *) PyExc_FutureWarning; PyAPI_DATA(PyObject *) PyExc_ImportWarning; PyAPI_DATA(PyObject *) PyExc_UnicodeWarning; PyAPI_DATA(PyObject *) PyExc_BytesWarning; +PyAPI_DATA(PyObject *) PyExc_EncodingWarning; PyAPI_DATA(PyObject *) PyExc_ResourceWarning; @@ -230,6 +225,9 @@ PyAPI_FUNC(void) PyErr_WriteUnraisable(PyObject *); /* In signalmodule.c */ PyAPI_FUNC(int) PyErr_CheckSignals(void); PyAPI_FUNC(void) PyErr_SetInterrupt(void); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +PyAPI_FUNC(int) PyErr_SetInterruptEx(int signum); +#endif /* Support for adding program text to SyntaxErrors */ PyAPI_FUNC(void) PyErr_SyntaxLocation( diff --git a/Include/pyhash.h b/Include/pyhash.h index 4437b870..a314ea90 100644 --- a/Include/pyhash.h +++ b/Include/pyhash.h @@ -7,7 +7,7 @@ extern "C" { /* Helpers for hash functions */ #ifndef Py_LIMITED_API -PyAPI_FUNC(Py_hash_t) _Py_HashDouble(double); +PyAPI_FUNC(Py_hash_t) _Py_HashDouble(PyObject *, double); PyAPI_FUNC(Py_hash_t) _Py_HashPointer(const void*); // Similar to _Py_HashPointer(), but don't replace -1 with -2 PyAPI_FUNC(Py_hash_t) _Py_HashPointerRaw(const void*); @@ -29,7 +29,6 @@ PyAPI_FUNC(Py_hash_t) _Py_HashBytes(const void*, Py_ssize_t); #define _PyHASH_MODULUS (((size_t)1 << _PyHASH_BITS) - 1) #define _PyHASH_INF 314159 -#define _PyHASH_NAN 0 #define _PyHASH_IMAG _PyHASH_MULTIPLIER @@ -77,7 +76,6 @@ typedef union { } expat; } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; -#endif #ifdef Py_DEBUG PyAPI_DATA(int) _Py_HashSecret_Initialized; @@ -85,7 +83,6 @@ PyAPI_DATA(int) _Py_HashSecret_Initialized; /* hash function definition */ -#ifndef Py_LIMITED_API typedef struct { Py_hash_t (*const hash)(const void *, Py_ssize_t); const char *name; diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h index 783fcb45..2df7fe6e 100644 --- a/Include/pylifecycle.h +++ b/Include/pylifecycle.h @@ -31,9 +31,6 @@ PyAPI_FUNC(void) _Py_NO_RETURN Py_Exit(int); /* Bootstrap __main__ (defined in Modules/main.c) */ PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv); - -PyAPI_FUNC(int) Py_FrozenMain(int argc, char **argv); - PyAPI_FUNC(int) Py_BytesMain(int argc, char **argv); /* In pathconfig.c */ diff --git a/Include/pymath.h b/Include/pymath.h index 63ca9727..f8697243 100644 --- a/Include/pymath.h +++ b/Include/pymath.h @@ -227,12 +227,4 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short); * behavior. */ #define _Py_InIntegralTypeRange(type, v) (_Py_IntegralTypeMin(type) <= v && v <= _Py_IntegralTypeMax(type)) -/* Return the smallest integer k such that n < 2**k, or 0 if n == 0. - * Equivalent to floor(log2(x))+1. Also equivalent to: bitwidth_of_type - - * count_leading_zero_bits(x) - */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(unsigned int) _Py_bit_length(unsigned long d); -#endif - #endif /* Py_PYMATH_H */ diff --git a/Include/pymem.h b/Include/pymem.h index 607feb94..66cdb0d2 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -25,8 +25,8 @@ extern "C" { heap used by the Python DLL; it could be a disaster if you free()'ed that directly in your own extension. Using PyMem_Free instead ensures Python can return the memory to the proper heap. As another example, in - PYMALLOC_DEBUG mode, Python wraps all calls to all PyMem_ and PyObject_ - memory functions in special debugging wrappers that add additional + a debug build (Py_DEBUG macro), Python wraps all calls to all PyMem_ and + PyObject_ memory functions in special debugging wrappers that add additional debugging info to dynamic memory blocks. The system routines have no idea what to do with that stuff, and the Python wrappers have no idea what to do with raw blocks obtained directly by the system routines then. @@ -50,21 +50,10 @@ extern "C" { */ PyAPI_FUNC(void *) PyMem_Malloc(size_t size); +PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size); PyAPI_FUNC(void) PyMem_Free(void *ptr); -/* Macros. */ - -/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL - for malloc(0), which would be treated as an error. Some platforms - would return a pointer with no memory behind it, which would break - pymalloc. To solve these problems, allocate an extra byte. */ -/* Returns NULL to indicate error if a negative size or size larger than - Py_ssize_t can represent is supplied. Helps prevents security holes. */ -#define PyMem_MALLOC(n) PyMem_Malloc(n) -#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) -#define PyMem_FREE(p) PyMem_Free(p) - /* * Type-oriented memory interface * ============================== @@ -78,9 +67,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_New(type, n) \ ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) -#define PyMem_NEW(type, n) \ - ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ - ( (type *) PyMem_MALLOC((n) * sizeof(type)) ) ) /* * The value of (p) is always clobbered by this macro regardless of success. @@ -91,15 +77,18 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_Resize(p, type, n) \ ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) -#define PyMem_RESIZE(p, type, n) \ - ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ - (type *) PyMem_REALLOC((p), (n) * sizeof(type)) ) -/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used - * anymore. They're just confusing aliases for PyMem_{Free,FREE} now. - */ -#define PyMem_Del PyMem_Free -#define PyMem_DEL PyMem_FREE + +// Deprecated aliases only kept for backward compatibility. +// PyMem_Del and PyMem_DEL are defined with no parameter to be able to use +// them as function pointers (ex: dealloc = PyMem_Del). +#define PyMem_MALLOC(n) PyMem_Malloc(n) +#define PyMem_NEW(type, n) PyMem_New(type, n) +#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) +#define PyMem_RESIZE(p, type, n) PyMem_Resize(p, type, n) +#define PyMem_FREE(p) PyMem_Free(p) +#define PyMem_Del PyMem_Free +#define PyMem_DEL PyMem_Free #ifndef Py_LIMITED_API diff --git a/Include/pyport.h b/Include/pyport.h index 4bd4eb47..6ab0ae40 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -101,7 +101,9 @@ typedef intptr_t Py_intptr_t; * sizeof(size_t). C99 doesn't define such a thing directly (size_t is an * unsigned integral type). See PEP 353 for details. */ -#ifdef HAVE_SSIZE_T +#ifdef HAVE_PY_SSIZE_T + +#elif HAVE_SSIZE_T typedef ssize_t Py_ssize_t; #elif SIZEOF_VOID_P == SIZEOF_SIZE_T typedef Py_intptr_t Py_ssize_t; @@ -131,7 +133,9 @@ typedef int Py_ssize_clean_t; /* Smallest negative value of type Py_ssize_t. */ #define PY_SSIZE_T_MIN (-PY_SSIZE_T_MAX-1) -/* PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf +/* Macro kept for backward compatibility: use "z" in new code. + * + * PY_FORMAT_SIZE_T is a platform-specific modifier for use in a printf * format to convert an argument with the width of a size_t or Py_ssize_t. * C99 introduced "z" for this purpose, but old MSVCs had not supported it. * Since MSVC supports "z" since (at least) 2015, we can just use "z" @@ -179,8 +183,9 @@ typedef int Py_ssize_clean_t; #if defined(_MSC_VER) # if defined(PY_LOCAL_AGGRESSIVE) - /* enable more aggressive optimization for visual studio */ -# pragma optimize("agtw", on) + /* enable more aggressive optimization for MSVC */ + /* active in both release and debug builds - see bpo-43271 */ +# pragma optimize("gt", on) #endif /* ignore warnings if the compiler decides not to inline a function */ # pragma warning(disable: 4710) @@ -839,12 +844,16 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; #endif #if defined(__ANDROID__) || defined(__VXWORKS__) - /* Ignore the locale encoding: force UTF-8 */ + // Use UTF-8 as the locale encoding, ignore the LC_CTYPE locale. + // See _Py_GetLocaleEncoding(), PyUnicode_DecodeLocale() + // and PyUnicode_EncodeLocale(). # define _Py_FORCE_UTF8_LOCALE #endif #if defined(_Py_FORCE_UTF8_LOCALE) || defined(__APPLE__) - /* Use UTF-8 as filesystem encoding */ + // Use UTF-8 as the filesystem encoding. + // See PyUnicode_DecodeFSDefaultAndSize(), PyUnicode_EncodeFSDefault(), + // Py_DecodeLocale() and Py_EncodeLocale(). # define _Py_FORCE_UTF8_FS_ENCODING #endif @@ -852,6 +861,7 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); XLC support is intentionally omitted due to bpo-40244 */ +#ifndef _Py_NO_RETURN #if defined(__clang__) || \ (defined(__GNUC__) && \ ((__GNUC__ >= 3) || \ @@ -862,6 +872,7 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler; #else # define _Py_NO_RETURN #endif +#endif // Preprocessor check for a builtin preprocessor function. Always return 0 diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 57529072..b0a2fc30 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -7,194 +7,15 @@ extern "C" { #endif -#ifndef Py_LIMITED_API -PyAPI_FUNC(int) PyRun_SimpleStringFlags(const char *, PyCompilerFlags *); -PyAPI_FUNC(int) PyRun_AnyFileExFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - int closeit, - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_SimpleFileExFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - int closeit, - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_InteractiveOneFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_InteractiveOneObject( - FILE *fp, - PyObject *filename, - PyCompilerFlags *flags); -PyAPI_FUNC(int) PyRun_InteractiveLoopFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - PyCompilerFlags *flags); - -PyAPI_FUNC(struct _mod *) PyParser_ASTFromString( - const char *s, - const char *filename, /* decoded from the filesystem encoding */ - int start, - PyCompilerFlags *flags, - PyArena *arena); -PyAPI_FUNC(struct _mod *) PyParser_ASTFromStringObject( - const char *s, - PyObject *filename, - int start, - PyCompilerFlags *flags, - PyArena *arena); -PyAPI_FUNC(struct _mod *) PyParser_ASTFromFile( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - const char* enc, - int start, - const char *ps1, - const char *ps2, - PyCompilerFlags *flags, - int *errcode, - PyArena *arena); -PyAPI_FUNC(struct _mod *) PyParser_ASTFromFileObject( - FILE *fp, - PyObject *filename, - const char* enc, - int start, - const char *ps1, - const char *ps2, - PyCompilerFlags *flags, - int *errcode, - PyArena *arena); -#endif - -#ifndef PyParser_SimpleParseString -#define PyParser_SimpleParseString(S, B) \ - PyParser_SimpleParseStringFlags(S, B, 0) -#define PyParser_SimpleParseFile(FP, S, B) \ - PyParser_SimpleParseFileFlags(FP, S, B, 0) -#endif - -#ifndef Py_BUILD_CORE -Py_DEPRECATED(3.9) -#endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlags(const char *, int, int); -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 -#ifndef Py_BUILD_CORE -Py_DEPRECATED(3.9) -#endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseStringFlagsFilename(const char *, - const char *, - int, int); -#endif -#ifndef Py_BUILD_CORE -Py_DEPRECATED(3.9) -#endif -PyAPI_FUNC(struct _node *) PyParser_SimpleParseFileFlags(FILE *, const char *, int, int); -#ifndef Py_LIMITED_API -PyAPI_FUNC(PyObject *) PyRun_StringFlags(const char *, int, PyObject *, - PyObject *, PyCompilerFlags *); - -PyAPI_FUNC(PyObject *) PyRun_FileExFlags( - FILE *fp, - const char *filename, /* decoded from the filesystem encoding */ - int start, - PyObject *globals, - PyObject *locals, - int closeit, - PyCompilerFlags *flags); -#endif - -#ifdef Py_LIMITED_API PyAPI_FUNC(PyObject *) Py_CompileString(const char *, const char *, int); -#else -#define Py_CompileString(str, p, s) Py_CompileStringExFlags(str, p, s, NULL, -1) -#define Py_CompileStringFlags(str, p, s, f) Py_CompileStringExFlags(str, p, s, f, -1) -PyAPI_FUNC(PyObject *) Py_CompileStringExFlags( - const char *str, - const char *filename, /* decoded from the filesystem encoding */ - int start, - PyCompilerFlags *flags, - int optimize); -PyAPI_FUNC(PyObject *) Py_CompileStringObject( - const char *str, - PyObject *filename, int start, - PyCompilerFlags *flags, - int optimize); -#endif -PyAPI_FUNC(struct symtable *) Py_SymtableString( - const char *str, - const char *filename, /* decoded from the filesystem encoding */ - int start); -#ifndef Py_LIMITED_API -PyAPI_FUNC(const char *) _Py_SourceAsString( - PyObject *cmd, - const char *funcname, - const char *what, - PyCompilerFlags *cf, - PyObject **cmd_copy); - -PyAPI_FUNC(struct symtable *) Py_SymtableStringObject( - const char *str, - PyObject *filename, - int start); - -PyAPI_FUNC(struct symtable *) _Py_SymtableStringObjectFlags( - const char *str, - PyObject *filename, - int start, - PyCompilerFlags *flags); -#endif PyAPI_FUNC(void) PyErr_Print(void); PyAPI_FUNC(void) PyErr_PrintEx(int); PyAPI_FUNC(void) PyErr_Display(PyObject *, PyObject *, PyObject *); -#ifndef Py_LIMITED_API -/* A function flavor is also exported by libpython. It is required when - libpython is accessed directly rather than using header files which defines - macros below. On Windows, for example, PyAPI_FUNC() uses dllexport to - export functions in pythonXX.dll. */ -PyAPI_FUNC(PyObject *) PyRun_String(const char *str, int s, PyObject *g, PyObject *l); -PyAPI_FUNC(int) PyRun_AnyFile(FILE *fp, const char *name); -PyAPI_FUNC(int) PyRun_AnyFileEx(FILE *fp, const char *name, int closeit); -PyAPI_FUNC(int) PyRun_AnyFileFlags(FILE *, const char *, PyCompilerFlags *); -PyAPI_FUNC(int) PyRun_SimpleString(const char *s); -PyAPI_FUNC(int) PyRun_SimpleFile(FILE *f, const char *p); -PyAPI_FUNC(int) PyRun_SimpleFileEx(FILE *f, const char *p, int c); -PyAPI_FUNC(int) PyRun_InteractiveOne(FILE *f, const char *p); -PyAPI_FUNC(int) PyRun_InteractiveLoop(FILE *f, const char *p); -PyAPI_FUNC(PyObject *) PyRun_File(FILE *fp, const char *p, int s, PyObject *g, PyObject *l); -PyAPI_FUNC(PyObject *) PyRun_FileEx(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, int c); -PyAPI_FUNC(PyObject *) PyRun_FileFlags(FILE *fp, const char *p, int s, PyObject *g, PyObject *l, PyCompilerFlags *flags); - -/* Use macros for a bunch of old variants */ -#define PyRun_String(str, s, g, l) PyRun_StringFlags(str, s, g, l, NULL) -#define PyRun_AnyFile(fp, name) PyRun_AnyFileExFlags(fp, name, 0, NULL) -#define PyRun_AnyFileEx(fp, name, closeit) \ - PyRun_AnyFileExFlags(fp, name, closeit, NULL) -#define PyRun_AnyFileFlags(fp, name, flags) \ - PyRun_AnyFileExFlags(fp, name, 0, flags) -#define PyRun_SimpleString(s) PyRun_SimpleStringFlags(s, NULL) -#define PyRun_SimpleFile(f, p) PyRun_SimpleFileExFlags(f, p, 0, NULL) -#define PyRun_SimpleFileEx(f, p, c) PyRun_SimpleFileExFlags(f, p, c, NULL) -#define PyRun_InteractiveOne(f, p) PyRun_InteractiveOneFlags(f, p, NULL) -#define PyRun_InteractiveLoop(f, p) PyRun_InteractiveLoopFlags(f, p, NULL) -#define PyRun_File(fp, p, s, g, l) \ - PyRun_FileExFlags(fp, p, s, g, l, 0, NULL) -#define PyRun_FileEx(fp, p, s, g, l, c) \ - PyRun_FileExFlags(fp, p, s, g, l, c, NULL) -#define PyRun_FileFlags(fp, p, s, g, l, flags) \ - PyRun_FileExFlags(fp, p, s, g, l, 0, flags) -#endif /* Stuff with no proper home (yet) */ -#ifndef Py_LIMITED_API -PyAPI_FUNC(char *) PyOS_Readline(FILE *, FILE *, const char *); -#endif PyAPI_DATA(int) (*PyOS_InputHook)(void); -PyAPI_DATA(char) *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *); -#ifndef Py_LIMITED_API -PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; -#endif /* Stack size, in "pointers" (so we get extra safety margins on 64-bit platforms). On a 32-bit platform, this translates @@ -211,6 +32,12 @@ PyAPI_DATA(PyThreadState*) _PyOS_ReadlineTState; PyAPI_FUNC(int) PyOS_CheckStack(void); #endif +#ifndef Py_LIMITED_API +# define Py_CPYTHON_PYTHONRUN_H +# include "cpython/pythonrun.h" +# undef Py_CPYTHON_PYTHONRUN_H +#endif + #ifdef __cplusplus } #endif diff --git a/Include/setobject.h b/Include/setobject.h index 119619eb..62516be5 100644 --- a/Include/setobject.h +++ b/Include/setobject.h @@ -88,18 +88,21 @@ PyAPI_FUNC(PyObject *) PySet_Pop(PyObject *set); PyAPI_FUNC(Py_ssize_t) PySet_Size(PyObject *anyset); #define PyFrozenSet_CheckExact(ob) Py_IS_TYPE(ob, &PyFrozenSet_Type) +#define PyFrozenSet_Check(ob) \ + (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ + PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + #define PyAnySet_CheckExact(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type)) #define PyAnySet_Check(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) + +#define PySet_CheckExact(op) Py_IS_TYPE(op, &PySet_Type) #define PySet_Check(ob) \ (Py_IS_TYPE(ob, &PySet_Type) || \ PyType_IsSubtype(Py_TYPE(ob), &PySet_Type)) -#define PyFrozenSet_Check(ob) \ - (Py_IS_TYPE(ob, &PyFrozenSet_Type) || \ - PyType_IsSubtype(Py_TYPE(ob), &PyFrozenSet_Type)) #ifdef __cplusplus } diff --git a/Include/structmember.h b/Include/structmember.h index b54f7081..93b7aff8 100644 --- a/Include/structmember.h +++ b/Include/structmember.h @@ -62,6 +62,7 @@ typedef struct PyMemberDef { #define PY_WRITE_RESTRICTED 4 #define RESTRICTED (READ_RESTRICTED | PY_WRITE_RESTRICTED) +#define PY_AUDIT_READ READ_RESTRICTED /* Current API, use this */ PyAPI_FUNC(PyObject *) PyMember_GetOne(const char *, struct PyMemberDef *); diff --git a/Include/token.h b/Include/token.h index 9b8a3aae..eb1b9ea4 100644 --- a/Include/token.h +++ b/Include/token.h @@ -69,8 +69,9 @@ extern "C" { #define ASYNC 56 #define TYPE_IGNORE 57 #define TYPE_COMMENT 58 -#define ERRORTOKEN 59 -#define N_TOKENS 63 +#define SOFT_KEYWORD 59 +#define ERRORTOKEN 60 +#define N_TOKENS 64 #define NT_OFFSET 256 /* Special definitions for cooperation with parser */ diff --git a/Include/typeslots.h b/Include/typeslots.h index 64f6fff5..5800d015 100644 --- a/Include/typeslots.h +++ b/Include/typeslots.h @@ -88,3 +88,7 @@ /* New in 3.5 */ #define Py_tp_finalize 80 #endif +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +/* New in 3.10 */ +#define Py_am_send 81 +#endif diff --git a/Include/ucnhash.h b/Include/ucnhash.h deleted file mode 100644 index 45362e99..00000000 --- a/Include/ucnhash.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Unicode name database interface */ -#ifndef Py_LIMITED_API -#ifndef Py_UCNHASH_H -#define Py_UCNHASH_H -#ifdef __cplusplus -extern "C" { -#endif - -/* revised ucnhash CAPI interface (exported through a "wrapper") */ - -#define PyUnicodeData_CAPSULE_NAME "unicodedata.ucnhash_CAPI" - -typedef struct { - - /* Size of this struct */ - int size; - - /* Get name for a given character code. Returns non-zero if - success, zero if not. Does not set Python exceptions. - If self is NULL, data come from the default version of the database. - If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ - int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen, - int with_alias_and_seq); - - /* Get character code for a given name. Same error handling - as for getname. */ - int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code, - int with_named_seq); - -} _PyUnicode_Name_CAPI; - -#ifdef __cplusplus -} -#endif -#endif /* !Py_UCNHASH_H */ -#endif /* !Py_LIMITED_API */ diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 500ce242..b0ac086a 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -261,11 +261,14 @@ PyAPI_FUNC(PyObject *) PyUnicode_FromFormat( ); PyAPI_FUNC(void) PyUnicode_InternInPlace(PyObject **); -PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); PyAPI_FUNC(PyObject *) PyUnicode_InternFromString( const char *u /* UTF-8 encoded string */ ); +// PyUnicode_InternImmortal() is deprecated since Python 3.10 +// and will be removed in Python 3.12. Use PyUnicode_InternInPlace() instead. +Py_DEPRECATED(3.10) PyAPI_FUNC(void) PyUnicode_InternImmortal(PyObject **); + /* Use only if you know it's a string */ #define PyUnicode_CHECK_INTERNED(op) \ (((PyASCIIObject *)(op))->state.interned) @@ -465,6 +468,23 @@ PyAPI_FUNC(PyObject*) PyUnicode_AsUTF8String( PyObject *unicode /* Unicode object */ ); +/* Returns a pointer to the default encoding (UTF-8) of the + Unicode object unicode and the size of the encoded representation + in bytes stored in *size. + + In case of an error, no *size is set. + + This function caches the UTF-8 encoded string in the unicodeobject + and subsequent calls will return the same string. The memory is released + when the unicodeobject is deallocated. +*/ + +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030A0000 +PyAPI_FUNC(const char *) PyUnicode_AsUTF8AndSize( + PyObject *unicode, + Py_ssize_t *size); +#endif + /* --- UTF-32 Codecs ------------------------------------------------------ */ /* Decodes length bytes from a UTF-32 encoded buffer string and returns diff --git a/LICENSE b/LICENSE index 739c90c2..55cb8d37 100644 --- a/LICENSE +++ b/LICENSE @@ -84,7 +84,7 @@ analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Python Software Foundation; +2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. @@ -191,9 +191,9 @@ version prepared by Licensee. Alternately, in lieu of CNRI's License Agreement, Licensee may substitute the following text (omitting the quotes): "Python 1.6.1 is made available subject to the terms and conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following +Python 1.6.1 may be located on the internet using the following unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet +Agreement may also be obtained from a proxy server on the internet using the following URL: http://hdl.handle.net/1895.22/1013". 3. In the event Licensee prepares a derivative work that is based on diff --git a/Lib/__future__.py b/Lib/__future__.py index 0e7b5552..97dc90c6 100644 --- a/Lib/__future__.py +++ b/Lib/__future__.py @@ -42,7 +42,7 @@ CompilerFlag is the (bitfield) flag that should be passed in the fourth argument to the builtin function compile() to enable the feature in dynamically compiled code. This flag is stored in the .compiler_flag attribute on _Future instances. These values must match the appropriate -#defines of CO_xxx flags in Include/compile.h. +#defines of CO_xxx flags in Include/cpython/compile.h. No feature line is ever to be deleted from this file. """ @@ -143,5 +143,5 @@ generator_stop = _Feature((3, 5, 0, "beta", 1), CO_FUTURE_GENERATOR_STOP) annotations = _Feature((3, 7, 0, "beta", 1), - (3, 10, 0, "alpha", 0), + (3, 11, 0, "alpha", 0), CO_FUTURE_ANNOTATIONS) diff --git a/Lib/_aix_support.py b/Lib/_aix_support.py index d27a1e87..45504934 100644 --- a/Lib/_aix_support.py +++ b/Lib/_aix_support.py @@ -15,9 +15,8 @@ def _aix_tag(vrtl, bd): # type: (List[int], int) -> str # Infer the ABI bitwidth from maxsize (assuming 64 bit as the default) _sz = 32 if sys.maxsize == (2**31-1) else 64 - _bd = bd if bd != 0 else 9988 # vrtl[version, release, technology_level] - return "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(vrtl[0], vrtl[1], vrtl[2], _bd, _sz) + return "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(vrtl[0], vrtl[1], vrtl[2], bd, _sz) # extract version, release and technology level from a VRMF string @@ -27,20 +26,19 @@ def _aix_vrtl(vrmf): return [int(v[-1]), int(r), int(tl)] -def _aix_bos_rte(): +def _aix_bosmp64(): # type: () -> Tuple[str, int] """ Return a Tuple[str, int] e.g., ['7.1.4.34', 1806] - The fileset bos.rte represents the current AIX run-time level. It's VRMF and - builddate reflect the current ABI levels of the runtime environment. - If no builddate is found give a value that will satisfy pep425 related queries + The fileset bos.mp64 is the AIX kernel. It's VRMF and builddate + reflect the current ABI levels of the runtime environment. """ - # All AIX systems to have lslpp installed in this location - out = subprocess.check_output(["/usr/bin/lslpp", "-Lqc", "bos.rte"]) + # We expect all AIX systems to have lslpp installed in this location + out = subprocess.check_output(["/usr/bin/lslpp", "-Lqc", "bos.mp64"]) out = out.decode("utf-8") out = out.strip().split(":") # type: ignore - _bd = int(out[-1]) if out[-1] != '' else 9988 - return (str(out[2]), _bd) + # Use str() and int() to help mypy see types + return (str(out[2]), int(out[-1])) def aix_platform(): @@ -49,11 +47,11 @@ def aix_platform(): AIX filesets are identified by four decimal values: V.R.M.F. V (version) and R (release) can be retreived using ``uname`` Since 2007, starting with AIX 5.3 TL7, the M value has been - included with the fileset bos.rte and represents the Technology + included with the fileset bos.mp64 and represents the Technology Level (TL) of AIX. The F (Fix) value also increases, but is not relevant for comparing releases and binary compatibility. For binary compatibility the so-called builddate is needed. - Again, the builddate of an AIX release is associated with bos.rte. + Again, the builddate of an AIX release is associated with bos.mp64. AIX ABI compatibility is described as guaranteed at: https://www.ibm.com/\ support/knowledgecenter/en/ssw_aix_72/install/binary_compatability.html @@ -62,7 +60,7 @@ def aix_platform(): e.g., "aix-6107-1415-32" for AIX 6.1 TL7 bd 1415, 32-bit and, "aix-6107-1415-64" for AIX 6.1 TL7 bd 1415, 64-bit """ - vrmf, bd = _aix_bos_rte() + vrmf, bd = _aix_bosmp64() return _aix_tag(_aix_vrtl(vrmf), bd) @@ -81,7 +79,7 @@ def aix_buildtag(): Return the platform_tag of the system Python was built on. """ # AIX_BUILDDATE is defined by configure with: - # lslpp -Lcq bos.rte | awk -F: '{ print $NF }' + # lslpp -Lcq bos.mp64 | awk -F: '{ print $NF }' build_date = sysconfig.get_config_var("AIX_BUILDDATE") try: build_date = int(build_date) diff --git a/Lib/_bootlocale.py b/Lib/_bootlocale.py deleted file mode 100644 index 3273a3b4..00000000 --- a/Lib/_bootlocale.py +++ /dev/null @@ -1,46 +0,0 @@ -"""A minimal subset of the locale module used at interpreter startup -(imported by the _io module), in order to reduce startup time. - -Don't import directly from third-party code; use the `locale` module instead! -""" - -import sys -import _locale - -if sys.platform.startswith("win"): - def getpreferredencoding(do_setlocale=True): - if sys.flags.utf8_mode: - return 'UTF-8' - return _locale._getdefaultlocale()[1] -else: - try: - _locale.CODESET - except AttributeError: - if hasattr(sys, 'getandroidapilevel'): - # On Android langinfo.h and CODESET are missing, and UTF-8 is - # always used in mbstowcs() and wcstombs(). - def getpreferredencoding(do_setlocale=True): - return 'UTF-8' - else: - def getpreferredencoding(do_setlocale=True): - if sys.flags.utf8_mode: - return 'UTF-8' - # This path for legacy systems needs the more complex - # getdefaultlocale() function, import the full locale module. - import locale - return locale.getpreferredencoding(do_setlocale) - else: - def getpreferredencoding(do_setlocale=True): - assert not do_setlocale - if sys.flags.utf8_mode: - return 'UTF-8' - result = _locale.nl_langinfo(_locale.CODESET) - if not result and sys.platform == 'darwin': - # nl_langinfo can return an empty string - # when the setting has an invalid value. - # Default to UTF-8 in that case because - # UTF-8 is the default charset on OSX and - # returning nothing will crash the - # interpreter. - result = 'UTF-8' - return result diff --git a/Lib/_collections_abc.py b/Lib/_collections_abc.py index 023ac7cf..87a9cd2d 100644 --- a/Lib/_collections_abc.py +++ b/Lib/_collections_abc.py @@ -416,7 +416,7 @@ class Collection(Sized, Iterable, Container): class _CallableGenericAlias(GenericAlias): """ Represent `Callable[argtypes, resulttype]`. - This sets ``__args__`` to a tuple containing the flattened``argtypes`` + This sets ``__args__`` to a tuple containing the flattened ``argtypes`` followed by ``resulttype``. Example: ``Callable[[int, str], float]`` sets ``__args__`` to @@ -426,32 +426,31 @@ class _CallableGenericAlias(GenericAlias): __slots__ = () def __new__(cls, origin, args): - try: - return cls.__create_ga(origin, args) - except TypeError as exc: - import warnings - warnings.warn(f'{str(exc)} ' - f'(This will raise a TypeError in Python 3.10.)', - DeprecationWarning) - return GenericAlias(origin, args) - - @classmethod - def __create_ga(cls, origin, args): - if not isinstance(args, tuple) or len(args) != 2: + if not (isinstance(args, tuple) and len(args) == 2): raise TypeError( "Callable must be used as Callable[[arg, ...], result].") t_args, t_result = args - if isinstance(t_args, (list, tuple)): - ga_args = tuple(t_args) + (t_result,) - # This relaxes what t_args can be on purpose to allow things like - # PEP 612 ParamSpec. Responsibility for whether a user is using - # Callable[...] properly is deferred to static type checkers. - else: - ga_args = args - return super().__new__(cls, origin, ga_args) + if isinstance(t_args, list): + args = (*t_args, t_result) + elif not _is_param_expr(t_args): + raise TypeError(f"Expected a list of types, an ellipsis, " + f"ParamSpec, or Concatenate. Got {t_args}") + return super().__new__(cls, origin, args) + + @property + def __parameters__(self): + params = [] + for arg in self.__args__: + # Looks like a genericalias + if hasattr(arg, "__parameters__") and isinstance(arg.__parameters__, tuple): + params.extend(arg.__parameters__) + else: + if _is_typevarlike(arg): + params.append(arg) + return tuple(dict.fromkeys(params)) def __repr__(self): - if len(self.__args__) == 2 and self.__args__[0] is Ellipsis: + if len(self.__args__) == 2 and _is_param_expr(self.__args__[0]): return super().__repr__() return (f'collections.abc.Callable' f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' @@ -459,20 +458,75 @@ class _CallableGenericAlias(GenericAlias): def __reduce__(self): args = self.__args__ - if not (len(args) == 2 and args[0] is Ellipsis): + if not (len(args) == 2 and _is_param_expr(args[0])): args = list(args[:-1]), args[-1] return _CallableGenericAlias, (Callable, args) def __getitem__(self, item): # Called during TypeVar substitution, returns the custom subclass - # rather than the default types.GenericAlias object. - ga = super().__getitem__(item) - args = ga.__args__ - t_result = args[-1] - t_args = args[:-1] - args = (t_args, t_result) - return _CallableGenericAlias(Callable, args) - + # rather than the default types.GenericAlias object. Most of the + # code is copied from typing's _GenericAlias and the builtin + # types.GenericAlias. + + # A special case in PEP 612 where if X = Callable[P, int], + # then X[int, str] == X[[int, str]]. + param_len = len(self.__parameters__) + if param_len == 0: + raise TypeError(f'{self} is not a generic class') + if not isinstance(item, tuple): + item = (item,) + if (param_len == 1 and _is_param_expr(self.__parameters__[0]) + and item and not _is_param_expr(item[0])): + item = (list(item),) + item_len = len(item) + if item_len != param_len: + raise TypeError(f'Too {"many" if item_len > param_len else "few"}' + f' arguments for {self};' + f' actual {item_len}, expected {param_len}') + subst = dict(zip(self.__parameters__, item)) + new_args = [] + for arg in self.__args__: + if _is_typevarlike(arg): + if _is_param_expr(arg): + arg = subst[arg] + if not _is_param_expr(arg): + raise TypeError(f"Expected a list of types, an ellipsis, " + f"ParamSpec, or Concatenate. Got {arg}") + else: + arg = subst[arg] + # Looks like a GenericAlias + elif hasattr(arg, '__parameters__') and isinstance(arg.__parameters__, tuple): + subparams = arg.__parameters__ + if subparams: + subargs = tuple(subst[x] for x in subparams) + arg = arg[subargs] + new_args.append(arg) + + # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612 + if not isinstance(new_args[0], list): + t_result = new_args[-1] + t_args = new_args[:-1] + new_args = (t_args, t_result) + return _CallableGenericAlias(Callable, tuple(new_args)) + + +def _is_typevarlike(arg): + obj = type(arg) + # looks like a TypeVar/ParamSpec + return (obj.__module__ == 'typing' + and obj.__name__ in {'ParamSpec', 'TypeVar'}) + +def _is_param_expr(obj): + """Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or + ``_ConcatenateGenericAlias`` from typing.py + """ + if obj is Ellipsis: + return True + if isinstance(obj, list): + return True + obj = type(obj) + names = ('ParamSpec', '_ConcatenateGenericAlias') + return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names) def _type_repr(obj): """Return the repr() of an object, special-casing types (internal helper). @@ -514,7 +568,6 @@ class Callable(metaclass=ABCMeta): class Set(Collection): - """A set is a finite, iterable container. This class provides concrete generic implementations of all @@ -740,19 +793,19 @@ MutableSet.register(set) ### MAPPINGS ### - class Mapping(Collection): - - __slots__ = () - """A Mapping is a generic container for associating key/value pairs. This class provides concrete generic implementations of all methods except for __getitem__, __iter__, and __len__. - """ + __slots__ = () + + # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set. + __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING + @abstractmethod def __getitem__(self, key): raise KeyError @@ -791,7 +844,6 @@ class Mapping(Collection): __reversed__ = None - Mapping.register(mappingproxy) @@ -816,7 +868,7 @@ class KeysView(MappingView, Set): __slots__ = () @classmethod - def _from_iterable(cls, it): + def _from_iterable(self, it): return set(it) def __contains__(self, key): @@ -834,7 +886,7 @@ class ItemsView(MappingView, Set): __slots__ = () @classmethod - def _from_iterable(cls, it): + def _from_iterable(self, it): return set(it) def __contains__(self, item): @@ -874,18 +926,16 @@ ValuesView.register(dict_values) class MutableMapping(Mapping): - - __slots__ = () - """A MutableMapping is a generic container for associating key/value pairs. This class provides concrete generic implementations of all methods except for __getitem__, __setitem__, __delitem__, __iter__, and __len__. - """ + __slots__ = () + @abstractmethod def __setitem__(self, key, value): raise KeyError @@ -962,9 +1012,7 @@ MutableMapping.register(dict) ### SEQUENCES ### - class Sequence(Reversible, Collection): - """All the operations on a read-only sequence. Concrete subclasses must override __new__ or __init__, @@ -973,6 +1021,9 @@ class Sequence(Reversible, Collection): __slots__ = () + # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set. + __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE + @abstractmethod def __getitem__(self, index): raise IndexError @@ -1024,7 +1075,6 @@ class Sequence(Reversible, Collection): 'S.count(value) -> integer -- return number of occurrences of value' return sum(1 for v in self if v is value or v == value) - Sequence.register(tuple) Sequence.register(str) Sequence.register(range) @@ -1032,7 +1082,6 @@ Sequence.register(memoryview) class ByteString(Sequence): - """This unifies bytes and bytearray. XXX Should add all their methods. @@ -1045,16 +1094,14 @@ ByteString.register(bytearray) class MutableSequence(Sequence): - - __slots__ = () - """All the operations on a read-write sequence. Concrete subclasses must provide __new__ or __init__, __getitem__, __setitem__, __delitem__, __len__, and insert(). - """ + __slots__ = () + @abstractmethod def __setitem__(self, index, value): raise IndexError diff --git a/Lib/_compression.py b/Lib/_compression.py index b00f31b4..e8b70aa0 100644 --- a/Lib/_compression.py +++ b/Lib/_compression.py @@ -1,7 +1,7 @@ """Internal classes used by the gzip, lzma and bz2 modules""" import io - +import sys BUFFER_SIZE = io.DEFAULT_BUFFER_SIZE # Compressed data read chunk size @@ -110,6 +110,16 @@ class DecompressReader(io.RawIOBase): self._pos += len(data) return data + def readall(self): + chunks = [] + # sys.maxsize means the max length of output buffer is unlimited, + # so that the whole input buffer can be decompressed within one + # .decompress() call. + while data := self.read(sys.maxsize): + chunks.append(data) + + return b"".join(chunks) + # Rewind the file to the beginning of the data stream. def _rewind(self): self._fp.seek(0) diff --git a/Lib/_markupbase.py b/Lib/_markupbase.py index 7091eb63..3ad7e279 100644 --- a/Lib/_markupbase.py +++ b/Lib/_markupbase.py @@ -29,10 +29,6 @@ class ParserBase: raise RuntimeError( "_markupbase.ParserBase must be subclassed") - def error(self, message): - raise NotImplementedError( - "subclasses of ParserBase must override error()") - def reset(self): self.lineno = 1 self.offset = 0 @@ -131,12 +127,11 @@ class ParserBase: # also in data attribute specifications of attlist declaration # also link type declaration subsets in linktype declarations # also link attribute specification lists in link declarations - self.error("unsupported '[' char in %s declaration" % decltype) + raise AssertionError("unsupported '[' char in %s declaration" % decltype) else: - self.error("unexpected '[' char in declaration") + raise AssertionError("unexpected '[' char in declaration") else: - self.error( - "unexpected %r char in declaration" % rawdata[j]) + raise AssertionError("unexpected %r char in declaration" % rawdata[j]) if j < 0: return j return -1 # incomplete @@ -156,8 +151,9 @@ class ParserBase: # look for MS Office ]> ending match= _msmarkedsectionclose.search(rawdata, i+3) else: - self.error('unknown status keyword %r in marked section' % rawdata[i+3:j]) - match = None + raise AssertionError( + 'unknown status keyword %r in marked section' % rawdata[i+3:j] + ) if not match: return -1 if report: @@ -169,7 +165,7 @@ class ParserBase: def parse_comment(self, i, report=1): rawdata = self.rawdata if rawdata[i:i+4] != ' diff --git a/Lib/codecs.py b/Lib/codecs.py index d2edd148..e6ad6e3a 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -83,7 +83,7 @@ BOM64_BE = BOM_UTF32_BE class CodecInfo(tuple): """Codec details when looking up the codec registry""" - # Private API to allow Python 3.4 to blacklist the known non-Unicode + # Private API to allow Python 3.4 to denylist the known non-Unicode # codecs in the standard library. A more general mechanism to # reliably distinguish test encodings from other codecs will hopefully # be defined for Python 3.5 diff --git a/Lib/codeop.py b/Lib/codeop.py index 4c10470a..6b56be48 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -64,24 +64,21 @@ _features = [getattr(__future__, fname) __all__ = ["compile_command", "Compile", "CommandCompiler"] -PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h +PyCF_DONT_IMPLY_DEDENT = 0x200 # Matches pythonrun.h. def _maybe_compile(compiler, source, filename, symbol): - # Check for source consisting of only blank lines and comments + # Check for source consisting of only blank lines and comments. for line in source.split("\n"): line = line.strip() if line and line[0] != '#': - break # Leave it alone + break # Leave it alone. else: if symbol != "eval": source = "pass" # Replace it with a 'pass' statement - err = err1 = err2 = None - code = code1 = code2 = None - try: - code = compiler(source, filename, symbol) - except SyntaxError: + return compiler(source, filename, symbol) + except SyntaxError: # Let other compile() errors propagate. pass # Catch syntax warnings after the first compile @@ -89,6 +86,7 @@ def _maybe_compile(compiler, source, filename, symbol): with warnings.catch_warnings(): warnings.simplefilter("error") + code1 = err1 = err2 = None try: code1 = compiler(source + "\n", filename, symbol) except SyntaxError as e: @@ -100,13 +98,22 @@ def _maybe_compile(compiler, source, filename, symbol): err2 = e try: - if code: - return code - if not code1 and repr(err1) == repr(err2): + if not code1 and _is_syntax_error(err1, err2): raise err1 + else: + return None finally: err1 = err2 = None +def _is_syntax_error(err1, err2): + rep1 = repr(err1) + rep2 = repr(err2) + if "was never closed" in rep1 and "was never closed" in rep2: + return False + if rep1 == rep2: + return True + return False + def _compile(source, filename, symbol): return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT) diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py index 5bdd3b35..bae0805d 100644 --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -27,7 +27,6 @@ __all__ = [ ] import _collections_abc -import heapq as _heapq import sys as _sys from itertools import chain as _chain @@ -52,22 +51,6 @@ except ImportError: pass -def __getattr__(name): - # For backwards compatibility, continue to make the collections ABCs - # through Python 3.6 available through the collections module. - # Note, no new collections ABCs were added in Python 3.7 - if name in _collections_abc.__all__: - obj = getattr(_collections_abc, name) - import warnings - warnings.warn("Using or importing the ABCs from 'collections' instead " - "of from 'collections.abc' is deprecated since Python 3.3, " - "and in 3.10 it will stop working", - DeprecationWarning, stacklevel=2) - globals()[name] = obj - return obj - raise AttributeError(f'module {__name__!r} has no attribute {name!r}') - - ################################################################################ ### OrderedDict ################################################################################ @@ -489,6 +472,7 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non '__repr__': __repr__, '_asdict': _asdict, '__getnewargs__': __getnewargs__, + '__match_args__': field_names, } for index, name in enumerate(field_names): doc = _sys.intern(f'Alias for field number {index}') @@ -597,6 +581,10 @@ class Counter(dict): # Needed so that self[missing_item] does not raise KeyError return 0 + def total(self): + 'Sum of the counts' + return sum(self.values()) + def most_common(self, n=None): '''List the n most common elements and their counts from the most common to the least. If n is None, then list all element counts. @@ -608,7 +596,10 @@ class Counter(dict): # Emulate Bag.sortedByCount from Smalltalk if n is None: return sorted(self.items(), key=_itemgetter(1), reverse=True) - return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) + + # Lazy import to speedup Python startup time + import heapq + return heapq.nlargest(n, self.items(), key=_itemgetter(1)) def elements(self): '''Iterator over elements repeating each as many times as its count. @@ -719,6 +710,42 @@ class Counter(dict): if elem in self: super().__delitem__(elem) + def __eq__(self, other): + 'True if all counts agree. Missing counts are treated as zero.' + if not isinstance(other, Counter): + return NotImplemented + return all(self[e] == other[e] for c in (self, other) for e in c) + + def __ne__(self, other): + 'True if any counts disagree. Missing counts are treated as zero.' + if not isinstance(other, Counter): + return NotImplemented + return not self == other + + def __le__(self, other): + 'True if all counts in self are a subset of those in other.' + if not isinstance(other, Counter): + return NotImplemented + return all(self[e] <= other[e] for c in (self, other) for e in c) + + def __lt__(self, other): + 'True if all counts in self are a proper subset of those in other.' + if not isinstance(other, Counter): + return NotImplemented + return self <= other and self != other + + def __ge__(self, other): + 'True if all counts in self are a superset of those in other.' + if not isinstance(other, Counter): + return NotImplemented + return all(self[e] >= other[e] for c in (self, other) for e in c) + + def __gt__(self, other): + 'True if all counts in self are a proper superset of those in other.' + if not isinstance(other, Counter): + return NotImplemented + return self >= other and self != other + def __repr__(self): if not self: return f'{self.__class__.__name__}()' @@ -739,12 +766,26 @@ class Counter(dict): # To strip negative and zero counts, add-in an empty counter: # c += Counter() # - # Rich comparison operators for multiset subset and superset tests - # are deliberately omitted due to semantic conflicts with the - # existing inherited dict equality method. Subset and superset - # semantics ignore zero counts and require that p≤q ∧ p≥q → p=q; - # however, that would not be the case for p=Counter(a=1, b=0) - # and q=Counter(a=1) where the dictionaries are not equal. + # When the multiplicities are all zero or one, multiset operations + # are guaranteed to be equivalent to the corresponding operations + # for regular sets. + # Given counter multisets such as: + # cp = Counter(a=1, b=0, c=1) + # cq = Counter(c=1, d=0, e=1) + # The corresponding regular sets would be: + # sp = {'a', 'c'} + # sq = {'c', 'e'} + # All of the following relations would hold: + # set(cp + cq) == sp | sq + # set(cp - cq) == sp - sq + # set(cp | cq) == sp | sq + # set(cp & cq) == sp & sq + # (cp == cq) == (sp == sq) + # (cp != cq) == (sp != sq) + # (cp <= cq) == (sp <= sq) + # (cp < cq) == (sp < sq) + # (cp >= cq) == (sp >= sq) + # (cp > cq) == (sp > sq) def __add__(self, other): '''Add counts from two counters. @@ -973,12 +1014,15 @@ class ChainMap(_collections_abc.MutableMapping): __copy__ = copy - def new_child(self, m=None): # like Django's Context.push() + def new_child(self, m=None, **kwargs): # like Django's Context.push() '''New ChainMap with a new map followed by all previous maps. If no map is provided, an empty dict is used. + Keyword arguments update the map or new empty dict. ''' if m is None: - m = {} + m = kwargs + elif kwargs: + m.update(kwargs) return self.__class__(m, *self.maps) @property diff --git a/Lib/colorsys.py b/Lib/colorsys.py index b93e3844..0f52512a 100644 --- a/Lib/colorsys.py +++ b/Lib/colorsys.py @@ -75,17 +75,18 @@ def yiq_to_rgb(y, i, q): def rgb_to_hls(r, g, b): maxc = max(r, g, b) minc = min(r, g, b) - # XXX Can optimize (maxc+minc) and (maxc-minc) - l = (minc+maxc)/2.0 + sumc = (maxc+minc) + rangec = (maxc-minc) + l = sumc/2.0 if minc == maxc: return 0.0, l, 0.0 if l <= 0.5: - s = (maxc-minc) / (maxc+minc) + s = rangec / sumc else: - s = (maxc-minc) / (2.0-maxc-minc) - rc = (maxc-r) / (maxc-minc) - gc = (maxc-g) / (maxc-minc) - bc = (maxc-b) / (maxc-minc) + s = rangec / (2.0-sumc) + rc = (maxc-r) / rangec + gc = (maxc-g) / rangec + bc = (maxc-b) / rangec if r == maxc: h = bc-gc elif g == maxc: diff --git a/Lib/compileall.py b/Lib/compileall.py index 25ad83c2..3e004776 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -84,12 +84,14 @@ def compile_dir(dir, maxlevels=None, ddir=None, force=False, if workers < 0: raise ValueError('workers must be greater or equal to 0') if workers != 1: + # Check if this is a system where ProcessPoolExecutor can function. + from concurrent.futures.process import _check_system_limits try: - # Only import when needed, as low resource platforms may - # fail to import it - from concurrent.futures import ProcessPoolExecutor - except ImportError: + _check_system_limits() + except NotImplementedError: workers = 1 + else: + from concurrent.futures import ProcessPoolExecutor if maxlevels is None: maxlevels = sys.getrecursionlimit() files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels) @@ -365,9 +367,9 @@ def main(): 'environment variable is set, and ' '"timestamp" otherwise.')) parser.add_argument('-o', action='append', type=int, dest='opt_levels', - help=('Optimization levels to run compilation with. ' - 'Default is -1 which uses the optimization level ' - 'of the Python interpreter itself (see -O).')) + help=('Optimization levels to run compilation with.' + 'Default is -1 which uses optimization level of' + 'Python interpreter itself (specified by -O).')) parser.add_argument('-e', metavar='DIR', dest='limit_sl_dest', help='Ignore symlinks pointing outsite of the DIR') parser.add_argument('--hardlink-dupes', action='store_true', @@ -404,7 +406,8 @@ def main(): # if flist is provided then load it if args.flist: try: - with (sys.stdin if args.flist=='-' else open(args.flist)) as f: + with (sys.stdin if args.flist=='-' else + open(args.flist, encoding="utf-8")) as f: for line in f: compile_dests.append(line.strip()) except OSError: diff --git a/Lib/concurrent/futures/_base.py b/Lib/concurrent/futures/_base.py index cf119ac6..6095026c 100644 --- a/Lib/concurrent/futures/_base.py +++ b/Lib/concurrent/futures/_base.py @@ -284,14 +284,13 @@ def wait(fs, timeout=None, return_when=ALL_COMPLETED): A named 2-tuple of sets. The first set, named 'done', contains the futures that completed (is finished or cancelled) before the wait completed. The second set, named 'not_done', contains uncompleted - futures. Duplicate futures given to *fs* are removed and will be - returned only once. + futures. """ - fs = set(fs) with _AcquireFutures(fs): - done = {f for f in fs - if f._state in [CANCELLED_AND_NOTIFIED, FINISHED]} - not_done = fs - done + done = set(f for f in fs + if f._state in [CANCELLED_AND_NOTIFIED, FINISHED]) + not_done = set(fs) - done + if (return_when == FIRST_COMPLETED) and done: return DoneAndNotDoneFutures(done, not_done) elif (return_when == FIRST_EXCEPTION) and done: @@ -310,7 +309,7 @@ def wait(fs, timeout=None, return_when=ALL_COMPLETED): f._waiters.remove(waiter) done.update(waiter.finished_futures) - return DoneAndNotDoneFutures(done, fs - done) + return DoneAndNotDoneFutures(done, set(fs) - done) class Future(object): """Represents the result of an asynchronous computation.""" @@ -381,7 +380,7 @@ class Future(object): return self._state == RUNNING def done(self): - """Return True if the future was cancelled or finished executing.""" + """Return True of the future was cancelled or finished executing.""" with self._condition: return self._state in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED] diff --git a/Lib/concurrent/futures/process.py b/Lib/concurrent/futures/process.py index f223b86d..76471985 100644 --- a/Lib/concurrent/futures/process.py +++ b/Lib/concurrent/futures/process.py @@ -126,9 +126,6 @@ class _ExceptionWithTraceback: tb = traceback.format_exception(type(exc), exc, tb) tb = ''.join(tb) self.exc = exc - # Traceback object needs to be garbage-collected as its frames - # contain references to all the objects in the exception scope - self.exc.__traceback__ = None self.tb = '\n"""\n%s"""' % tb def __reduce__(self): return _rebuild_exc, (self.exc, self.tb) @@ -376,7 +373,7 @@ class _ExecutorManagerThread(threading.Thread): assert not self.thread_wakeup._closed wakeup_reader = self.thread_wakeup._reader readers = [result_reader, wakeup_reader] - worker_sentinels = [p.sentinel for p in list(self.processes.values())] + worker_sentinels = [p.sentinel for p in self.processes.values()] ready = mp.connection.wait(readers + worker_sentinels) cause = None @@ -535,6 +532,14 @@ def _check_system_limits(): if _system_limited: raise NotImplementedError(_system_limited) _system_limits_checked = True + try: + import multiprocessing.synchronize + except ImportError: + _system_limited = ( + "This Python build lacks multiprocessing.synchronize, usually due " + "to named semaphores being unavailable on this platform." + ) + raise NotImplementedError(_system_limited) try: nsems_max = os.sysconf("SC_SEM_NSEMS_MAX") except (AttributeError, ValueError): @@ -607,10 +612,6 @@ class ProcessPoolExecutor(_base.Executor): mp_context = mp.get_context() self._mp_context = mp_context - # https://github.com/python/cpython/issues/90622 - self._safe_to_dynamically_spawn_children = ( - self._mp_context.get_start_method(allow_none=False) != "fork") - if initializer is not None and not callable(initializer): raise TypeError("initializer must be a callable") self._initializer = initializer @@ -661,8 +662,6 @@ class ProcessPoolExecutor(_base.Executor): def _start_executor_manager_thread(self): if self._executor_manager_thread is None: # Start the processes so that their sentinels are known. - if not self._safe_to_dynamically_spawn_children: # ie, using fork. - self._launch_processes() self._executor_manager_thread = _ExecutorManagerThread(self) self._executor_manager_thread.start() _threads_wakeups[self._executor_manager_thread] = \ @@ -675,31 +674,14 @@ class ProcessPoolExecutor(_base.Executor): process_count = len(self._processes) if process_count < self._max_workers: - # Assertion disabled as this codepath is also used to replace a - # worker that unexpectedly dies, even when using the 'fork' start - # method. That means there is still a potential deadlock bug. If a - # 'fork' mp_context worker dies, we'll be forking a new one when - # we know a thread is running (self._executor_manager_thread). - #assert self._safe_to_dynamically_spawn_children or not self._executor_manager_thread, 'https://github.com/python/cpython/issues/90622' - self._spawn_process() - - def _launch_processes(self): - # https://github.com/python/cpython/issues/90622 - assert not self._executor_manager_thread, ( - 'Processes cannot be fork()ed after the thread has started, ' - 'deadlock in the child processes could result.') - for _ in range(len(self._processes), self._max_workers): - self._spawn_process() - - def _spawn_process(self): - p = self._mp_context.Process( - target=_process_worker, - args=(self._call_queue, - self._result_queue, - self._initializer, - self._initargs)) - p.start() - self._processes[p.pid] = p + p = self._mp_context.Process( + target=_process_worker, + args=(self._call_queue, + self._result_queue, + self._initializer, + self._initargs)) + p.start() + self._processes[p.pid] = p def submit(self, fn, /, *args, **kwargs): with self._shutdown_lock: @@ -720,8 +702,7 @@ class ProcessPoolExecutor(_base.Executor): # Wake up queue management thread self._executor_manager_thread_wakeup.wakeup() - if self._safe_to_dynamically_spawn_children: - self._adjust_process_count() + self._adjust_process_count() self._start_executor_manager_thread() return f submit.__doc__ = _base.Executor.submit.__doc__ diff --git a/Lib/concurrent/futures/thread.py b/Lib/concurrent/futures/thread.py index 51c942f5..b7a2cac7 100644 --- a/Lib/concurrent/futures/thread.py +++ b/Lib/concurrent/futures/thread.py @@ -36,12 +36,6 @@ def _python_exit(): # See bpo-39812 for context. threading._register_atexit(_python_exit) -# At fork, reinitialize the `_global_shutdown_lock` lock in the child process -if hasattr(os, 'register_at_fork'): - os.register_at_fork(before=_global_shutdown_lock.acquire, - after_in_child=_global_shutdown_lock._at_fork_reinit, - after_in_parent=_global_shutdown_lock.release) - class _WorkItem(object): def __init__(self, future, fn, args, kwargs): diff --git a/Lib/configparser.py b/Lib/configparser.py index 8dd5c13b..042a5c74 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -563,7 +563,7 @@ class RawConfigParser(MutableMapping): # Regular expressions for parsing section headers and options _SECT_TMPL = r""" \[ # [ - (?P

[^]]+) # very permissive! + (?P
.+) # very permissive! \] # ] """ _OPT_TMPL = r""" @@ -690,6 +690,7 @@ class RawConfigParser(MutableMapping): """ if isinstance(filenames, (str, bytes, os.PathLike)): filenames = [filenames] + encoding = io.text_encoding(encoding) read_ok = [] for filename in filenames: try: diff --git a/Lib/contextlib.py b/Lib/contextlib.py index 4e8f5f75..1e0a39f8 100644 --- a/Lib/contextlib.py +++ b/Lib/contextlib.py @@ -9,7 +9,7 @@ from types import MethodType, GenericAlias __all__ = ["asynccontextmanager", "contextmanager", "closing", "nullcontext", "AbstractContextManager", "AbstractAsyncContextManager", "AsyncExitStack", "ContextDecorator", "ExitStack", - "redirect_stdout", "redirect_stderr", "suppress"] + "redirect_stdout", "redirect_stderr", "suppress", "aclosing"] class AbstractContextManager(abc.ABC): @@ -80,6 +80,22 @@ class ContextDecorator(object): return inner +class AsyncContextDecorator(object): + "A base class or mixin that enables async context managers to work as decorators." + + def _recreate_cm(self): + """Return a recreated instance of self. + """ + return self + + def __call__(self, func): + @wraps(func) + async def inner(*args, **kwds): + async with self._recreate_cm(): + return await func(*args, **kwds) + return inner + + class _GeneratorContextManagerBase: """Shared functionality for @contextmanager and @asynccontextmanager.""" @@ -168,9 +184,11 @@ class _GeneratorContextManager( return False raise RuntimeError("generator didn't stop after throw()") - -class _AsyncGeneratorContextManager(_GeneratorContextManagerBase, - AbstractAsyncContextManager): +class _AsyncGeneratorContextManager( + _GeneratorContextManagerBase, + AbstractAsyncContextManager, + AsyncContextDecorator, +): """Helper for @asynccontextmanager decorator.""" async def __aenter__(self): @@ -178,14 +196,14 @@ class _AsyncGeneratorContextManager(_GeneratorContextManagerBase, # they are only needed for recreation, which is not possible anymore del self.args, self.kwds, self.func try: - return await self.gen.__anext__() + return await anext(self.gen) except StopAsyncIteration: raise RuntimeError("generator didn't yield") from None async def __aexit__(self, typ, value, traceback): if typ is None: try: - await self.gen.__anext__() + await anext(self.gen) except StopAsyncIteration: return False else: @@ -322,6 +340,32 @@ class closing(AbstractContextManager): self.thing.close() +class aclosing(AbstractAsyncContextManager): + """Async context manager for safely finalizing an asynchronously cleaned-up + resource such as an async generator, calling its ``aclose()`` method. + + Code like this: + + async with aclosing(.fetch()) as agen: + + + is equivalent to this: + + agen = .fetch() + try: + + finally: + await agen.aclose() + + """ + def __init__(self, thing): + self.thing = thing + async def __aenter__(self): + return self.thing + async def __aexit__(self, *exc_info): + await self.thing.aclose() + + class _RedirectStream(AbstractContextManager): _stream = None @@ -496,10 +540,10 @@ class ExitStack(_BaseExitStack, AbstractContextManager): # Context may not be correct, so find the end of the chain while 1: exc_context = new_exc.__context__ - if exc_context is None or exc_context is old_exc: + if exc_context is old_exc: # Context is already set correctly (see issue 20317) return - if exc_context is frame_exc: + if exc_context is None or exc_context is frame_exc: break new_exc = exc_context # Change the end of the chain to point to the exception @@ -630,10 +674,10 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): # Context may not be correct, so find the end of the chain while 1: exc_context = new_exc.__context__ - if exc_context is None or exc_context is old_exc: + if exc_context is old_exc: # Context is already set correctly (see issue 20317) return - if exc_context is frame_exc: + if exc_context is None or exc_context is frame_exc: break new_exc = exc_context # Change the end of the chain to point to the exception @@ -674,7 +718,7 @@ class AsyncExitStack(_BaseExitStack, AbstractAsyncContextManager): return received_exc and suppressed_exc -class nullcontext(AbstractContextManager): +class nullcontext(AbstractContextManager, AbstractAsyncContextManager): """Context manager that does no additional processing. Used as a stand-in for a normal context manager, when a particular @@ -693,3 +737,9 @@ class nullcontext(AbstractContextManager): def __exit__(self, *excinfo): pass + + async def __aenter__(self): + return self.enter_result + + async def __aexit__(self, *excinfo): + pass diff --git a/Lib/copy.py b/Lib/copy.py index 1081d439..dd41c54d 100644 --- a/Lib/copy.py +++ b/Lib/copy.py @@ -39,8 +39,8 @@ Python's deep copy operation avoids these problems by: set of components copied This version does not copy types like module, class, function, method, -nor stack trace, stack frame, nor file, socket, window, nor any -similar types. +nor stack trace, stack frame, nor file, socket, window, nor array, nor +any similar types. Classes can use the same interfaces to control copying that they use to control pickling: they can define methods called __getinitargs__(), @@ -192,6 +192,7 @@ d[bytes] = _deepcopy_atomic d[str] = _deepcopy_atomic d[types.CodeType] = _deepcopy_atomic d[type] = _deepcopy_atomic +d[range] = _deepcopy_atomic d[types.BuiltinFunctionType] = _deepcopy_atomic d[types.FunctionType] = _deepcopy_atomic d[weakref.ref] = _deepcopy_atomic diff --git a/Lib/copyreg.py b/Lib/copyreg.py index 7ab8c128..356db6f0 100644 --- a/Lib/copyreg.py +++ b/Lib/copyreg.py @@ -36,6 +36,12 @@ else: pickle(complex, pickle_complex, complex) +def pickle_union(obj): + import functools, operator + return functools.reduce, (operator.or_, obj.__args__) + +pickle(type(int | str), pickle_union) + # Support for pickling new-style objects def _reconstructor(cls, base, state): diff --git a/Lib/csv.py b/Lib/csv.py index dc85077f..bb3ee269 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -409,14 +409,10 @@ class Sniffer: continue # skip rows that have irregular number of columns for col in list(columnTypes.keys()): - - for thisType in [int, float, complex]: - try: - thisType(row[col]) - break - except (ValueError, OverflowError): - pass - else: + thisType = complex + try: + thisType(row[col]) + except (ValueError, OverflowError): # fallback to length of string thisType = len(row[col]) diff --git a/Lib/ctypes/_aix.py b/Lib/ctypes/_aix.py index fc3e95cb..26959d90 100644 --- a/Lib/ctypes/_aix.py +++ b/Lib/ctypes/_aix.py @@ -163,7 +163,7 @@ def get_legacy(members): return member else: # 32-bit legacy names - both shr.o and shr4.o exist. - # shr.o is the preferred name so we look for shr.o first + # shr.o is the preffered name so we look for shr.o first # i.e., shr4.o is returned only when shr.o does not exist for name in ['shr.o', 'shr4.o']: member = get_one_match(re.escape(name), members) diff --git a/Lib/ctypes/test/__init__.py b/Lib/ctypes/test/__init__.py index 26a70b76..6e496fa5 100644 --- a/Lib/ctypes/test/__init__.py +++ b/Lib/ctypes/test/__init__.py @@ -1,9 +1,11 @@ import os import unittest from test import support +from test.support import import_helper + # skip tests if _ctypes was not built -ctypes = support.import_module('ctypes') +ctypes = import_helper.import_module('ctypes') ctypes_symbols = dir(ctypes) def need_symbol(name): diff --git a/Lib/ctypes/test/test_bitfields.py b/Lib/ctypes/test/test_bitfields.py index 66acd62e..992b8c4d 100644 --- a/Lib/ctypes/test/test_bitfields.py +++ b/Lib/ctypes/test/test_bitfields.py @@ -1,6 +1,5 @@ from ctypes import * from ctypes.test import need_symbol -from test import support import unittest import os @@ -40,8 +39,6 @@ class C_Test(unittest.TestCase): setattr(b, name, i) self.assertEqual(getattr(b, name), func(byref(b), name.encode('ascii'))) - # bpo-46913: _ctypes/cfield.c h_get() has an undefined behavior - @support.skip_if_sanitizer(ub=True) def test_shorts(self): b = BITS() name = "M" diff --git a/Lib/ctypes/test/test_find.py b/Lib/ctypes/test/test_find.py index 92ac1840..1ff9d019 100644 --- a/Lib/ctypes/test/test_find.py +++ b/Lib/ctypes/test/test_find.py @@ -3,6 +3,7 @@ import unittest.mock import os.path import sys import test.support +from test.support import os_helper from ctypes import * from ctypes.util import find_library @@ -66,8 +67,8 @@ class Test_OpenGL_libs(unittest.TestCase): self.gle.gleGetJoinStyle def test_shell_injection(self): - result = find_library('; echo Hello shell > ' + test.support.TESTFN) - self.assertFalse(os.path.lexists(test.support.TESTFN)) + result = find_library('; echo Hello shell > ' + os_helper.TESTFN) + self.assertFalse(os.path.lexists(os_helper.TESTFN)) self.assertIsNone(result) @@ -89,7 +90,7 @@ class FindLibraryLinux(unittest.TestCase): srcname = os.path.join(d, 'dummy.c') libname = 'py_ctypes_test_dummy' dstname = os.path.join(d, 'lib%s.so' % libname) - with open(srcname, 'w') as f: + with open(srcname, 'wb') as f: pass self.assertTrue(os.path.exists(srcname)) # compile the file to a shared library @@ -101,7 +102,7 @@ class FindLibraryLinux(unittest.TestCase): # LD_LIBRARY_PATH) self.assertIsNone(find_library(libname)) # now add the location to LD_LIBRARY_PATH - with test.support.EnvironmentVarGuard() as env: + with os_helper.EnvironmentVarGuard() as env: KEY = 'LD_LIBRARY_PATH' if KEY not in env: v = d diff --git a/Lib/ctypes/test/test_functions.py b/Lib/ctypes/test/test_functions.py index bdb044e5..d3c6536f 100644 --- a/Lib/ctypes/test/test_functions.py +++ b/Lib/ctypes/test/test_functions.py @@ -35,24 +35,34 @@ class FunctionTestCase(unittest.TestCase): # wasn't checked, and it even crashed Python. # Found by Greg Chapman. - with self.assertRaises(TypeError): + try: class X(object, Array): _length_ = 5 _type_ = "i" + except TypeError: + pass + from _ctypes import _Pointer - with self.assertRaises(TypeError): + try: class X(object, _Pointer): pass + except TypeError: + pass from _ctypes import _SimpleCData - with self.assertRaises(TypeError): + try: class X(object, _SimpleCData): _type_ = "i" + except TypeError: + pass - with self.assertRaises(TypeError): + try: class X(object, Structure): _fields_ = [] + except TypeError: + pass + @need_symbol('c_wchar') def test_wchar_parm(self): diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index 2f9eb9d3..ea892277 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -5,6 +5,8 @@ import subprocess import sys import unittest import test.support +from test.support import import_helper +from test.support import os_helper from ctypes.util import find_library libc_name = None @@ -117,14 +119,14 @@ class LoaderTest(unittest.TestCase): @unittest.skipUnless(os.name == "nt", 'test specific to Windows') def test_load_dll_with_flags(self): - _sqlite3 = test.support.import_module("_sqlite3") + _sqlite3 = import_helper.import_module("_sqlite3") src = _sqlite3.__file__ if src.lower().endswith("_d.pyd"): ext = "_d.dll" else: ext = ".dll" - with test.support.temp_dir() as tmp: + with os_helper.temp_dir() as tmp: # We copy two files and load _sqlite3.dll (formerly .pyd), # which has a dependency on sqlite3.dll. Then we test # loading it in subprocesses to avoid it starting in memory diff --git a/Lib/ctypes/test/test_numbers.py b/Lib/ctypes/test/test_numbers.py index c6d843b2..db500e81 100644 --- a/Lib/ctypes/test/test_numbers.py +++ b/Lib/ctypes/test/test_numbers.py @@ -134,8 +134,7 @@ class NumberTestCase(unittest.TestCase): for t in signed_types + unsigned_types: self.assertRaises(TypeError, t, 3.14) self.assertRaises(TypeError, t, f) - with self.assertWarns(DeprecationWarning): - self.assertEqual(t(d).value, 2) + self.assertRaises(TypeError, t, d) self.assertEqual(t(i).value, 2) def test_sizes(self): diff --git a/Lib/ctypes/test/test_python_api.py b/Lib/ctypes/test/test_python_api.py index 49571f97..9c137469 100644 --- a/Lib/ctypes/test/test_python_api.py +++ b/Lib/ctypes/test/test_python_api.py @@ -1,5 +1,5 @@ from ctypes import * -import unittest +import unittest, sys from test import support ################################################################ @@ -10,6 +10,10 @@ from _ctypes import PyObj_FromPtr ################################################################ from sys import getrefcount as grc +if sys.version_info > (2, 4): + c_py_ssize_t = c_size_t +else: + c_py_ssize_t = c_int class PythonAPITestCase(unittest.TestCase): @@ -17,7 +21,7 @@ class PythonAPITestCase(unittest.TestCase): PyBytes_FromStringAndSize = pythonapi.PyBytes_FromStringAndSize PyBytes_FromStringAndSize.restype = py_object - PyBytes_FromStringAndSize.argtypes = c_char_p, c_size_t + PyBytes_FromStringAndSize.argtypes = c_char_p, c_py_ssize_t self.assertEqual(PyBytes_FromStringAndSize(b"abcdefghi", 3), b"abc") diff --git a/Lib/ctypes/test/test_struct_fields.py b/Lib/ctypes/test/test_struct_fields.py index 8045cc82..ee8415f3 100644 --- a/Lib/ctypes/test/test_struct_fields.py +++ b/Lib/ctypes/test/test_struct_fields.py @@ -46,6 +46,14 @@ class StructFieldsTestCase(unittest.TestCase): Y._fields_ = [] self.assertRaises(AttributeError, setattr, X, "_fields_", []) + def test_5(self): + class X(Structure): + _fields_ = (("char", c_char * 5),) + + x = X(b'#' * 5) + x.char = b'a\0b\0' + self.assertEqual(bytes(x), b'a\x00###') + # __set__ and __get__ should raise a TypeError in case their self # argument is not a ctype instance. def test___set__(self): diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py index 97ad2b8e..245cd94c 100644 --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -443,7 +443,7 @@ class StructureTestCase(unittest.TestCase): s = Test(1, 2, 3) # Test the StructUnionType_paramfunc() code path which copies the - # structure: if the structure is larger than sizeof(void*). + # structure: if the stucture is larger than sizeof(void*). self.assertGreater(sizeof(s), sizeof(c_void_p)) dll = CDLL(_ctypes_test.__file__) @@ -451,7 +451,7 @@ class StructureTestCase(unittest.TestCase): func.argtypes = (Test,) func.restype = None func(s) - # bpo-37140: Passing the structure by reference must not call + # bpo-37140: Passing the structure by refrence must not call # its finalizer! self.assertEqual(finalizer_calls, []) self.assertEqual(s.first, 1) diff --git a/Lib/ctypes/test/test_values.py b/Lib/ctypes/test/test_values.py index 87eb9198..7514fe84 100644 --- a/Lib/ctypes/test/test_values.py +++ b/Lib/ctypes/test/test_values.py @@ -80,9 +80,9 @@ class PythonValuesTestCase(unittest.TestCase): continue items.append((entry.name.decode("ascii"), entry.size)) - expected = [("__hello__", 141), - ("__phello__", -141), - ("__phello__.spam", 141), + expected = [("__hello__", 137), + ("__phello__", -137), + ("__phello__.spam", 137), ] self.assertEqual(items, expected, "PyImport_FrozenModules example " "in Doc/library/ctypes.rst may be out of date") diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 5ff67ad2..79739976 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -6,8 +6,9 @@ import inspect import keyword import builtins import functools +import abc import _thread -from types import GenericAlias +from types import FunctionType, GenericAlias __all__ = ['dataclass', @@ -15,6 +16,7 @@ __all__ = ['dataclass', 'Field', 'FrozenInstanceError', 'InitVar', + 'KW_ONLY', 'MISSING', # Helper functions. @@ -151,6 +153,20 @@ __all__ = ['dataclass', # # See _hash_action (below) for a coded version of this table. +# __match_args__ +# +# +--- match_args= parameter +# | +# v | | | +# | no | yes | <--- class has __match_args__ in __dict__? +# +=======+=======+=======+ +# | False | | | +# +-------+-------+-------+ +# | True | add | | <- the default +# +=======+=======+=======+ +# __match_args__ is always added unless the class already defines it. It is a +# tuple of __init__ parameter names; non-init fields must be matched by keyword. + # Raised when an attempt is made to modify a frozen class. class FrozenInstanceError(AttributeError): pass @@ -169,6 +185,12 @@ class _MISSING_TYPE: pass MISSING = _MISSING_TYPE() +# A sentinel object to indicate that following fields are keyword-only by +# default. Use a class to give it a better repr. +class _KW_ONLY_TYPE: + pass +KW_ONLY = _KW_ONLY_TYPE() + # Since most per-field metadata will be unused, create an empty # read-only proxy that can be shared among all fields. _EMPTY_METADATA = types.MappingProxyType({}) @@ -207,7 +229,7 @@ class InitVar: self.type = type def __repr__(self): - if isinstance(self.type, type) and not isinstance(self.type, GenericAlias): + if isinstance(self.type, type): type_name = self.type.__name__ else: # typing objects, e.g. List[int] @@ -217,7 +239,6 @@ class InitVar: def __class_getitem__(cls, type): return InitVar(type) - # Instances of Field are only ever created from within this module, # and only from the field() function, although Field instances are # exposed externally as (conceptually) read-only objects. @@ -238,11 +259,12 @@ class Field: 'init', 'compare', 'metadata', + 'kw_only', '_field_type', # Private: not to be used by user code. ) def __init__(self, default, default_factory, init, repr, hash, compare, - metadata): + metadata, kw_only): self.name = None self.type = None self.default = default @@ -254,6 +276,7 @@ class Field: self.metadata = (_EMPTY_METADATA if metadata is None else types.MappingProxyType(metadata)) + self.kw_only = kw_only self._field_type = None def __repr__(self): @@ -267,6 +290,7 @@ class Field: f'hash={self.hash!r},' f'compare={self.compare!r},' f'metadata={self.metadata!r},' + f'kw_only={self.kw_only!r},' f'_field_type={self._field_type}' ')') @@ -320,17 +344,19 @@ class _DataclassParams: # so that a type checker can be told (via overloads) that this is a # function whose type depends on its parameters. def field(*, default=MISSING, default_factory=MISSING, init=True, repr=True, - hash=None, compare=True, metadata=None): + hash=None, compare=True, metadata=None, kw_only=MISSING): """Return an object to identify dataclass fields. default is the default value of the field. default_factory is a 0-argument function called to initialize a field's value. If init - is True, the field will be a parameter to the class's __init__() - function. If repr is True, the field will be included in the - object's repr(). If hash is True, the field will be included in - the object's hash(). If compare is True, the field will be used - in comparison functions. metadata, if specified, must be a - mapping which is stored but not otherwise examined by dataclass. + is true, the field will be a parameter to the class's __init__() + function. If repr is true, the field will be included in the + object's repr(). If hash is true, the field will be included in the + object's hash(). If compare is true, the field will be used in + comparison functions. metadata, if specified, must be a mapping + which is stored but not otherwise examined by dataclass. If kw_only + is true, the field will become a keyword-only parameter to + __init__(). It is an error to specify both default and default_factory. """ @@ -338,7 +364,16 @@ def field(*, default=MISSING, default_factory=MISSING, init=True, repr=True, if default is not MISSING and default_factory is not MISSING: raise ValueError('cannot specify both default and default_factory') return Field(default, default_factory, init, repr, hash, compare, - metadata) + metadata, kw_only) + + +def _fields_in_init_order(fields): + # Returns the fields as __init__ will output them. It returns 2 tuples: + # the first for normal args, and the second for keyword args. + + return (tuple(f for f in fields if f.init and not f.kw_only), + tuple(f for f in fields if f.init and f.kw_only) + ) def _tuple_str(obj_name, fields): @@ -395,7 +430,6 @@ def _create_fn(name, args, body, *, globals=None, locals=None, local_vars = ', '.join(locals.keys()) txt = f"def __create_fn__({local_vars}):\n{txt}\n return {name}" - ns = {} exec(txt, globals, ns) return ns['__create_fn__'](**locals) @@ -486,7 +520,8 @@ def _init_param(f): return f'{f.name}:_type_{f.name}{default}' -def _init_fn(fields, frozen, has_post_init, self_name, globals): +def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init, + self_name, globals): # fields contains both real fields and InitVar pseudo-fields. # Make sure we don't have fields without defaults following fields @@ -494,9 +529,10 @@ def _init_fn(fields, frozen, has_post_init, self_name, globals): # function source code, but catching it here gives a better error # message, and future-proofs us in case we build up the function # using ast. + seen_default = False - for f in fields: - # Only consider fields in the __init__ call. + for f in std_fields: + # Only consider the non-kw-only fields in the __init__ call. if f.init: if not (f.default is MISSING and f.default_factory is MISSING): seen_default = True @@ -528,8 +564,15 @@ def _init_fn(fields, frozen, has_post_init, self_name, globals): if not body_lines: body_lines = ['pass'] + _init_params = [_init_param(f) for f in std_fields] + if kw_only_fields: + # Add the keyword-only args. Because the * can only be added if + # there's at least one keyword-only arg, there needs to be a test here + # (instead of just concatenting the lists together). + _init_params += ['*'] + _init_params += [_init_param(f) for f in kw_only_fields] return _create_fn('__init__', - [self_name] + [_init_param(f) for f in fields if f.init], + [self_name] + _init_params, body_lines, locals=locals, globals=globals, @@ -608,6 +651,9 @@ def _is_initvar(a_type, dataclasses): return (a_type is dataclasses.InitVar or type(a_type) is dataclasses.InitVar) +def _is_kw_only(a_type, dataclasses): + return a_type is dataclasses.KW_ONLY + def _is_type(annotation, cls, a_module, a_type, is_type_predicate): # Given a type annotation string, does it refer to a_type in @@ -668,10 +714,11 @@ def _is_type(annotation, cls, a_module, a_type, is_type_predicate): return False -def _get_field(cls, a_name, a_type): - # Return a Field object for this field name and type. ClassVars - # and InitVars are also returned, but marked as such (see - # f._field_type). +def _get_field(cls, a_name, a_type, default_kw_only): + # Return a Field object for this field name and type. ClassVars and + # InitVars are also returned, but marked as such (see f._field_type). + # default_kw_only is the value of kw_only to use if there isn't a field() + # that defines it. # If the default value isn't derived from Field, then it's only a # normal default value. Convert it to a Field(). @@ -742,6 +789,19 @@ def _get_field(cls, a_name, a_type): # init=)? It makes no sense for # ClassVar and InitVar to specify init=. + # kw_only validation and assignment. + if f._field_type in (_FIELD, _FIELD_INITVAR): + # For real and InitVar fields, if kw_only wasn't specified use the + # default value. + if f.kw_only is MISSING: + f.kw_only = default_kw_only + else: + # Make sure kw_only isn't set for ClassVars + assert f._field_type is _FIELD_CLASSVAR + if f.kw_only is not MISSING: + raise TypeError(f'field {f.name} is a ClassVar but specifies ' + 'kw_only') + # For real fields, disallow mutable defaults for known types. if f._field_type is _FIELD and isinstance(f.default, (list, dict, set)): raise ValueError(f'mutable default {type(f.default)} for field ' @@ -749,12 +809,19 @@ def _get_field(cls, a_name, a_type): return f +def _set_qualname(cls, value): + # Ensure that the functions returned from _create_fn uses the proper + # __qualname__ (the class they belong to). + if isinstance(value, FunctionType): + value.__qualname__ = f"{cls.__qualname__}.{value.__name__}" + return value def _set_new_attribute(cls, name, value): # Never overwrites an existing attribute. Returns True if the # attribute already exists. if name in cls.__dict__: return True + _set_qualname(cls, value) setattr(cls, name, value) return False @@ -769,7 +836,7 @@ def _hash_set_none(cls, fields, globals): def _hash_add(cls, fields, globals): flds = [f for f in fields if (f.compare if f.hash is None else f.hash)] - return _hash_fn(flds, globals) + return _set_qualname(cls, _hash_fn(flds, globals)) def _hash_exception(cls, fields, globals): # Raise an exception. @@ -806,7 +873,8 @@ _hash_action = {(False, False, False, False): None, # version of this table. -def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): +def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen, + match_args, kw_only, slots): # Now that dicts retain insertion order, there's no reason to use # an ordered dict. I am leveraging that ordering here, because # derived class fields overwrite base class fields, but the order @@ -860,8 +928,27 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): # Now find fields in our class. While doing so, validate some # things, and set the default values (as class attributes) where # we can. - cls_fields = [_get_field(cls, name, type) - for name, type in cls_annotations.items()] + cls_fields = [] + # Get a reference to this module for the _is_kw_only() test. + KW_ONLY_seen = False + dataclasses = sys.modules[__name__] + for name, type in cls_annotations.items(): + # See if this is a marker to change the value of kw_only. + if (_is_kw_only(type, dataclasses) + or (isinstance(type, str) + and _is_type(type, cls, dataclasses, dataclasses.KW_ONLY, + _is_kw_only))): + # Switch the default to kw_only=True, and ignore this + # annotation: it's not a real field. + if KW_ONLY_seen: + raise TypeError(f'{name!r} is KW_ONLY, but KW_ONLY ' + 'has already been specified') + KW_ONLY_seen = True + kw_only = True + else: + # Otherwise it's a field of some type. + cls_fields.append(_get_field(cls, name, type, kw_only)) + for f in cls_fields: fields[f.name] = f @@ -916,15 +1003,22 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): if order and not eq: raise ValueError('eq must be true if order is true') + # Include InitVars and regular fields (so, not ClassVars). This is + # initialized here, outside of the "if init:" test, because std_init_fields + # is used with match_args, below. + all_init_fields = [f for f in fields.values() + if f._field_type in (_FIELD, _FIELD_INITVAR)] + (std_init_fields, + kw_only_init_fields) = _fields_in_init_order(all_init_fields) + if init: # Does this class have a post-init function? has_post_init = hasattr(cls, _POST_INIT_NAME) - # Include InitVars and regular fields (so, not ClassVars). - flds = [f for f in fields.values() - if f._field_type in (_FIELD, _FIELD_INITVAR)] _set_new_attribute(cls, '__init__', - _init_fn(flds, + _init_fn(all_init_fields, + std_init_fields, + kw_only_init_fields, frozen, has_post_init, # The name to use for the "self" @@ -992,11 +1086,70 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): cls.__doc__ = (cls.__name__ + str(inspect.signature(cls)).replace(' -> None', '')) + if match_args: + # I could probably compute this once + _set_new_attribute(cls, '__match_args__', + tuple(f.name for f in std_init_fields)) + + if slots: + cls = _add_slots(cls, frozen) + + abc.update_abstractmethods(cls) + + return cls + + +# _dataclass_getstate and _dataclass_setstate are needed for pickling frozen +# classes with slots. These could be slighly more performant if we generated +# the code instead of iterating over fields. But that can be a project for +# another day, if performance becomes an issue. +def _dataclass_getstate(self): + return [getattr(self, f.name) for f in fields(self)] + + +def _dataclass_setstate(self, state): + for field, value in zip(fields(self), state): + # use setattr because dataclass may be frozen + object.__setattr__(self, field.name, value) + + +def _add_slots(cls, is_frozen): + # Need to create a new class, since we can't set __slots__ + # after a class has been created. + + # Make sure __slots__ isn't already set. + if '__slots__' in cls.__dict__: + raise TypeError(f'{cls.__name__} already specifies __slots__') + + # Create a new dict for our new class. + cls_dict = dict(cls.__dict__) + field_names = tuple(f.name for f in fields(cls)) + cls_dict['__slots__'] = field_names + for field_name in field_names: + # Remove our attributes, if present. They'll still be + # available in _MARKER. + cls_dict.pop(field_name, None) + + # Remove __dict__ itself. + cls_dict.pop('__dict__', None) + + # And finally create the class. + qualname = getattr(cls, '__qualname__', None) + cls = type(cls)(cls.__name__, cls.__bases__, cls_dict) + if qualname is not None: + cls.__qualname__ = qualname + + if is_frozen: + # Need this for pickling frozen classes with slots. + cls.__getstate__ = _dataclass_getstate + cls.__setstate__ = _dataclass_setstate + return cls def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, - unsafe_hash=False, frozen=False): + unsafe_hash=False, frozen=False, match_args=True, + kw_only=False, slots=False): """Returns the same class as was passed in, with dunder methods added based on the fields defined in the class. @@ -1006,11 +1159,15 @@ def dataclass(cls=None, /, *, init=True, repr=True, eq=True, order=False, repr is true, a __repr__() method is added. If order is true, rich comparison dunder methods are added. If unsafe_hash is true, a __hash__() method function is added. If frozen is true, fields may - not be assigned to after instance creation. + not be assigned to after instance creation. If match_args is true, + the __match_args__ tuple is added. If kw_only is true, then by + default all fields are keyword-only. If slots is true, an + __slots__ attribute is added. """ def wrap(cls): - return _process_class(cls, init, repr, eq, order, unsafe_hash, frozen) + return _process_class(cls, init, repr, eq, order, unsafe_hash, + frozen, match_args, kw_only, slots) # See if we're being called as @dataclass or @dataclass(). if cls is None: @@ -1047,7 +1204,7 @@ def _is_dataclass_instance(obj): def is_dataclass(obj): """Returns True if obj is a dataclass or an instance of a dataclass.""" - cls = obj if isinstance(obj, type) and not isinstance(obj, GenericAlias) else type(obj) + cls = obj if isinstance(obj, type) else type(obj) return hasattr(cls, _FIELDS) @@ -1169,7 +1326,7 @@ def _astuple_inner(obj, tuple_factory): def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, repr=True, eq=True, order=False, unsafe_hash=False, - frozen=False): + frozen=False, match_args=True, slots=False): """Return a new dynamically created dataclass. The dataclass name will be 'cls_name'. 'fields' is an iterable @@ -1195,14 +1352,12 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, if namespace is None: namespace = {} - else: - # Copy namespace since we're going to mutate it. - namespace = namespace.copy() # While we're looking through the field names, validate that they # are identifiers, are not keywords, and not duplicates. seen = set() - anns = {} + annotations = {} + defaults = {} for item in fields: if isinstance(item, str): name = item @@ -1211,7 +1366,7 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, name, tp, = item elif len(item) == 3: name, tp, spec = item - namespace[name] = spec + defaults[name] = spec else: raise TypeError(f'Invalid field: {item!r}') @@ -1223,14 +1378,22 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True, raise TypeError(f'Field name duplicated: {name!r}') seen.add(name) - anns[name] = tp + annotations[name] = tp + + # Update 'ns' with the user-supplied namespace plus our calculated values. + def exec_body_callback(ns): + ns.update(namespace) + ns.update(defaults) + ns['__annotations__'] = annotations - namespace['__annotations__'] = anns # We use `types.new_class()` instead of simply `type()` to allow dynamic creation # of generic dataclassses. - cls = types.new_class(cls_name, bases, {}, lambda ns: ns.update(namespace)) + cls = types.new_class(cls_name, bases, {}, exec_body_callback) + + # Apply the normal decorator. return dataclass(cls, init=init, repr=repr, eq=eq, order=order, - unsafe_hash=unsafe_hash, frozen=frozen) + unsafe_hash=unsafe_hash, frozen=frozen, + match_args=match_args, slots=slots) def replace(obj, /, **changes): diff --git a/Lib/datetime.py b/Lib/datetime.py index 51c70499..6bf37ccf 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -11,6 +11,7 @@ __all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo", import time as _time import math as _math import sys +from operator import index as _index def _cmp(x, y): return 0 if x == y else 1 if x > y else -1 @@ -380,42 +381,10 @@ def _check_utc_offset(name, offset): "-timedelta(hours=24) and timedelta(hours=24)" % (name, offset)) -def _check_int_field(value): - if isinstance(value, int): - return value - if isinstance(value, float): - raise TypeError('integer argument expected, got float') - try: - value = value.__index__() - except AttributeError: - pass - else: - if not isinstance(value, int): - raise TypeError('__index__ returned non-int (type %s)' % - type(value).__name__) - return value - orig = value - try: - value = value.__int__() - except AttributeError: - pass - else: - if not isinstance(value, int): - raise TypeError('__int__ returned non-int (type %s)' % - type(value).__name__) - import warnings - warnings.warn("an integer is required (got type %s)" % - type(orig).__name__, - DeprecationWarning, - stacklevel=2) - return value - raise TypeError('an integer is required (got type %s)' % - type(value).__name__) - def _check_date_fields(year, month, day): - year = _check_int_field(year) - month = _check_int_field(month) - day = _check_int_field(day) + year = _index(year) + month = _index(month) + day = _index(day) if not MINYEAR <= year <= MAXYEAR: raise ValueError('year must be in %d..%d' % (MINYEAR, MAXYEAR), year) if not 1 <= month <= 12: @@ -426,10 +395,10 @@ def _check_date_fields(year, month, day): return year, month, day def _check_time_fields(hour, minute, second, microsecond, fold): - hour = _check_int_field(hour) - minute = _check_int_field(minute) - second = _check_int_field(second) - microsecond = _check_int_field(microsecond) + hour = _index(hour) + minute = _index(minute) + second = _index(second) + microsecond = _index(microsecond) if not 0 <= hour <= 23: raise ValueError('hour must be in 0..23', hour) if not 0 <= minute <= 59: @@ -1683,7 +1652,7 @@ class datetime(date): y, m, d, hh, mm, ss, weekday, jday, dst = converter(t) ss = min(ss, 59) # clamp out leap seconds if the platform has them result = cls(y, m, d, hh, mm, ss, us, tz) - if tz is None and not utc: + if tz is None: # As of version 2015f max fold in IANA database is # 23 hours at 1969-09-30 13:00:00 in Kwajalein. # Let's probe 24 hours in the past to detect a transition: @@ -1704,7 +1673,7 @@ class datetime(date): probe2 = cls(y, m, d, hh, mm, ss, us, tz) if probe2 == result: result._fold = 1 - elif tz is not None: + else: result = tz.fromutc(result) return result @@ -2541,10 +2510,10 @@ else: # Clean up unused names del (_DAYNAMES, _DAYS_BEFORE_MONTH, _DAYS_IN_MONTH, _DI100Y, _DI400Y, _DI4Y, _EPOCH, _MAXORDINAL, _MONTHNAMES, _build_struct_time, - _check_date_fields, _check_int_field, _check_time_fields, + _check_date_fields, _check_time_fields, _check_tzinfo_arg, _check_tzname, _check_utc_offset, _cmp, _cmperror, _date_class, _days_before_month, _days_before_year, _days_in_month, - _format_time, _format_offset, _is_leap, _isoweek1monday, _math, + _format_time, _format_offset, _index, _is_leap, _isoweek1monday, _math, _ord2ymd, _time, _time_class, _tzinfo_class, _wrap_strftime, _ymd2ord, _divide_and_round, _parse_isoformat_date, _parse_isoformat_time, _parse_hh_mm_ss_ff, _IsoCalendarDate) diff --git a/Lib/difflib.py b/Lib/difflib.py index afd8a0c7..480bad22 100644 --- a/Lib/difflib.py +++ b/Lib/difflib.py @@ -62,7 +62,7 @@ class SequenceMatcher: notion, pairing up elements that appear uniquely in each sequence. That, and the method here, appear to yield more intuitive difference reports than does diff. This method appears to be the least vulnerable - to syncing up on blocks of "junk lines", though (like blank lines in + to synching up on blocks of "junk lines", though (like blank lines in ordinary text files, or maybe "

" lines in HTML files). That may be because this is the only method of the 3 that has a *concept* of "junk" . diff --git a/Lib/dis.py b/Lib/dis.py index e289e176..3fee1ce2 100644 --- a/Lib/dis.py +++ b/Lib/dis.py @@ -338,8 +338,11 @@ def _get_instructions_bytes(code, varnames=None, names=None, constants=None, argval, argrepr = _get_const_info(arg, constants) elif op in hasname: argval, argrepr = _get_name_info(arg, names) + elif op in hasjabs: + argval = arg*2 + argrepr = "to " + repr(argval) elif op in hasjrel: - argval = offset + 2 + arg + argval = offset + 2 + arg*2 argrepr = "to " + repr(argval) elif op in haslocal: argval, argrepr = _get_name_info(arg, varnames) @@ -384,7 +387,7 @@ def _disassemble_bytes(code, lasti=-1, varnames=None, names=None, constants=None, cells=None, linestarts=None, *, file=None, line_offset=0): # Omit the line number column entirely if we have no line number info - show_lineno = linestarts is not None + show_lineno = bool(linestarts) if show_lineno: maxlineno = max(linestarts.values()) + line_offset if maxlineno >= 1000: @@ -437,9 +440,9 @@ def findlabels(code): for offset, op, arg in _unpack_opargs(code): if arg is not None: if op in hasjrel: - label = offset + 2 + arg + label = offset + 2 + arg*2 elif op in hasjabs: - label = arg + label = arg*2 else: continue if label not in labels: @@ -449,32 +452,15 @@ def findlabels(code): def findlinestarts(code): """Find the offsets in a byte code which are start of lines in the source. - Generate pairs (offset, lineno) as described in Python/compile.c. - + Generate pairs (offset, lineno) """ - byte_increments = code.co_lnotab[0::2] - line_increments = code.co_lnotab[1::2] - bytecode_len = len(code.co_code) - - lastlineno = None - lineno = code.co_firstlineno - addr = 0 - for byte_incr, line_incr in zip(byte_increments, line_increments): - if byte_incr: - if lineno != lastlineno: - yield (addr, lineno) - lastlineno = lineno - addr += byte_incr - if addr >= bytecode_len: - # The rest of the lnotab byte offsets are past the end of - # the bytecode, so the lines were optimized away. - return - if line_incr >= 0x80: - # line_increments is an array of 8-bit signed integers - line_incr -= 0x100 - lineno += line_incr - if lineno != lastlineno: - yield (addr, lineno) + lastline = None + for start, end, line in code.co_lines(): + if line is not None and line != lastline: + lastline = line + yield start, line + return + class Bytecode: """The bytecode operations of a piece of code diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py index d823d040..fdad6f65 100644 --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -9,5 +9,12 @@ used from a setup script as """ import sys +import warnings __version__ = sys.version[:sys.version.index(' ')] + +_DEPRECATION_MESSAGE = ("The distutils package is deprecated and slated for " + "removal in Python 3.12. Use setuptools or check " + "PEP 632 for potential alternatives") +warnings.warn(_DEPRECATION_MESSAGE, + DeprecationWarning, 2) diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py index 4c47f2ed..b5ef143e 100644 --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -392,7 +392,7 @@ class CCompiler: return output_dir, macros, include_dirs def _prep_compile(self, sources, output_dir, depends=None): - """Decide which source files must be recompiled. + """Decide which souce files must be recompiled. Determine the list of object files corresponding to 'sources', and figure out which ones really need to be recompiled. diff --git a/Lib/distutils/command/__init__.py b/Lib/distutils/command/__init__.py index 481eea9f..fd0bfae7 100644 --- a/Lib/distutils/command/__init__.py +++ b/Lib/distutils/command/__init__.py @@ -19,7 +19,6 @@ __all__ = ['build', 'bdist', 'bdist_dumb', 'bdist_rpm', - 'bdist_wininst', 'check', 'upload', # These two are reserved for future use: diff --git a/Lib/distutils/command/bdist.py b/Lib/distutils/command/bdist.py index 014871d2..d580a809 100644 --- a/Lib/distutils/command/bdist.py +++ b/Lib/distutils/command/bdist.py @@ -62,7 +62,7 @@ class bdist(Command): # Establish the preferred order (for the --help-formats option). format_commands = ['rpm', 'gztar', 'bztar', 'xztar', 'ztar', 'tar', - 'wininst', 'zip', 'msi'] + 'zip', 'msi'] # And the real information. format_command = {'rpm': ('bdist_rpm', "RPM distribution"), @@ -71,8 +71,6 @@ class bdist(Command): 'xztar': ('bdist_dumb', "xz'ed tar file"), 'ztar': ('bdist_dumb', "compressed tar file"), 'tar': ('bdist_dumb', "tar file"), - 'wininst': ('bdist_wininst', - "Windows executable installer"), 'zip': ('bdist_dumb', "ZIP file"), 'msi': ('bdist_msi', "Microsoft Installer") } diff --git a/Lib/distutils/command/bdist_msi.py b/Lib/distutils/command/bdist_msi.py index 0863a188..2ed017b4 100644 --- a/Lib/distutils/command/bdist_msi.py +++ b/Lib/distutils/command/bdist_msi.py @@ -1,7 +1,5 @@ # Copyright (C) 2005, 2006 Martin von Löwis # Licensed to PSF under a Contributor Agreement. -# The bdist_wininst command proper -# based on bdist_wininst """ Implements the bdist_msi command. """ diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py deleted file mode 100644 index 0e9ddaa2..00000000 --- a/Lib/distutils/command/bdist_wininst.py +++ /dev/null @@ -1,377 +0,0 @@ -"""distutils.command.bdist_wininst - -Implements the Distutils 'bdist_wininst' command: create a windows installer -exe-program.""" - -import os -import sys -import warnings -from distutils.core import Command -from distutils.util import get_platform -from distutils.dir_util import remove_tree -from distutils.errors import * -from distutils.sysconfig import get_python_version -from distutils import log - -class bdist_wininst(Command): - - description = "create an executable installer for MS Windows" - - user_options = [('bdist-dir=', None, - "temporary directory for creating the distribution"), - ('plat-name=', 'p', - "platform name to embed in generated filenames " - "(default: %s)" % get_platform()), - ('keep-temp', 'k', - "keep the pseudo-installation tree around after " + - "creating the distribution archive"), - ('target-version=', None, - "require a specific python version" + - " on the target system"), - ('no-target-compile', 'c', - "do not compile .py to .pyc on the target system"), - ('no-target-optimize', 'o', - "do not compile .py to .pyo (optimized) " - "on the target system"), - ('dist-dir=', 'd', - "directory to put final built distributions in"), - ('bitmap=', 'b', - "bitmap to use for the installer instead of python-powered logo"), - ('title=', 't', - "title to display on the installer background instead of default"), - ('skip-build', None, - "skip rebuilding everything (for testing/debugging)"), - ('install-script=', None, - "basename of installation script to be run after " - "installation or before deinstallation"), - ('pre-install-script=', None, - "Fully qualified filename of a script to be run before " - "any files are installed. This script need not be in the " - "distribution"), - ('user-access-control=', None, - "specify Vista's UAC handling - 'none'/default=no " - "handling, 'auto'=use UAC if target Python installed for " - "all users, 'force'=always use UAC"), - ] - - boolean_options = ['keep-temp', 'no-target-compile', 'no-target-optimize', - 'skip-build'] - - # bpo-10945: bdist_wininst requires mbcs encoding only available on Windows - _unsupported = (sys.platform != "win32") - - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - warnings.warn("bdist_wininst command is deprecated since Python 3.8, " - "use bdist_wheel (wheel packages) instead", - DeprecationWarning, 2) - - def initialize_options(self): - self.bdist_dir = None - self.plat_name = None - self.keep_temp = 0 - self.no_target_compile = 0 - self.no_target_optimize = 0 - self.target_version = None - self.dist_dir = None - self.bitmap = None - self.title = None - self.skip_build = None - self.install_script = None - self.pre_install_script = None - self.user_access_control = None - - - def finalize_options(self): - self.set_undefined_options('bdist', ('skip_build', 'skip_build')) - - if self.bdist_dir is None: - if self.skip_build and self.plat_name: - # If build is skipped and plat_name is overridden, bdist will - # not see the correct 'plat_name' - so set that up manually. - bdist = self.distribution.get_command_obj('bdist') - bdist.plat_name = self.plat_name - # next the command will be initialized using that name - bdist_base = self.get_finalized_command('bdist').bdist_base - self.bdist_dir = os.path.join(bdist_base, 'wininst') - - if not self.target_version: - self.target_version = "" - - if not self.skip_build and self.distribution.has_ext_modules(): - short_version = get_python_version() - if self.target_version and self.target_version != short_version: - raise DistutilsOptionError( - "target version can only be %s, or the '--skip-build'" \ - " option must be specified" % (short_version,)) - self.target_version = short_version - - self.set_undefined_options('bdist', - ('dist_dir', 'dist_dir'), - ('plat_name', 'plat_name'), - ) - - if self.install_script: - for script in self.distribution.scripts: - if self.install_script == os.path.basename(script): - break - else: - raise DistutilsOptionError( - "install_script '%s' not found in scripts" - % self.install_script) - - def run(self): - if (sys.platform != "win32" and - (self.distribution.has_ext_modules() or - self.distribution.has_c_libraries())): - raise DistutilsPlatformError \ - ("distribution contains extensions and/or C libraries; " - "must be compiled on a Windows 32 platform") - - if not self.skip_build: - self.run_command('build') - - install = self.reinitialize_command('install', reinit_subcommands=1) - install.root = self.bdist_dir - install.skip_build = self.skip_build - install.warn_dir = 0 - install.plat_name = self.plat_name - - install_lib = self.reinitialize_command('install_lib') - # we do not want to include pyc or pyo files - install_lib.compile = 0 - install_lib.optimize = 0 - - if self.distribution.has_ext_modules(): - # If we are building an installer for a Python version other - # than the one we are currently running, then we need to ensure - # our build_lib reflects the other Python version rather than ours. - # Note that for target_version!=sys.version, we must have skipped the - # build step, so there is no issue with enforcing the build of this - # version. - target_version = self.target_version - if not target_version: - assert self.skip_build, "Should have already checked this" - target_version = '%d.%d' % sys.version_info[:2] - plat_specifier = ".%s-%s" % (self.plat_name, target_version) - build = self.get_finalized_command('build') - build.build_lib = os.path.join(build.build_base, - 'lib' + plat_specifier) - - # Use a custom scheme for the zip-file, because we have to decide - # at installation time which scheme to use. - for key in ('purelib', 'platlib', 'headers', 'scripts', 'data'): - value = key.upper() - if key == 'headers': - value = value + '/Include/$dist_name' - setattr(install, - 'install_' + key, - value) - - log.info("installing to %s", self.bdist_dir) - install.ensure_finalized() - - # avoid warning of 'install_lib' about installing - # into a directory not in sys.path - sys.path.insert(0, os.path.join(self.bdist_dir, 'PURELIB')) - - install.run() - - del sys.path[0] - - # And make an archive relative to the root of the - # pseudo-installation tree. - from tempfile import mktemp - archive_basename = mktemp() - fullname = self.distribution.get_fullname() - arcname = self.make_archive(archive_basename, "zip", - root_dir=self.bdist_dir) - # create an exe containing the zip-file - self.create_exe(arcname, fullname, self.bitmap) - if self.distribution.has_ext_modules(): - pyversion = get_python_version() - else: - pyversion = 'any' - self.distribution.dist_files.append(('bdist_wininst', pyversion, - self.get_installer_filename(fullname))) - # remove the zip-file again - log.debug("removing temporary file '%s'", arcname) - os.remove(arcname) - - if not self.keep_temp: - remove_tree(self.bdist_dir, dry_run=self.dry_run) - - def get_inidata(self): - # Return data describing the installation. - lines = [] - metadata = self.distribution.metadata - - # Write the [metadata] section. - lines.append("[metadata]") - - # 'info' will be displayed in the installer's dialog box, - # describing the items to be installed. - info = (metadata.long_description or '') + '\n' - - # Escape newline characters - def escape(s): - return s.replace("\n", "\\n") - - for name in ["author", "author_email", "description", "maintainer", - "maintainer_email", "name", "url", "version"]: - data = getattr(metadata, name, "") - if data: - info = info + ("\n %s: %s" % \ - (name.capitalize(), escape(data))) - lines.append("%s=%s" % (name, escape(data))) - - # The [setup] section contains entries controlling - # the installer runtime. - lines.append("\n[Setup]") - if self.install_script: - lines.append("install_script=%s" % self.install_script) - lines.append("info=%s" % escape(info)) - lines.append("target_compile=%d" % (not self.no_target_compile)) - lines.append("target_optimize=%d" % (not self.no_target_optimize)) - if self.target_version: - lines.append("target_version=%s" % self.target_version) - if self.user_access_control: - lines.append("user_access_control=%s" % self.user_access_control) - - title = self.title or self.distribution.get_fullname() - lines.append("title=%s" % escape(title)) - import time - import distutils - build_info = "Built %s with distutils-%s" % \ - (time.ctime(time.time()), distutils.__version__) - lines.append("build_info=%s" % build_info) - return "\n".join(lines) - - def create_exe(self, arcname, fullname, bitmap=None): - import struct - - self.mkpath(self.dist_dir) - - cfgdata = self.get_inidata() - - installer_name = self.get_installer_filename(fullname) - self.announce("creating %s" % installer_name) - - if bitmap: - with open(bitmap, "rb") as f: - bitmapdata = f.read() - bitmaplen = len(bitmapdata) - else: - bitmaplen = 0 - - with open(installer_name, "wb") as file: - file.write(self.get_exe_bytes()) - if bitmap: - file.write(bitmapdata) - - # Convert cfgdata from unicode to ascii, mbcs encoded - if isinstance(cfgdata, str): - cfgdata = cfgdata.encode("mbcs") - - # Append the pre-install script - cfgdata = cfgdata + b"\0" - if self.pre_install_script: - # We need to normalize newlines, so we open in text mode and - # convert back to bytes. "latin-1" simply avoids any possible - # failures. - with open(self.pre_install_script, "r", - encoding="latin-1") as script: - script_data = script.read().encode("latin-1") - cfgdata = cfgdata + script_data + b"\n\0" - else: - # empty pre-install script - cfgdata = cfgdata + b"\0" - file.write(cfgdata) - - # The 'magic number' 0x1234567B is used to make sure that the - # binary layout of 'cfgdata' is what the wininst.exe binary - # expects. If the layout changes, increment that number, make - # the corresponding changes to the wininst.exe sources, and - # recompile them. - header = struct.pack("", value) + value = value.replace("$installed_base", "$base") + value = value.replace("$py_version_nodot_plat", "$py_version_nodot") + if key == "headers": + value += "/$dist_name" + if sys.version_info >= (3, 9) and key == "platlib": + # platlibdir is available since 3.9: bpo-1294959 + value = value.replace("/lib/", "/$platlibdir/") + INSTALL_SCHEMES[main_key][key] = value + +# The following part of INSTALL_SCHEMES has a different definition +# than the one in sysconfig, but because both depend on the site module, +# the outcomes should be the same. if HAS_USER_SITE: INSTALL_SCHEMES['nt_user'] = { 'purelib': '$usersite', @@ -64,11 +86,6 @@ if HAS_USER_SITE: 'data' : '$userbase', } -# The keys to an installation scheme; if any new types of files are to be -# installed, be sure to add an entry to every installation scheme above, -# and to SCHEME_KEYS here. -SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data') - class install(Command): @@ -169,8 +186,9 @@ class install(Command): self.install_lib = None # set to either purelib or platlib self.install_scripts = None self.install_data = None - self.install_userbase = USER_BASE - self.install_usersite = USER_SITE + if HAS_USER_SITE: + self.install_userbase = USER_BASE + self.install_usersite = USER_SITE self.compile = None self.optimize = None @@ -305,6 +323,9 @@ class install(Command): self.config_vars['userbase'] = self.install_userbase self.config_vars['usersite'] = self.install_usersite + if sysconfig.is_python_build(True): + self.config_vars['srcdir'] = sysconfig.get_config_var('srcdir') + self.expand_basedirs() self.dump_dirs("post-expand_basedirs()") @@ -343,8 +364,9 @@ class install(Command): # Convert directories from Unix /-separated syntax to the local # convention. self.convert_paths('lib', 'purelib', 'platlib', - 'scripts', 'data', 'headers', - 'userbase', 'usersite') + 'scripts', 'data', 'headers') + if HAS_USER_SITE: + self.convert_paths('userbase', 'usersite') # Deprecated # Well, we're not actually fully completely finalized yet: we still diff --git a/Lib/distutils/command/wininst-10.0-amd64.exe b/Lib/distutils/command/wininst-10.0-amd64.exe deleted file mode 100644 index 6fa0dce16315854223a9fefc3ac9f3cf71730a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222208 zcmeFadw5e-zWALs4GqwmqC~2q1gVM^wOSmD1&smAn`IHwx-pF zZIn6VT+W%BGrluk#!=6l87z#Kh9YgbUqn#66wz^qpjK2UDDL0qyLQqRbv$#P^Lzhz zpXcSF`?Buqdtcx6-7D4KU*>Q+9F9ExEX(0&<}UyI>iXYYavY9hhOIot@z?$vhBxPg zHw>RT@1{k*1q*MxapASM_-e1c_14=WzUyxAEsWmkyXjV6VDc2-Ew^2N!#Rb814=SY z|1N*jbMMa`zbE^5`^Y!;yvzI2qST(Gy1%*SBkuc7N$&YT-Cx=Bp1N<@vzPn(b0_Qx za9>(v?wP0VJ5~PDqIcB&ikoWZN!$NyCN)8aELiqxZDrN}ecF1he8dv|mKO@O(--YGft*-DwZl(ZYk-lT3OMIIe*4s$vl zm4_Cmqw6^Ck2)R8PLhP9|FztZ>lk`;(s#ej$#wW$|GdaKksI!eki9;@sAWJhcOi;C z|9lR|oO2dle{JMihak zT~N)DxvEKx{zf_fISUsptfi`gNelUdd8zqkx!%_Q|EGTi0(xUdQ@Jg08V zxhn-=S?I~=;PQ*UgEM0I218YGN&^cA@d!;E!X(R0hUl4yC)BBik< zdc59fMF!~!@1@gn9SPkPHr7}>(gSqkwH3l|)(-!HSBj#;S3EB--XoXiIaaW{PH+HNL zhO)K+xJiAxQ$y&}Cw===N$($Odisr?DXp9gB=xBRm^K?Q+XR+7R^+RO%Ue?0d60rC zRrtu-=6U{+l3(!TdH%tYW!%GwK#AY-UP;^GM7YGS-u1-P62C%RNcFif*!W@8ZFwi~ zmVR7DJ5qpCzBQQ8@&Yzg&b3SGhG}_ElIPeFE9#|pPs2h%Q^MOgCD)Ovk!Kq4WuU7i zF3;7C4VL%dWSQLt0Bd=7$#dg@O!acR`Z-d4kiz(yaAHoO#g}&&!wjVyn*4Ygg$`P#P$y@w`0o6lXivq0Y@AZYMgo=!t?# zMiSt4`cR$Z+SR&qt)7@xrzZmLQ$j|2sC2VbUa&N$DQ^I>uAwFRnI7w~VCuv@b^D)D zWv#XP!7X)*2U)XZUNa+J$&*t1pYc5J(&5>;@ha%Iy3XJ9+iAbBPFkL)8-WsC zk5xD#mxSrh7^53gOKR*sX#e1ra6+>}Mt`$;m`FfR!vQcCvRUT9eQ?Y8y2WQ&v!vXd$V|`k6AJ>yWyOMn zvbl_IBq_(p91#%Z9g^ZRO=$^oJ&S@tx^z=xuyngXs*MDXKHX?H|MsOwFHb``Qmnf1 z!^jB%1K~i0z_8B{F`AWJ(T|yE)^ z!%%Fkb*V9S?`1|{ue-b@WULiL0CE9V2w?GEzExYASEO63ngT<<0&AZrP{?>sv~fqN zQ0*4o39$D+6D&;%ES3h&w8qYgoH+K}$nia;6cS^|6G39#MYAHVx{J<@_M>Ud0*}>o z)wM0=F1RK26UJz34~lWw)t9hw!LR##EBct%}C`H~TJ z6}LtT>navTb@J9Y3)7Wz+nj|^Zi^mk&5gBvl|ENQbD7rcmH~pNK{1D8?0~47!e~V2 zktU~5WLY}5X`p%s)zJqX~f!PJef_CJFe zfc!qVC17;ui7T!04$FIU2!o^DFm-2#d5P+|TPB`Y-jXg2BqrskD&-wQ;KH@&@G;b& z1d4H!dCz?gM;e{oCd2a!uyipc;NsO~SP>c9NYqJnyK}3c`y&mO8O<+bQFSJSlo(+*xM`P^Svddd%vZazqiGWVPzCwxZY< z0~Wp~aG$UGuA#Mb70rHpI`6fusBhibQr;0T@>VIDvb^`uF!cwkSLSh^8t!ekIvweg zXy`Y$sfIpA1PWgR#K=`n2M97Aw7~$sjK533@T-zJHopkGvUb=s(K>#S1NHk_L=PCQ zypgo1w9a!1j5pLVzw1lpIk?PJk9VqTjk?ZpFl6Hm%R7ywNMp-gLz&F6Vkj7ePKJg? zwY=|sAK1PujRC}&;Y9Vaa3a_wIQL7+JgRIGu#!+A33o#5@=~TJf_3sRQc@Sl6Z3nJ z*1(`>vuv9+N~wkuh3ya0Orr32f62v~2pCF9QRP1sUENhcM;FskYPPah!X-6=)j6b= z{Z2-lV-+z2Db)oyQ)9BFbYohRR~9uy~U2+*3D8n+Zi`km)aP7yA2E z$!4L$`qe^?BFvFN2t_@Vm{g3=u1-wyh2oQTRwocV3GX__r&#s&nTjezxSVZyyI4bu zZk!|2!5lz3t5Th$)BTUBWo)**XUYI#tMyi>^_Ek4wobc!o)g89(HDzLiWP&@$c*au zJ!dn>o)Stb1`*AJaK#|?NJ|Ot0vS$1DJoeZ2*fS#RjN~!Xx>&YH4q;cv)Tu3p2pvS z|C26C-eqSC zNG=hHy%uu`g)W*L6Urr+FxH9!w$(EFy<=$}3M$zY@Q8ZfZ(CQ7Opt;JHCM3oIlc-p zb_E!ix|q3lWAE>|+SWIH?OD-e3GZnNL$6!jsnSludqk!Ne;eJFSF@A0+DTzqWSnCs zJ)12>(n)sGgV|D4blXYSW=oku*Ym*pc-6<4Y|&23`<9(_Og4#y&{~oZ)Kpo3_3vqD z0|hK>JPj}LP%RH)DpgC?(<31 z?KPnX^}Goka`9ZJLz2$^!*DQcd`{Ayn|P{ShuTc;cInOynly7fx-V?BXx3|@FxL2D zU-VnZVt>9+v66vjN1)Jf{Itet)Q-E>+#u3E96$RW-qWs(sWc1Dj;;0`Wfl3SP3g1P zsNW~+O+CTd8JS-s#9#i39uLluRawGoG4N_*cXcg>(kFVn8Zv$aaw2EDn$kv!x-D;= zo%W=i7M4}!Eq2oVnPR{t9`sq>>2`7(l9(kds3y7C@?IjzMzu8jg31ElrM+o&k`@mZ zS>EG&6R)xpM_S$-5>Y>6s@+%i#fJ2pHb=$Y?P+CX5ZKR3PPGh5^ z)rR>Zkan0Kl|UU>CCVohFkXS{R+8S5aSXA*>g@H?9Jx5x@$%=)3BQ=J$?}dHm+M&Z znY?2#3NPRfBS|;58StxezZ`47t5TLXPu>!RuFIVc^UXujj$-*!STqKWH6a7$Z8v`| z*fll@Bdi~bZRa)r25~?yFI7oxh-CvS65X)fJu759=s`+~j`C-E`VZa};h`_-^kwl1 zSGFxG%%qJV&FB{INNv0Mk2}X zzWgJ30hF$i21dVN(|YeBIdztd-K zA@q;4lOD+?0b_?G8C|j#t`wKr_r#lXp3dti0mm8OYx^7o?>0Dt&dizMErjcHyRnn( zT!icn2-O*D2WdyIGFZybR3cO@E3@kjdkvWtqnHGp5RPuRHV+l~sn#BwRf?ijv-(tq zmnBfVayg1Tp_6Z=(5pcE--RMXJ0b^vc~P$8MWIk*gMyO5J5E_pC%Mtg8~&#s$YY}L z=F6bW@dp)!Gy5oZP?1np!rLL{9yUacGRM~`IPzvDKCvw3p4z9ztO)pgWxTBu0v<@S zA!B=nNL}jfwG4?K9D@Kr*#3r^LTz}HAEbcM-7Lf!LvjS5(6fa?15p9dPQk~Gz``#B za?5~9S1ldTR3QF@hK}fGy_8E^?n?40?4$6MQOX6XsFtkH=_X(!Yn>Kr9i^?wJIP_T zBCteKS7Du`vEU1ThJ9uJS*23RM|+BzUzR~4C>|_Pc*34JZN6>KbTShN9OAy&FT|a3 zC)l!ym2dsNIk*PF^?N7w;JStsS!x~ryMrg>bWkKm8GmZU;tv?ffPsQv;TS|!l3}>* z6--T-J%f-|(AZj$V%EvBbw)P581}GjAKMF=n>pFR_UoA6HYiPB;pHfsEpHN&KpX8e^)2xs( zhU>@)J=64&5=ty8HV%oKQEbtbGT$(w{yuqJM$#`PsG1wktu|S)k>ZdnxuU{=#n0<|sJ4eY@pLlfq zdTfp)uvscZA^6#Z^_3lyR4lnoK(bGb?2GDj>^@9yt0X4q?_tm&1{ zUug{5$Q8yve4$LqHqrkf&+v2PMVlXOHf4Vx4>bo~RMAaJWdEJ#_&GX85$p+_iklRV z%{;`YKkILh(U;*aIdCb1)Qv-t%X#_a8eXDRj0^0A4c8lFs?h}veLyHta}0y7cD8HH zz=TRW#Ut#qyi+caVQym_*ul@xhUI-i(65Ap?IrS0=~<8n11lPIjTq8H+2RTb8&8+C za5q*3%MX-Jbsxs=<#wPt9(7d5&x`FnRj++RcfMY~*sZ+kp2i`RuCKg%`siaL$AQZc z$_h1K{Q`3PiV?Cc*Yp|pz?emD_7`d=0IGF*X**ADxy1_)g`AGkDQ-P+cixM#Ml2m- zY|!FGdTqX5y3;&vfy}ZC0?VvFz?)z88J-#~R+pzCCSXW-AM-O=xX}+I!Y!8fK9wK2 zF<^Lj53^%frX_SXa$cJo;ANz``pmoE6Ip2r0oR1-Qb5>l-Xl&`+nH?~QBHE*xz2oi zrML+3QYx8cOjh#lr6wA?Y5JK~1dtUSG1 z+?DI0f_drVW$%nAHYizfl|1zDO2IZ5`A!uT|j{jP4Xj7_Q5`Js53K zDXG|DPh=qe2r8vcm(c*j1(vslceSah6zrwE(UGya`Np|(=K`{WdyQ4)Ta(?nMtd?f z%$Y=wEMac4k1`KOCH@5dX7X3VpQQTvtKhH9R_QWQ8Sx7kzLqz3K2~e2UxtXA(6Y7KzQ~wg0+lK zgl*_)GuW{ezai?ixdnZ1I%JVi+6gMw9G5{w<8vMXyX$ggP`qA#Kslihg`}bh=ZT>Y zM&4#TD;?-FgjqaVCs}t|-a8?z6%I!oMT1S2_lFb;C(a&^2`_{)Cmg@!QA+=U+-0^L zmAX5Rnof~O9up7UK7rMP?O5?seX=yo8?_in&i!*@fGN2zye;rCp|MI zOd0$`Lf?#Yrp&!Yo^-kR$~p9`1^?rN;%l z1TZqnFe}E2BdkKn(*R4KK*{J}>DoZ))RKzQ_R>JfSk2jLli8+!FI}~z8xxT&z~j`j zQ11KXG8;%;7`pp90n;oc(`%6F{wd9Vg@0Bd8T=3GVZ}0X@Q%d}U*>7}JrJ!wTm%Pr z8einu{0K`tY@B=$w_P=c`%u7WtNUiPNSE~qTfdffqUs*l1=T~lnS!2B-Cjz-7^s zvD0WyTLB|OK`nyL1!y13yM|<&QPlK+$$Qt*Tm5Q*gDu+_cyUJUh=1kLUd{7lQ3g1{ zny~S%IJI@6Il@MYnFN`Mw&DbbP;3jfsxlYL51_}-5y7W+Z+{5<^x+Y_&$N)@h1Ona{HxHEX0ezp?Vcdrnfn|_QM#uRYL z1njlIblZCj3}n$NvmMFAu|sUUA7j^t#i|7$E9&DRm=PAC?28t3Uw`0*OBV#a~Q8lAziI1)O3+I6c^39N(n16@neycG0v)Mg!aFj zEn_D}MdpxEY7*QaJB~ek%9e%VPVeajIAxSkDCEnL{&kvpZ?n7xM>JCwTwlf;$B$XlbVpL5(2;?eHGXpq($hS$5U?l}&{~+G@`e&WIkCN$Aq6}QPr!iXR{h>p zP+4S@wbs+PkCd0b;xac-xyIA@7Eht1S)^h8TPzVSWVWex5|MqIrqU){aKhK*1Y`q5 zhci3X5WH->W_kPbj=oq)l$zeQN`W2=(s;$3gL_8Mk34xFwjzmq1yortkV*4evq6d~ zr6!5|rYOE7x*v`)9T}R?Ev@-}RVZAG4Gts$25}&iTj~nXYeP$9G#I!`twtVH8*%i7 z{UI$SfD4s-#Z)fCUFs^JUa;}K=maXCO67fGzbE=sK90(I;t^Fj4NkoOK?%?u<7VSo zP3%iJM?FY+?FHbMkzhe%eMX4okfUbW^tGApwCmz-kX6IgmUj~gK~(NnLd88oFi9#M zUje_Z{8%9ffR0sjbB&Y4u598NBrf%yNm`RPjpwY%`^q>r1NYOf@D4>_OP=j4?gEM-hh0g(X%BlWNUEEg8r?TdIgm zsHDL1KFM1kF*zsA^RIcF?X7k4TSR)8}p+Fd63y z3kBP+*yB^2Mx+#RQcuhjF5`<;$^OGTvv#ypBB$zvAWuG?kL{GD`wTOFKDcaV&z@UgxxP*$z z+&9DGV1Q0Zpu+L?Acj!SJm1clqKbO=Vf^A_F^7_Bcz*_ELfum)IUTb4))R?3V8b~7 zMzLy&X);RmDxpylYegZyfOd|a_^B%SbqEW1`(f<>bRUp9{xk(%A91Q@DwqYu_RiEb z04d0uENh>y3x52lX;|!Wsa)Mz9j=f zc$`A~#Yi>&3smcBePxgSdeRx^=KxXwvmiTIv3wYf*x90wM3tCN+^AriBu$MlLmF=p z%W|PhNl2GgIxPUf|!t0nNcqgt#B76!Kkw+j+(GOK6Wk1Vo?Y6@7Gg8@F<^$5m zQ4{Z-wI!>>gIkn{{`QGqFd{qgyU$P)AFD>!XW}=Lu4a*)al+dz&DtO=e2-E0O#E3q z1~UAFVr8Vn{nKqJA-w)|DKT5ST5PZSeKQr`yDoJB2HOiS3Re2`nMbb7KK-fZ>32Lq z`)6ecpsa^k+_)_PNa(=rG~Ej|R>6(WonP z)xsXX9Newcz>PdeY3zEDxOlm^vxcDlN-zvjkZgXq2Qv-(I8tohE(l;h8iJ7>0NFt^ zXjx}}hMiI3*2N9H56CE!r&%@cs;6|XdG(m;e3Mx!!cu%7@4~C*D@Sn8;-GXzL@3bL zx0{x0C>t9$V;AES!xB0IB3kFua_Ah~x%&|^zQ zNfyN@+oS8vpHH#LU1$MvC%R&hj|dC=0z_CSzZtTk@LEKP<^5tfK*jbK9K}|TWG~vg zK=?|$J0D11+%?l@&+RQKpj(~L;u8X8!*xn7IX15>Bc*QKgF%_11dCh&Chz5q_GV%^ z338yRpTg&|56B7!(cZJ-%Peg&tG+oZo;JEtBx4!=6J9fGC_AoQruf$@7(o4M8AmJQ z$+++y%IO(Ti;R#?Wm)Tcgcr-(LPO;pAZbW!aY>2mj{eaC9!BOYblEPCq_Cu_M+Z~v z4y0k_YpmbbE-hk{_4e@`DVTH1U=(IM=zKL>S<~8~Qb1oZnP{d5*~E)=`|c&k(>sz9 zGPE+ak#-+B)E=l3kruWgAe!n8Q_Uc6iMFcx4i*JpN9g<|UvlchUUMrwbb^lYPt~1Z8$I-p>g%}h2H z0yNkbd^(5Q-1ybc*^YttPgeS7nlc0uQ$E4pMhgC6u8AogMg1#O%41wt*2$oRBNDtx zof^Iiftplx%X?cUb*AP05*VU*6mUUVVU1M$RS6sgjc4K0$K&~sK|wK>eMbjgw3P*1}jvpEBJSVQJ+$%M+CydYoS z_(A|Aq3nqnIU1qe$~TlTI6glqt9P9~MTURHatC?}tE_=PXOihlWSUf;l4E(FwkxoN z&5aDjk3v4g`wx35n63441~fQ8=2ITuu=yDpxMz19r6KOnjC-OtZlm~Ucq~9m^@WF9 z&Dw^?>g=o)JU*)Gg~wCboN*a=Y>`ZX)G|8(n5;Sc9WdE_ViqPJD~51A%BrIeOm>rc z6ik-c6|yi{Vb|J=)az60Pl_;F3th|UJn?*gdBe*># zeilM;JTDD2M>MJEn@?aKl}_Yg$xnB$JaMON zUd$;1NfYKsbDb!N{=#r-C0WDf1))^s9|mOsOvJYOyhaZs77Y+76+7gN3}Y7aZ0O461>oUQ!}^p__GsMiI3f{`8NL{!}@c_cVK}dJ!*fUd+dr(7)R6i%Nkv0cHBB z6^I{)>6V#F2%Q*9pi#CPpC-S&!@S`gwj1$b14S{u@OL<5GW%f_#WKI6z8D7f!k_Ok z>`fuP7F|gs!Q#BhX_vK5XK(%`kNHTWBB_rFL08QMny$~QF`xPkaa^MDF}5lQA&ci- z5{k9C1pr#*+lx!I*cu7d57oY=C*O6Nk3koG2J2~auJJmug2tDaW9EYE zsaD&HHh#BTHYPV`zoW3ju*|6}ETM%zD1z}$=ccVFk;wt^B4kvoyPv0V5){Ywt={JP z-GN*Y;dOfAHBM0I*7cB1^#c)(1ZTwi-&FgrDpytbZTznPU3O}F|a!Qh8E+*1a4085ifi#wY z6Xhil&mt_a$q9jz@VC3!y6FjlQ?@yLff}4&LKuxU6}xR&j$q35SEwRmY1{rO*UG`f zep<#G%#DaRT)Bqdt>K4+!TF4<@G%^M_`q9Mrs3{nXAvJn9xv($A;4rVV2l)6LLq%P zz5-Q>Y)TEWyhBv(*)yew1H{338h*jt4(>W>S8Pu~*a$LX?>2Fx0ID);jpcnw04Xn; z^(qL+wc4ZA^M z1{hLSwr@=v0LR|_>DF|0&%Xdt2S;@Wxfzsq1{F%uEyT{b&6j_>CcW&fswtal-*Hw zehAl9n?KuWEwlA=UH#rq5YUm)vIT@k#Gy#1+GsDggm^Lz=F7Z7L2I&$ZQ}SzNDr~e zO!lj7k|zkIgbedfZ)H9cO#PL%;kw_*gaQ4xuj;!%AR=JJ2nr> zI-H$><9Jt|9(+54j<+`jddrntm<8jTC`lh?0>6uFP&Ash_L|GE4DT;5l&y&?8Kt?C z06qzkW?`;l#<;?U14H{oe-VS}-@Rk|D{qWZ~cOxtLqmNRut2rOB58 z9?#T|i0|TV@-u^Y;y3|b;pM7L*QI1+MA5^NktnQy08Gz%nUso$I!@x?+RY!Ms_2zT&U(zK`0l+AOm7vg)0E~0Jxr-%- zEsV=sh6kSuB>c13!T+mlsVg&F^u8F9=3gkNR@nY|Ku-4Mhhy8gJ~ThLoF6IaSN@UY9K_?;|PnB2({M(QcVf z?HR-cQkZhsD6T*6&2-;WSX#cdw`DhlnMv@uIhnKy{58@*?1pZ+xE-+@I%zK0BI{@$ z;CN1tU)|gm{Hu=&ZNZ&zkz^zJUn!uPtoH$|toOO~S??Fw3oBdT9jn$Kok*FTA5p1S z;E{5Q+FLmLLZSY|$z7s=WYS`KiPg0W0#Wh&Vayd{oxN{-J|ljqMn)n&XUOt*C(Cxl z8Z+1`bmLtM&peJ(q*icE4$TsC%2+*QLME$^-5CzhzNsN1*H1+K~ro7L* zA#KY)7TON82_i)DEHVF!)Km*e%`Szj3r@7_E~2i{PQ{bWQL19(3Ui8GDP%5H4-tR5 zrEVM{h3LHt=(Uq4dOeSt$QxFMpkXZBhY0aXTEhF0IB+xjUS|nkCJK#{5GA+cfhHZ_ z?hEJg`hgN6h4XM=;@483D*UD38mZjR@@`h(DEx76%JBofE^JEhwusr~x6Rwk*%jh; z=KKmfR+F!Cy&nSkUWen2G(+N@jG;Gip`G}S1jr`}U!a0{$u@=?ceO(sV%`pBe^kNU zd$9sq>Nh~r@c!AZ@di`?j(3SSR#ZID_*im~$mM7dq-THZkBZb>*&vUN`wQh9(UXkA z``G}F9m?TzB*VKzHiM;5j>P^a3ctrF)Ui0G1J}Ap;L}+0MSKkYSwO5c_Y+*w!?>96 zpZ8W0DJ0<)l{~W0{&G|H1Ol2B`w6Dye1?v&@dk0~TeM`Vh%-!bqN6;^b60#~vES(2 z-0a~=eoJWlvT#%Vw9?|uBV_wlpd$Ip8o z5A;4B?0xL+eLU3rc)0iRi{8gCdmoSVK7Q5vXxWck#bgZ1!Xc?0eAh?EU z0Li|t6~{*7G2&$q|KR|cE>QN|*9Js1W3!&znv|8K!S7a;iUnSC3<{P(bt zPbz`~*J=i?AZS_9G`_=tu~jp628`FWWV$FrWSx+BlEvs+KpiyNwdCHSV4}g@1!1WY zD+KyCZ56UFg&m$0kB*(pL>8(&ThVk2V^d%2%UK>Xn6t>Egljlz)!ru&wTy1&L+yaEC5VY7U$0(} zL%w!!t8mna1Fg=;DW2s6HC%YOIm_FVCe9zusTlmTK>23PS{Hpwi+$nq+y}Qq8DHqh zk6nTC@iUZ|&_d`pPcE6(l9xtDeC$KVF zdRl1tMhnSrX+hGmEx7;JEfoB(TPXTpw=ftW&`2*F1cF&uC`cX!2hLORWuTel+pf+& z@aX@&xQQ8tHf20pe2MbCiO(8@{lYg*Ohg9+wP750ALdjIFkV&ldOGXX8 zSAC6Q{wK|ctd8hkf`mbTH=(|(7(;d&&~%VIBu=MFM}N~d0zbUyfcf|YZNzq%3Fbh$ zBQsOQTJl{tcz{uM;y@Vj3h4pomJGv`9$4j!oQ^Kj2nn!Yf>bd~qnH5rU?U_u-5JK& zt|z|#rOiBAU*?&T_cd6+J;mSPp21n}f#!!QZDey0UBE%#PXB#du_@=9t=L>-xAN^g z@IP(k+xg&s+RET>rQrW*E5-kmqiCrQM`hq*b5sw6d%4Pn&zJu<#^n4aWA&Yt%~(Bn zf}w0|+swr{6my9mOflD$8RinM67GV@zLmNDM_mYmJ)`&(CWE*cGQ{2bUBu0y3uqx> zwqjv6pUrI48}SP2)0yN6ZCDI9BvbAYoRG&MjifpiKbEtp5b+#Xl@rM=&(UMaye)g9 zpKzk1`0v8_-i)nbBN;C3(Ejej9+_Ya&f(}R6PJdi#T}toOI`@Q#CeC}uFey^ zi$LGvPh`D_6Mff$i8ud&wwws=^Xf;9ZRV*Y7(2IEk<)vt zoSrRojB0{XU*g@DQqjMazbzr{)jn~guPn1y8ZvYoysR`95#W+JK4g9BIGPbXKhVC5 ziR>gQB6S?wLZtWkmX9FN*gm3%ZWkAG5r~_U`uuK+f)nI;*XRplO{Gx3qFm{&lVxet8#?SVr{wG zI<>^5Zs$(V^89U`&YfCpRS{qru_}G)fmKD(sspS1p2jy2p~hO(j~HOvI<58*t$dsl zG=|n|Ml0%Qn{9q_YVL4O3BNm*@Vo zp(M$a;AjF%?Ed{$by&J&AMFi`q> z$VviJt3z9wqcu6AUFrFn@k%MCYHCrH)2^eHZm=sYnn{J~(sos0!qPldW54R6GQFr$ z<5-B&x4zNfNtwzgeM@h~8oc1)(stxv?(G+9iAhJA|Mb*TPaWL7WpCor9BrwV6N)9B zhzFSSEua#dd8eh$c72{+(!k7Ax_4tbUFj22Lq*>b^fWDbS6O-O91SG>i&A4hKYK1O;E*GEvvE8a zmLgew#$g=G)v|E@t>B@q;yh2|Pvt3gXr`ypkXbf%;J?tmO5ruZ-*T;w%UxxTXc5nT z{3x#d!%2^8^rhiFD*TvNTbRbWak`iQgb;jIdXxNmd_sjag@W?MbJUfX_+|P$(njjB zITa2$Rb`#oA(FeB)g0knRNxbzDa^5Uq{C=qUVL_(otJzXmzmOfOdF0XSji@?BQ=yF zvN{COmxhhd$Z8%mAY7=)aJdBVz_-Q@7u{PLG_*i4F&LlDVc#7mXJlqDet7^HP8?ag zHlmfM9L=BJU}KcYe!`AVn>MdMUA1ZRp#_;bf$*-K7owfx+MIu4qq9w{j(fb4Pv72S z2h;dOPP8Ltp|&DA+?X`d*nzWEgz9Br73DNR1%c!nZ7ESUfibnCq6HKS$7{>BeGtEU zROzk7#@(ZIV|r2L#|trACRK>DwseQtGD7IEcC;~JRC-G3-J^|3qm5T8k9ew%=*~$M zXhO=Fzoby<$9%C)eY@@}9Mx(zkQ~2xbhr?bSWWUFn@^k7Dr)tpZ0h$kELUK-l4F^kR!=8H z2L#4k$w9%t=GDj#7&rQjI|8xpfh$;WGqtOQn&SCE&QGmo_|?WaL1T$K9G}(|h*!_# zdtoyWzo#?EVkllcXJrv}n)9V4PwbG#^Y8>P=V^E!S0Lx4K3u`w)9}2LkQj!wR5sc= zB6H-6v~H@%{dTY<_w||kdzt%QRHDshvDGts#SAALaki7Ep_3+2<3ZFEhs{Do)+RMF zXJ>4UyK?`+Hv;h+i?q5g-7s>(^(M5FngcOu2Uj~faU4tHVAzC*+J@V>PNZ z)|nH}IapOBp)Zk=K+_F7wd6ilc++DILOYr@o8JWB&SbR z3H6}`4ZI9_^AUbegMF$C#RdSfW~gK4rU_&Ui9q8KjNSYIR)0{;R_FU5^*08^J4in*pnDI1- z;52HA4Si@S-!A1HSDCzhQR&+B4;9EaKso=-WUG9Tg`S0aadv{=f#g*j8q^obsf!VR z#yU=;k=^0#A!mpA>@a&az&bJryb!WWj@d*_XyeS;#7PB8zX&@`+EFw*X14BW9L8t^ z@!5J?zIe@LB)GsLcd3~;WhTZh`H};C1U<_~5;3NNT12AMKsKz1jLCYXK5|ihplQ?~ zt4hZfi?{&d!u8o%c{yv-w8vw9@o9D%YA||E(3Cie#($^puyKn?NKcj=K@m`rfeBYj zW3afVflz2Zsk9O_`6+w1j760PEuKV_ZHE=vHyJNTLtQ@+GtLFscORz*H78${r zT6`iv2%4dIzxW-2@&jPhKjw~6(c@y5oajj`X0Tf2HN_lI$CI&*6ROOOgj9(FoJ+m!eq+V(an?Eu=XFNdMHqale^KF7Ksu*`+^|zvG)7KaK67!1m?+M@@6wp>c?c01df8;i!f5AHUSoG)NHS0&B7n_Grewnu+NnG(-fcZ8EbTpudy zZ=$a)Uu?hBOnN|iq-yS0O_ zGHAdZ)?)AFYO(eG1MxFb7efD)lSkgp_am-qF*kpv1P*U!9Np^&K)o+f@nsO2qtDEZ zt83cwA$nV4WvG@&ZU`-PAD39l9Z895I2riKouly7y*_i7Z;MeU1ITOKLT~9Cjg7J0 z`P#O9rJrO3;0ket{4+J7#IQ(K&-3dKZbr6NwkySOF|?jKpLxb7>sgToy*M~O($jDw zEw<&0C8V@oz_?9V&(pw>1CC(j$3aik$HB@Jx0Fh*pt$fMA$7PVG~+F^PVBXus{w^g z0Kw8DL0JcF3!HhIE-(TvwxWeN-e8JKBy?f-|92A+I$0@xN?ep9=<8D!WLdr8hI&S< z5~s>)rj)^JTfRigLkb0+hMYor%Fy!-oNCh-QyB>lCA8%aq=v})*cUD$JQ@1BNpq0)3)_E{T63s>R%TpjClM#fw1kzxD| zVHa;Kq}G6uh&ad)c>2uv5Y|D)Ci4Z1{a-WZ;m-{AV zQF$6RWbRv0Cc+M@Xd-ng0$f4;zeE81b1pbWpuQf^xMFMeYaD$kPrHW+?B5+$pOp1t ztkc7J@*+c8^5T;t@fml^9iyjw#D)Mm7+k{c>c{O zHub9(jHz0@XikPNhky5opaY|7vG65*I=Sch=Z@ff-3P0h1OQcwV{4A2pSFt>_>s21 znw-tJckyux|Dh))&(jkR$Wk(#c({%_@j;xjO5y>&S!P-FbE%;MD%1wKM15+< znLmTGh1`Q8iba<0X7IhFmeLrwh;5l+TmG>$k&^EY6_~@wpnnQxWAZ#DYPWUDkq7KC zjA(~cW*T`-MteN?CKi`xc}L~OJN_o;B^AxBT)Swh?dGZcWYJlw`492k^=%$Q7pphm z>;$uKiD6OMwU7@Ds^9WFAADQ!oiTaw+;~G4G$}a*V(yq}Z%1oA%cs3XoKtQF8$bD4 z%SRd08qEqejJ2ivX;l>IS4P~o$#bGmCX3-tp#NN%PT_J=tr>oZFXIgn17VZmumiGp0C>P}}>q_X{vOR-&!BMoZmAv0@j^h2fI>{3F(qf>IMV^%ss zAdjAP6oI6bE#O*uRBG&!le0BcbBXZ>Jq_z9IX5uox8iQ(hl3KXbB?N$`Xl)Pqbkxv z$j>UmjXzKacx_Uyg31*gXQ*7csnyS1v^iu2E#&PpS7G7w(Da#f^ao;*zeOAOA@kE@ z7KZAHA>0W+&8NpXjHWF|>{ZoACa^^D7l&ym-dw?C9A=H(W56(NM&erxS23NY<4Wmg z1hl8&l#JlZ0!KKjEuZ}j{0LURg+J6dZvdiQIIlWBy(k!GK^i|tOhKX!Fzm$g!vr+X z;RAu#B?D!#YA;&Vf;F?Qm8KQU`z~OCe<1PwE>B~XoZ9)Y@<*jAdCqcaApToP3>&j& z_F-7f$TQMo6*JC3)AXf2D%#Abm>kyJ)+sFcO7;PT zc8J^9j9kF@$H*(vQ03eBrJ8ol>IjZluWd^a{W5{!h_sL+h;Sn;C*&lVzFG}0$>Ku| zkF4sqjEyXi)xapEIXgsVC>hbI867O2365d#3_3VswTxQZW(J)2AgX4LH}dLwx(G_3 z!J0dMBTXv#5?7Fu$f{lTv~pB}Eqg?aVLk%USL-cf_RvYr2> z`^CMjjabc)a;o&4p9@lrD%Li~(|G)WPI;X?A2iSTx^V7;>&Vx-qsD)S>p4oU_u~5h z4IIA(kN#i4@tp6*v5iti11P9I2nJ^&v~u`RtB>Fqj#Tc;%^c>JKLl7SVhDp*Fe zn@Bw-JDrS2=U+r>*hXqwKAV{KN+Kwpf)>ThVfHk%(j=a!`?n!S*wC0<=DGiI9+A7^ zN#+cCUYN#-eEpQV7)0|tk(kZY3k)ZgDvtc8m|4{nVx@7GJby$#au;up+)b6|X`K8a zv2B>QR_aooWO3PxdnsVlV-;YWUgITMEla;k<(w9RPNj|@L#Y!#p4 znAt^~Ts|7ZJnb@H*(pHIEFY8yN-T1co63y70Wtpl(oSOc6UX_@z8 zXS=kkd4lUJCl@OYEGG^$bs3XBDWtaj2(Z zBh3KW7l>3$?F14EM?+4Mj-1PmLum*_1#;N~6lZbkm^%cuSH7!IyZ1GP+Rn^+ zA$G}e5qIp8V~Ajm_Tz+mAa7LV8Lu7O*<44*Cw0Vj`%!(Kz-BFx=XP#(&IoAn>8waQ zqIq=HFLqB&UbLW@MUHIN1^D4VHsMlF61K=5ug4qQArO}hudkT{8mwiMx2nf zDp+2XPR>SgfrC3cpR4)V<*Z> z>_-)71&>OfBN~>YjgBccBqm%hwkc$hWj%)b24`Pw`Ja6$1vn0J1?V` z?N4pn`?~xF!z;p}a5iQi6!~S(Qx`nR4~Y5fU!`Q<69j=NTZ|O7)rooq ziVnr38BFp045iM_mMV!=c%m+&Mo%9Tt0<24H2ewm1tJG8`QY?9y8hCcyG zvR{u+dzP%{F&cjxOf1Qn`{|#AWsxQL&Nh3Vm!16Fxq+O;!M0H8j_604aROg}Yibvi zXcd|YzR&utELuRspB^)FgOxiLeWX>sffjlrNW{(QA!A@$o;qXD$Sa8xap24&$$kjN z#~@hRa7D-mx0O3?$CwIs*zEpK!1CcT*xgmT@yKFV43K6#SIpF^}`z2bltO`Sh z(^wZYJ{CHR2OpLQpkgf%#9{K49J{T4iWSi@zr-C6J`k+@AlhH6KQfi6F7jxxFZt@5 z*Bbg=$P%$FbrVm@^fu^A)=@XU=BC#O6 zH1D#eyb`i6P4`=qS29PwE57Gp)=An6Ld{y~MnfQ1k_$?;ZSQHUt@dih=YjYwf6|=W zwbEC$($BPb-p`|-g^jCU4zO|S*7(uK#PpnP@1}FN>}}i;JzRc(<;;M@cxyykVr*_Y z*Z7Jk5`3M>mGa}|R&s96)LSR3Z{R4HB(I;Ml`P5DGtl74Rv)ELzV`p9V|+p~tHqR?!3# z5~EKCuiM_$SZ57|0-{hEbX8!j;WKeQ3c#n5vgc#0&#aaL&Tc?aU<4lz$d?@Q=|-Ve zZwW#?vE6`6zF3zO!HFlf$;PlmvZ&!sY$|yIj0--C#y8D+g2+8iaRu$R5Su$b9(XcW zVNT{MGfj z%g1kBOqP$|L_GCwU&|S53D*W(hONyvkR$OT{K_Zir^yL1oczEqdFX~ZYf1AwyV+Qq zx*UHhDr0S`ncXYvv>$BG;W|rQU)mwh&#CM0)%6i|ynwG>OkMrzdcL|2 zRo7$G)uFEYUz0Z9Q`gtjwOw5gs~!XDI#FG9b-h$w!|HmOy4I-c73w-wU8k$-Om+Rf zy4vHvMm^6_*Xz{vdUc(vuJhE@o^NEQjB2jB&Q#YEUzd~ub^S`EbgApR>iVj>u2I)! zb$v=*f2FPuscW6OE>zd+)pfeM>gsxtx{gxUQ`EIcU31m-GX<-EsB7`7GLix6`X#GO z>$H#5wNqWUs_SZXJ)o}3)b$E=ovN<4s_O!EJ-<)-MD<*uu2-nO0;>0O)U}LjI{%_o zgp*pyr8)RnKD}sFl;1~4wqlNAh<@YW+_|1%4G^8sXEMZZMK7GaHugBVx(UfMvNC>6%$MsigjK>q<+8X82crk7iVM;r~NNmrpE`NS=oHfbn`-2k}P@E_M|jcFLQo#NCvaF1d6^H+R()lsHmT5rln#&^v#ua~&0WABVCK zA`Bp|J&??geD6RqCo+&DT^YFg<@f{1+=yqcK?2%+F8c>)&jZQ4NTHpSr&96+9Lba` zdb$1Jl!Xq*!m3OK626M+%m*w{cgSc}@SqRXfk5a}Nd!RhFN+@@v+(i(ukq4g*qA!N z%?Nx1LE&3u!bV^~m!x(pxM^J^c1K^Ovtg+pGWEXgEz>y-5dpIBZ_PC5@D%3_@Dv9I z`1Sf^9q$ZdpI)Dm63u?z!$yJKU)a;ypTEo91SAe1EO_dGVqQZ@$Ac8crI8q4G zW2xLeNKyzQEw2YjSp?PeB8a_ZfvEyqPP7L>`8I+GqwneBU&K#f0B6rn9neL`f*^jP z8af3*0B*3|jYbI7py+mmo<%l#dhxCBgFEC78$aMe(9(k@8$ZcD_z7qF6Zm!ud;xfP z0HB{bK#&kJC9PA^c1qf2#-%VM=(`+5hV7Br2y&A+=)3T<68zZyf}nxsW>M9l#rAY- z2OMbSEfK!(^1G{RYw`~63}Xt{wueV-3Dve3Ovg-CqIOz z|AOG%a5*tF*rfOmQYlzb#q?K8l%oXKY%$}2shMZeKQ;z3m7b&n4T-?%2_0qKmR^>;|TAJIGH;DR!S=htz zk$h64d(+3B-$J@j9P%>{0lEsB%th3=7oOfbQ~?u1w?}*QNIM8$#>r?f=>}=a)6gie zvOBr6;k~AkL6O@tuQ%Cqpj4zblQi8fF*WmA)mwt8tAUQTOUSv|GVasV9Hj|9eo!gL z*#!{x^6F_E3&MJ4^)+nu#g|@Ln0hAH5gnu_lSOk6Ci$6&+)w$0q@yS`=rZVlMdB!N zPnE$!CG)BcJ~8BY;A-_vVzqp9z_DuTL^Pkdp@#CJ?)Xj48M=yv^v7-}DsQmDt@Z#Y?!F@31{7VZ-puC60TJF-v=E zr8nr!)@}Zu$i}ulCjZ_&=JKm}N>rDb(`L)DU!KOh)T*bt!i;1RuCNn)=1(#SrIKKH zI7_?kGpA$89KAN^Bi^q|FKx#d?~)+hE?Skwt_GfCf@PkD{|7FRjK}SahDYSRHdvwR z0g5w&UFP32l}1vjZGw*yj?{crPX+$|DwEycZZpC`&+E(?Dv_|Ypf6L!Nu$3==cz%} z4h%KNo9us#F2q-u2U9v6o;>W5W89MFCAxDn#)N+J*0ETwaVI}}+&|Vb78V*CciQE{ ziGo3)h??Q2-uh2o0VdnN3W}@H<`C28p8zXy5e2SZxw7}8)lakQC9ZWg5(5}I*+%V_no44lk128!g3gVNB zxeaAW|0FKryAD!ClC?zGk^e3Aj0pv*D%BcW?tLZJGOTSvkvPNRQm5_~&_-+4q`~Pw z+sBaDN7<-ovt89nQeI!;V^>!WxKXLEd~52nlKPF9bo__rE!X0@I*>U@1&ak5X*b2I z)!3qYf^TPjdJG2a8wcL&GnO+rIG=l+{G^o}w1HC*r0JF3LBzO5jyLMsNosU$`x{clZFbFMGmpjV{5=jRU2Jq5qv18S~;uZ7xVkb(G$#7 zvxrZ0h&H_~OOLGi(` z;~m?b7wNBgURobZm8FMj^_>zO8#zbg5Srgg^4JsZaAI`Dk{w#*hDFE6HoCRSLkmxh z=2fn}eQ0cB9x#rcs9Wp&2iCZwC-4^X1m7vQ(z94#A8{VafFYs106y-eP+s&Dt~t@M z#+q1XZp2+Ls-fMwj4`g?tmnr910_D_D@vqAVZY~zw8$kc^(I6SbXx)O?vr1w^5I`g+O>ohVfdsyc zCWlCUwvOXKwsKBOTMl|II>cAv~+j?pZ=VZ2M)2$1JYnN$_MYzeE};{D~^G%MN-7dx9LItQzBN*v<6N!>jf;I$|Ki4t3tKSbZ`= z<4C|mv{K#E)sUX9{(Nt?t4VfOBPqne=`x+DG;MDXj2h#r+Ja;{Mzm~#+OS+<`cLND zIR4w@WCMq}t>=+5V$;W(H&V)csVA}LBal79VG7!I;X0i_i?UFd_ST+ z>V}U}et8E>$C@{*CY4y3sl$!zhir|`4kQ+i(~Q^5^Oi|DImN|j|GUNH^wLdw<+^*? z<(y?cKkff8NtLaOnq~85>OR1;RIHp-WEL#=Iii-Is60c_?REzKIicG1@?D0*yhi3DAJUPvQWd8w;t)A$bEJygvb>8_ zMfq*3YQMQ0j!NGz{amcxFK(nh8C1p7KU$M#zDf>oeqbU`%XHqiwbSfj`~~RvIaPf8 z|6%P-;G?R}hyNs#ApsI5D3Kr_Q39e-jE&U9fs%oV+<}Q=5siw1Mky3+5oTB_NYY6( z!*!He+uGJve{Fw#ZEH8%Y5>J7K*AzK+z?z)tKM;3aDe~<^M0Rm?o1W}_3i)9=R@Y+ zbI*RB^PJ~AYfW-$=mS&p4W`?gPAgHNAvFNbVc!%HaZ&~6O76q8LIGRnJ(!ZRhMmQ- z-NJ;LyLGbo&FwrePuOdmgP&on)FRTjpENR=xmMfEPQv`3uzpTD$sEN89jFWCNl2re);~T%OXT=*FxV)a^Z3=06Bckv^cahb zV7C5Ee%<44i>ATy*u}HoeBW<=;%hqQ^hYM#LNe<0BPtgByKeT))F2Iu~md6;HqeR_Fq;Oxv`j`fqyhQ3c0qT8Px&mGpBn&Miw-{m0&SnWe} z0{(j-KZNhuGnhF1<4tQ)==EU=M@uLs{P~QvDf!HybFHu!=7z8A6TUROGzW-UnmIQ- zJ3TxbUe;^?a&|ud^P~ipkb|N}*)P%|S>G|*wYnTa36fNIC`5Z5yN7NW=_khLm4l+- z`xGjqT2;R)kMaB*ox6hEB8U~n9eUS&ytVkB4rF8(P%7rkeu^LBX!I$aRS*bf@pl>C zyy;d9ElA=hh{1e-_-}S4*O6P&rz_uj#4T>rm3v4>7FI9|A1OApcM|+G~ zA#EUU78~M|cD5bQR?*RH$>}*p*nnA91{2N5pP@Ve{g3UAZP zt8{ZwnR>~iF-zcef8^GJIaUNnUvqFuUYV=z9x}+r{mbtK_~U`|Lx+yz#;mFxmXpCP z6?OHU@8Prgoe|t=D}9bZoP*iJ{|4nVkcUA$Ko*hdk7PPHsbp1fl+<#j)RGJ1OYXv4 zNYS1*7Hpw-R^vfWNp;|K>;37;zP?yS(>vmjrC1#Av;se85_czJw_T0%b`t;eOA_~k z_du=Z{z9R^oz_i)3O0j}#|So-3zHuZWtQ+Y0VSp!BN|rO|6zpWk^59{-@RSFD}NZ% za}sl{D={!sYP5zYvh`L+LE@v(cIdLRX1&#Mj7e5qLBQ4bSNNII=ZERsjvwdsgIEf% ze@25CTE?7^1O67KP~Bd_&OeaF8V>{-VQ1a@Lh>~R3nJ6Gt8EJpzfV4jEQ62p?2j1@ zVsR2%QoIGB^DiHvM0gO_i)JXKCPH&=!{MFjbdx#uKI0?LkI7RWFxsaz};49ge6v*~XsG;Xx};4>jdjKj>Lv zYO+LZJtbJnNbb$5J6jjwTG9F5ucbR}OV4wyyOVYbw|40hjG*ovihflutKC#Y2YyF& z(rmVC-J(3q&2pk|%Et%|#z)<&+oHK1|2p}(%p(9bs6hPHW>#P}39ifY7q(ZpCcSu@ z-yAlIlPaac{o>*?=6Y)0N!ec!`DF^&#j~04SMC>s@WLqzNr1d$V@|hyB9_yda;}8V zYh!8l6z}rMRy)j@&N)`mZoMf%z1g0*RuSwI8^a8T<^-X|W(nWIDg42=8-RjU1XV4g zR2$2N21RT6zDab=HD$NJSa{{`@Qv;Kv{`$8Cc9jU4UJc{F9R0K+cpEP{o&xXaaB8w z9i?cdN_MumKxgmjZ4HmlOB4nek@BE&^`FiOa5E_vm6+9^)~-GXuo#hKi^^}+5G1j_G=gZGgNF>{`1B5YbXDC zgq>pZpL6u9=0B_PIJO!rD_#m0m5V%}AN=_Gfv~7!pTX|SUo@nv05W`49$=d<9~OTA zOI@Ba7xlGeno^=Mlcdx|8A_@dQvy5I#}wY%>Qv$QHwHTp8Ts5>0_i0KgI|^m^kYH~ zHj#Bw_^~q62+!kOTc`qxOgBPvdI3G7-DgIvIVgf^=zDT%68av!OheziPU!P`#o{S~Qw0t!jIKGj|dBP8gWX}UxGc;d#vSrB?D6!Wl*R>3CL}3(1 zCgm`@^BQQZ(AHT34bR*w!a`#b%56CgV10$oi@n&a7wZtuU<+st+CPcqYUlj zoAXj)`>jt9xU7*&8 z4ls5F&J-ntTwDeOFS2g$Z2dY~r)ShUT|gTE2>{>J-${eYc()6)s4ed6_|orgT)F|L z?`THAne^ldqt!4!4fH8D=NG^%eO9ha05bk407CQfyipQKH!$A3B9nT?x$5r~*mR?V z_lj%M^UP7D`5LYR40C|B{4K^R;Zjr2I`8sKqcG-od=ce7jbYszhC8hyfrY)#ioQ#!_ri1SEOYUXx5dfwVMTAVz&Dz9h4kl#Va|o zq#;y|=G2tF@dhkRr?mtPeoA!p1E+B^zTkBK0SnN8vAg(V>rS-Eg@h<7j#rq!tz=n! zrvGS(b=6(+ltmnX-BvlzINUNEgiEPEg znf|3X$}@47whe519-Ojm)`VrUytXGG-aq>RB^@BlR#n9NWr>t2q?nW$lWJwD0zpFx zZ_NX| zT}f8hhz2G{l<h(kIY@@c~-d2DuM+ouv!&SE3ir)6D#n1Vg=0m zOIR`M7M1UQ?ICfuHABCa$zlrB&&o@)Ch9apE$}Qysx?+8Oiv~ZmxRa@jwY@|hWWhp zUQm9ahT-)*L7JzbQGEg7bKO=i)^&RXe!lP*9`r}PS28WUVk}B%(lu07Dvl8JLwG$@nNH3q&#b>1_1l#d?%4sco>+`k(G) zWaTKM7BJb-wRRcNB$0OR=w3!vmNIIAlV$2unc(G;e?lU^U;1Ur!joUEKUY^4s!}(g zqKhOLgvDDVZgRerbrHLvXJW_LUJ~EwE%Eu@5*vC;{B3WE_e~|it}{DI`s`!H#hD}i)7`bZSkJ}ny0#@sJwoN6sIb456aqo zs3>)5tIs^GA}nfWtJ6HI`(n#e&kcwx6<3rO7RAuCk$bg}%Q=`T(UiB8a2A1^D$Ja( z+31_)fx+`AUVV%Hf}%|3VP;w$j-S#>0GeJWJ` zrFw)||MfOVpP7;zCp!8WI2w)Pd1+5@i;t>OQ+(&8#vB!A50vu_z7V77<-VoQCW75x z1GQh|b#34}a#&sXqc)d4bmThM17hmus=ZB+QRs-z^}rNhSX(-JLLa8%c*7}QKJ1Gd zKmCMXMqz#i0b6W#vV_xDUPJyfLLCJyA8x(N;5}xtp5#2$}xc@1w%yHd!i>hH+ zPJh<}*YfDAGIHd&US^mNwaF1Dn*9r7L%plh%Ed-}tmH9MeU4YW^(hsp+=lxar9*=I zqPcufb>_M58^Cj9S|3lTk>`3KRo9wl*LrnZNslV`rk|wBX8mDv$|xzjP_>pBeS*}) zfc}?f<(%XZ9)v}8en<3$BeptBB>mfH$QQOX$Wi0+wng7y8kwRBSM5PkR8$ZguHx-Y zPhDDI7GKi>mokB_y6dS?cUdlRssoDcp`>MUZrn%)!S}=Xjb6YX^bYfi_mWgUfH!xO z>w!KhOJD?s_pvh*lk*ue8$B~0$dhU0u@J*t_q`@>HOq#Hx{d3BZ93Pm75FVI8>WND3WxM_XjnK{;Q)@Oyrk=iz z(WNYCyp;|t*m5gQ0irc(B9GkRdf-U~v1{~%U+=2jqMtHcwdczd6I?66C7_D=`qscj zdNl-K-xjdPshae16VEk=^^Ax!hj`OE`jiqIN`@?tdxz`3-;x?SJi_(BFL+REW4nMw ztF&Mt6ue?p{T!Rq=wfpCxoIu)n}k9V_h+{k;9~LCg8b4)3aY6V14*tQbz~D-;5vSN zrNasccgd4sX6XFp&dn+L{?to-@hmuk6ov;7{Q!Yu@vc})Vp9?K2S`(!N(_&>Y^tl< zAUeD4sMnd0UUwAo(d3R2bD!jnlCbeqnb=WC1-jR``eZfU$p>aGN2d0>Jckam>u=^E z-V|+w`~&_ zW!f~VV8)WD;zOy{GzLjG-sM@rS4XrHycX=bwQy^6th#i8iU=>=eGewq3%jaUqKi4p zig!hCmmk4tK>qzynw+f~Uhp0%S>Kjrl02C!zQ^)p4qo*g`9YvfE2}O*t4mWovOXM+ zg7E?zo+n_tf5*=Eo7IZcLEntL<*PI0AVqV{RpHp|t?#Rb+s`OHGl)@^=u<4dGr6n zN6);G%6M$3FEqX&Wyz4$eSBOSylNjFYW62D`jNf1-gs2ZAu;{r ze-NejJ2LfjuXf0}DpqP03foNOiEt$zLQz0nn_u`GpL@^{ckC+Z6Zis>p^mI4=PN#0ilMAC0C134UG`}5t^gtJoq6c~fPvg%G%y4Z$`}P& zTcq3FhIu`opY%k<=;q0rqd((EhIwl=qMq7AAI^i=;W_l7(^Wf2J@j$a9$}W*LZc+L zZm^^tPQw!XaJs9mFKQo6bt%*j| zv_2mF6`7gCKKysa@@1}O#BNO{xFn$>HiLwz{P!^$v?Z-)pXoZF;c86>%bEtNPFPQs z&~-gyMN+9x!p(9yD5@}bVm;h>Xj_jVyks*2EN2MN80MSO)j+mvvFP9AIB1MHBw&eI zF~%r<-Wt>{oIB8GH9uXhWlv9^$B%tfaYI#zV2%6I$C$7J`yRRisS z!rQg;gw_3PQG0rod9FS@DsY{6-F0o)Vl7`UyA?b2(8~7IC8ND1cd;YTbznzO88S?^ z1ViMZ$v~P1zAr*!o`ls71uJA~H{z19P1=f0L(@~E3qE6*T2Z^Sc12G;{`5jZ})(RAY1^NZ4PxvVDnD=?RtBuSC%(SSm?N zi>7iP-9;)zFM_Ps|at1}LarvAwcCK=( zn?mYBF1YsPwnxNf5v0h8K1WjxN_Wm0EX0HsR;uq^bmOeAAPc&FQ)P7qMLq8A@|`0O zNC^nvUt))dpYI|=$iQ-wp($;$uF{4T@DptQ@_cA&AaaH9pKXnheZ`F>X^Iscc-cDk zoPY$Thww_7sbID>Q5DXUx!YX*t(4$7)`iLHK)G_Q5y~&$I==~}j5Sm~!jJzez}bW; zwZr;?-Dh*H|F%zHU&%@gp*N-ry-}&?4Ml5s8p^0GI-Iq%W%URQ320)AZ*r}Fz-~xb zt2~ODE1EV1o`!1G1*B+OtaoIB(UN72C17!eRYM7r!&PajtN0t8${R`R7=(|vwbMxi zbJ7&>CXzWTx{1n^NX|_y_5_ZhStKE`X-Xt#!)LpQw#`?G_(|7SwU%3xq)Xu&_wm2o z`V3xQykfVxTV&i7qHL>V-0cVq$D#wEWZcumn$MAjW#PdLt;4Ruam0I8 z|7|CFj5TtSX6TEIbPuXGUV26n9R$SC11Pv9W6sqa1MR=5P3~ znz!dUxt@Pe5t&b1PZmMOcyL1RV@&&6V;qSJm0C*~<9F^!j4`cqjOU-a`KA9=^F7D7 zX}eTDL!@cJ;(U=*51ch zt;aalZlveFl+ULeW^!L%E9{)azWgPZU9~TzeCNKLb?Q$1!QDG@_>Z0Fu`ds7>3yu3 zbcXeuWH-}uUuK?ipox9?{hxPP&wqpx>zUcPo=Z;Me9L9Muji?o@421>Ptr(^9^*|X zX(Z=sjnRC#%NTe5FfqoQ&M`jN*83FO&A(OJ`xsB%e9tjnc#=jk^jY!)yOEwSE1yp} z%p}bI_GevS_JbN5W~F>5%s$@Q`$+9h9Dt|R+ky5UJJADXJtt}AT0PeLPtuHh{(575 z`lnsS`c<_(Rw>^()@L^NK32OEegE4|^cd^RlQc6}kM%b&-g=u-`TX_9y6q=j#_CFp zRmyjcwOt6-UI-Pt6T|=8PV^Y-{F5}3ulMOw-|T&(vsQQFO4`d>9qoGy&d8G!3SA~n6eN>pZg?%g|2(y&bjZa{UXw>6f}#al}J1tnTW znji#W(qUox)$E{iEjfrkmLLmtyZPp8*4_icRpuI|^C`w?Put+KBwh1DOYak7Z|k#8 z(m(n9-}Mjgw^l7e4c*0R8A{JCLgnj!=!P2Zt$}>eej4g8BywOHCaqbvp9D|6cVN7J zYCLEufiFc2q%ik9$-Ibun^tY(PLeNT+A_KN8h-vvzanx;YK4h1nZ@l51*=YdUmtpn z=0U%^W9cyMFGtvzJ3R51#hClbHx0)D!`-nYsM^y7V`GeS4*laL~&{bx!WF+Vh_pLYZ)HuE7~!4kTBF`8HkDp{Rmq zbMp=ivp(P^uJ4q%#F9*6QFddr%|&+R=q*(B0(%U&-L4-hG9>&+K@qtO0v?vA-)9QS z`1OaMD9DuG$amxZ@G}J|^6dKS$9_i?4pHZPh|VeTHg@<5Hya%XjL1R^0gh)b9gUR* zb0E=qR&#gu5!bxl!4AB_3>?kB!hGT=9MzOqv+=?whU>2fd=AXxU-86W!Ue!LwPLN` zeK1g10ZXiKhq$Xr`foYe`bvZ#SqG`2Shrl^J`fl~6%~cgf35Or9lMnGNqPU*F8`*_ zJT`ZY;r?RDP{V;@;hT#&ZPByYraKkm%hEH}@X6z0Qk<)@D0=jLon2%cfl$!9MspbcqI9OEU6lC z8tv(-1619yXsCuq1$o_@4#a%YDh@8U$*LlL9SyuM&bcDY+D#2Vqt;H;dE9TfLg%o$ zC=W%ygpEYP;+(1BS*&nauQ0hN>Ixm@tKa-Ix!+Zo*mv0g!3^t2GtaYt@O?`sV-E7g{b?zh0a&-!aCzZR zV)}^?B%WJ?DABed{(h;`!9f_9E)oRa<%%a+XoSAnx8zw#xs(*^{$aAQgfFG#TSZzq zlHEDG#k!M^@VDZ*SBI6^-w@uzju`qli4Si5LA-K_yM)cL_26T%xKjR8(Pr5#s+=H> zx9x!q6_J*eM}C_{l}Np=pEt6f-xQ9U*7ywUqQsjrQ3%ntS!vvP*BqQI zrdX>5-;p%(PMA!+n__vfx9V<+_23U|Q>-u#sK@yu&Jkq#`leWets90WJ8$4}1N}PT zD~dSk>i7=u?7YB~__WMrD8@QmPobaF2#+nsf^M^pfuhYecusRdhvUHk74G+f!|dX* zJWo9Wk~seJ;oMdq?iWal{oR9`LN&zSsatR>NV7<}OI5~OiNhlK+ldbZCk8S5fgOlf z4cj@97&44lojPgtpuRAk@%47CIOVwl{`*v;qY2?)O7QKekwJau*1QvU&8<0d$h8z3 z|5Us%^)=kh!A)WZ<-@eWw=UrZX$ktV`{RDcE?;r8udXG~gcSh3^b{yxjHo0?iC&2+Y%t z0|MD?@!X%@qZ8AC_jWl*y7>Np4tN?|Av@t-%2MZAx%EXi%tZIfetz(3dDd-NE6)=s zY7^DRrzUBDI+MAO<@&}m`ghV={d?9w)URqW`Wb7+Hwdi9x_ll&P*g(jhSJ`F9sRGn87`g?_+F!Je)8e?5(j}u^OLES`=_E&Ru=Pq_ z5(rxuV1w}9F)=iq9uYG$V{hOsg;jb_ers4PY@C+V#Az;;VJO$})VLtZQV#c79^A zQKZM+CM-0e^)ECBjS`&~8^ig3WAPTkxTM8%e@}V>Yjv4hA$W4U@Z|Hl>cW=6 z?Kk&$&BF>FtiQ~F{~nrf4)=FtGpS&oR_6eDVIIBpqZ~Yffa?c&soAnpoA5!m6@$Pqj5p??9R^S=VDFLZ59Fy`} zlx!1;Ic?|1e!-Hgmn{>?euy9Kvm=t*pp*U}NtbYftr3sBE}zzZ^BA{c znH2ruT0VHt*qni^j^B9hIrIf}?pc`lK;?-}cv(_V*MeGRBYGZlIZe0AGs~75t>jI) zDTqu;jZRaawktvy&jn_)a?qN@1J+ycFxiRA#*0w0QMu@lO03g$IlYHN6BbJ+&DVlX z>o2;%6bh)^db93>?rx~K9`o-~XHI@R9*|(>Mpbqh&)6v*8zIz1TTSWoa**J^8~Ouz zb4xvW!Pkl#Lu+dp{eUHXOL05MjprwVsAQsX{b9QUfa#1cqoPo1if6qv0$~4%8u5la z{I~ofT-i$)-74oU)l6$miE8Gz?IH=i=FjR$tpYnh*sHvtb(04@lM;f_En*E}iK0zg`? z@F#Yrc_{RZnh6{;@#SA6Znw4xz>09}k%9&)gQ|LrA2BCVIMTYPnM813^xL#A>*Yto zv*x3E$s5W3n45Au_vsqhaL(NfPBuy<046qUb3{N_X-&RWrooHYEwrLwdJ69R#8!;* zRN&<%!zYBTBKYG8yHDrCR4UK;qQ*Ae4`-oLTwBdSaP?UgXzm=ttX0w1nb2FM&4~Sq zc_2xjNpaITRrSWX9wiRRzed^%JD=fWtMfq;`=+NfwmR?QNj4<~-kztEb93MIV?MqydUjRI%7y@ijmXT?St<1n1{^IG3`1W z$ELZQMiAC6q$jvsDBk61c!;{K-~R!68eM4Arpj{=EMmetOV9N5cy3=hfx=WK!nysp<_%*|@`gNq7fXEc>C8YA=5OLSXc#Qlc@&~I{uuO!Vf3%bui;<&Em}9274+a~$C}PAi07WQf>o6?p?BCE6bY#! zvS&Kw@A;P4O6op!kH^8~0D>g@ZkqEX47K99=Te9EKBKN<&&zUfwFC71;`~Bl9@w{j z?*H29f6;7IIFeS$Q>8iG2Np43EGSu8<&|zJpXjO>EUP~D{C=(a-lNbFz301+>B2-! z2^!NXgn1CoQwN0Ljb!@Jlce|Wo{pT=zUg?bA(}wwqv^y9C^vEQPe|E?nf!+cS%~Am zD>AIIX@YHc4G^u8eMaOywXdz_Y{96my8Z$pBt9&gpu$dk$DtD+lf-#;;#v}|{@7TW zyS?FYPl78v7)yG?6I$48{5&ChE|Tqxai+H^(?GN#@cyg5hj$#;1i4cZIC$mK3%2zk!9u5kUu=`O-YDk3qLcSdmcc`?aoyz zH^f%wIudzEF|#vyTCin&SWl*z>*t*#cicDm4Gb`w7c`D{wAo)JeUYS(G@Z-%1wx0k zYS%qdS)pXcm5=NLKlSWR-ck%G_j?=%0~S z)tPBO7Hv>-^N5D8>$zHo^Ee_EV2w|_$(XEfsyFQd>4#HTql2!xhbioh-0hITn5~g( zz_D2c)|cxwl#b!6&k?VlcwsQZ8~Gk~>m0v3tr|YV$St40HwW-0lBR0=A4O$Pm9EYh zUr2l_n!BuJMc=Z^HoNZM%S-jd%YwJsr6*IGx%bjZIqJL);95V%GAXc%n`-OojLTY9 zelDfP+NH8poBy$hSiJW4bnH!3>DrKC`)gwTG47I4t}CNiEHeu-t^U-?hv7ZJ^iR-B z+Y=LPchou#4bwTd`_x~M?LYD4PqW3EcIM-vslg~ zj0Di)cJB!mdm{CsEX+4FyfbVAg894FP#;|BLD09`2EiDsBAmlRe+^)P5Ic>ur#sWe zlSWX$h$)J6Ch;GdJIK4$({wn4C>3}RYrN_>a@c#hu6^_I*bD7 zE|$C7z_&It;413x!no?_g6&Dy^%lfh>2P{xDT-R`=-h6+XXK6aPcGD^*JM!YT5 zb~N6oCK;;Wzn$anoGx>WVb(+UCg*rYXPV5h*YQw6H65@iOF?;>X4Frz@8>sK^or!i zcp=6~YH+kSoO>^(68OcDzr&aESB_}NRk3Lo9uw|?T7mn)0m?O-?h>=66y2>1@Q1!x9R|VOMS%I8pu+fyu%Q;Y1`Iyi_SuIA> z@Le5S$Xq%|$6<1hGb?f2n&lq%V}4z={{v)|4qvcbo=@X>Zt3u;^73@{mFmZ--*PAN zhN4pTMf`%Ar$a%Cc3hdqd_IUt*weYgbcW$M`q$Y{e#ucH7jmU@?-i6ze5Y6e`JEpv zQx)dE!>?$pbFfHucbed!0_r_VL@bN5xwh!#Cuk zs?(e@C^%9&I8x^yK3wvvK4GvY9m|gj=`C5(_#}Pl(v8^N4a_kHMejxC_4RV{hmJ2; z>Ea=cC~%(0{66K8n^UP|I{yV7mB|%JO7L977#J^8#LE~Ny)~8l0U^HzkQNqmKa}DD$o$vBP5HOFsedRgmW8c>oGS5S3#s^Y(aBsbPBrhw^lK6C= zL0Isz;tTiIRiE;3cc$cjjZ^}T$<~-c)cf&{3=O^Rt-&0(b2+uUe$|3A#($8{et)DT z_DLtfB16o#9{EzJRZVAyCX_B^yutI7EtGYgM=_N~skHvq9t4tcXC80*^OVD-I%G^qT{SwowLsjR*7jodsj~aN0TA zqdb`V-EFJh^{kh(#AsN%@U(3QjEn0N4z`;P+Eim@Ur%8(=or%$Fc&68G^DKJl6ap}BA9QVczo{d$P3;qb<O~ee2h$9gX)R#Uyj3lZ-e>p4|3PV{Vs2#IeC~bVx-41JPy2&G^LlOt~lT+++|d4 z#c_?NFufiR;nZt%j15)g(}H-dqk83A9UhoETq)MwO}WwFT=B(s-?{DuoZ8{AoKE3* zoPHtI=+>`HI<=qhoYJYJ=XY|S;GsP{BOM>@9QehJ-Y`n>;0rl@xP%7asDy-3Zo_k@ zZ0xXg7&tt^=Xg5X^;AB`Wv^+T`EP(dTk7-xozy(@ex~y`*#CDj%RBQg>dZg8YyKrC z$v>$xzeHU`Gp11>CY+Y`+{?8w^m0Nk@rN=nC8!}fMc`19({wLoPj=sflLja z3+d&LjFNspqJLx^LyJSnnfizZ_F3q1kCWm}mM{<#JN^-@uTTLWir?HN84c&~CFa6K z!AIf{06P8v27*1;0floz7DE}g0cFdt624D_P&NAZHv9Ku`SnM#5AaL8Kf*0U$})-0 zSr~8hL3bUxaM9-x&&Q!d1DEz`;3k{WQq$xGHL3{;9UkCuT@E+)VUOu;O4q(utWV)t za%m0rrL~M15Dd5-Z_H76QP#)W+2wnTX;9w>b-|m+f&SDbPiry{ZYCe(10MVSN}BL0 z(*3AVgIL{k$rHv4ixwy)`2kgSJsHX>IX2Y#c9)93o2WP^oCp7~TUi_N_Os3=uxn)U z8L{Ek;4VckN)|N{o+b+?+l|3*kU2=UyT?wDNjb<=>p`EQ-9O-VNw@oGm!j*FMZ2}z zW53BhQ^G04O?lRLz_mHxg3xHneAJCh^XNWg2TP;#ucM5QpQ67PeXZXNU3`#RljENQ`i{O zwkzQogBmi*$2J3fOR;OCa%FIxW7p42JxnqflW48O=I;`W>E$Rm2&!yTQU_nemmcdw z&{U9~w{*yg1M#h@LX9xX3x|b?@tW0fkz=sn%cdi`=7>Kny_c{I4V(V)n;$6@Nk>4D zsxSTRz9@u9+=%(R1Vz$|L}wGXuLM$T7Nm$YT_MGQNRI>`YPhgoW&^3!@hBeZN;O7Qfx129W>q2aGLs?o+-}*QQ-gOkG0ijWMz&=%z|A{w_uo>#0R%c)l`J#DwmSSg%>BK^4=OXj+ zbXcrB!NsmyC`22L!iQFzBCBSd;-{D4K`h<8CQC?vSm+Cx>>|majAIt!;;VRzqF}FY z=p}pILTc<@fM&T>|$giX)MDHE$FWl@o=tvFpt?rw%+S~8l z*Z^L!vaIf#?^*55e7C+vCM%Y)S^aWW5k9U32PWHsZLx`nfT)6bcoZTpKXhow(oCv} zOv;zI54;VamdK=iJ?fA!$4%}R7r}&zsP%!z{@%|ZJtB`3$O3W`gaBR4sd^V|x_7Y| zWN_MDzm<#H23A&yXdZ8Z5Cf+hp@v50G)4TpKFnZKVz;lA!^#Sw3JB%>sH90HMTUF$ zpQck}k{q%__s9DOC6N6*Ki~p?g3oQpIDC(?pr-SOWHiF}s136*k4cSpL=bLk(XkQ9_bu@?-yccJP&V}|jvn)Nfz84MDgf)&# zL!NEx&UswMK(8yecZ&d@`MKp2oU+$E1fGJt++n4Hs-kDmVSnVpl~;0;+h&-kWNp%6 zQAzLR~i&kh&JgS~M7^UlJM9&w|ec@}rFY6-CCq*8e zW+!e^iB}90;gVn$%lAM$9=C9NvP_C9?`f2QDnBObv{2Jyqg* z%1Ct|UYc9DlR7UQ?s06d?w9U!yyPp~9y~zD(g-w+2c^r;T6>%dsxvcv4&n#!&AcMr zMv3PNN*pRE5$o(gx_G!&I5Bp*LW;4h2EmF%L>9CdzMOcpb2DR(@J*TcH_HLjskXRa4?A3J@$;QLtCdOfuDGBkhTD@-?= zJ7-#C#ra>ZlPfDmA@~7Dow6y-SNKwJzktRf7@Qzb_D+dN%0@gS8-QI*b`GsFt?{IM z+5&4vVh`jzEZM+r;(7r85P>|P*2`j+pm8MoFah|vI+0rs8!u^)O3emBD4P~f_#vE= zuNBwK!=BLdaqAG4n8^j z3%U?iUDzLY9K5HE%xSK=Bm5k64y|DKyXrpXWrN@>CiQvF|25|1^sw_EbJ=Z^GsDim zsD~_kW6Q&Phs{5 z8U_C-f^ zBIJ@oVdt9s?yq^>UyHiFMm&|C1_5tWZ60DcM(K2ACXJH{E^zzfTq>3kzy}b-0eLbB zPr(Fc+)m4tRJK1}J%^tb?y9cZpHY{Gm{|M0sT@bio~857bR@f$cu({#@t)|Me(&15 zgH!F^(HGS_$<2 z9flc7OzX|!qimL8ntEcl1kMPR62i|Kp*FH9HCU^_+vL#WN#;1lxlXFeQPHe&NTuq$ zPo%%5@`Ms2pCXM-;$w+)tR^bR+WMES#~|ssYFVv9{M+fY>5`4t2lcB|W8I^lWpOy) z+k7&lHhlH3m1&TkA65#2rev_LlgyF3DmQ2_a7HA1>6HBe%v4<>X6+}Vby^oozR)V5 z;dESC0u9M8gVmSTe4%AG0P{UA0MU-0D#l}iFSthl$s^^*`^|xV_b%c~;=&ZY;jsWZ zj^+a+e7yXb7f{?sm}0Wo!ee4CND5UkvQ~#bFsOYP)u%vu2PH8h;7e zXn^&a`u=buGY~6Wixd$bj~57m6fq^uFms=S5VEdeuThQ8aCRXd67)^}9@R4YPU~$# z#KuPz-=zJ=$4A{PPp0!hDrv#a1b#q#)J#c}d%v0e1JXr_Bs-ovh15{CkX=kDsy@Z% zi&|$lT?%!9jW{RZM$8D;JVyUQH|M0ZdWOjYw$=y^m8Z=$0e&WLuIZ2;=IN11EMB-q z5VEGwRxtu-z>uVX9dzPU8q@=vqdte%H}Y9nFsL*-8w3x8Ln_Hsb7TF4V`PmkF@Umq zftd%bw**b4bwJ{||Goiz>+JifK@?4{xKZ>#)Rj-f@9Wy+xVd?xR3M3gVl%r+8Z+DD zx#z3A+ekfwYt(*LIi5RO(n8ZRPtqoWC}l>$3%4!)UxqSUx~n?)0(c1?`ej9o21_=_1h)-ZJvG`t=|^vw>CdS%Z>RMdM=+~os#6ys4O*I80>k7i9ZZ?l zGMOWrK<{HcPQf*t=CxxItN06DJh6&_Lg9}zKBS}GC%#)4*V&=t?UQ!Vvx1zX_fmmpyC)T(T= z9+DkuZxZ&v%_PfSxEXAd&|NNlkprz^v=Up-0qfqZmU|*O!_KRu9kk*N1uj~->%y~> zFmth)eUWMtm^pa8QdT%ibn&)X&p_S8b3Z4|hM5M|n!B5I7a!DlsrRi?vsJ2JDnQ{J zqw28NdFR!XPEV6yg&mkk5*GDPMRV!_ca~QEOR}z z!Pvx93;V? zrgI}CiBYwM0T?5jThL>P9%Rb5gRkB}Ckk8@alRoBf|@T(#G(`+gzLH$H%|?6a#$Ne zkn$rHpoBV-i>zS;zU5LyUaD}C9<#mrowS2{hHeq9vTt(TEDe2?N<^lw(gL~Gt`8IB zko6o$RUB;$_k{Kxi=}%)ZE4=Hsv?#V%03D@i$^?3)+QuJ_7EA0sn2a_L?H{z8d)6_ zd&&jz)MW7zcKUeMG|3~(N@7eJ0nP{X*l)zqlp)GKJ43xioHtCMKK5rH%dbpCQ=}re31Y_=RwJDjMIsiR%D}jS%>hF^?IVM03qxsYw$3|!CKFZlvj$N0} z3()EyJTtgbbIifK!M(QlJo_A$&>>N}3*q2eY@MF>n;F(GAb~*51LG}jlqFZZ!{|$9 z-*h7)z@F-H`(L$Xm5F;!4}axFSR8p8)-Y7r`=40_)$w?>J0+L_WOHbwRJ+FpJ^sk# zR8KXYIWAoX_ZsYbe>FdB%DA-~I#mvd`giAgg(=al#4DC(K#N?W|KsDy7RTuZ3 z4fTj#l`jw(LvHsI+9ry7Elb=4>M}xlER1xbVH(P&`+HdhJ9=NVL<KBskk2K8Vr@Z*zqGw%3s*u+H$m2ppIda#8z2O4QucjsuCidZ;FjQVRvtNK_;o^ zp8toW3SaKNf_+kH@ph}0^8rf$0gX;&L^*iCSNUDR2WtSidx%9hv=d--*+n)O)upgX zAT)o~I|4eZzmP5LN6rifccEYl=G5zHkfAfY&gi4oEWuMu#0Ao&h}0rI`g|3sFbn5N zGnj_+)1_y)RDWI8XCYH;G`&mE`K#TAbsSfGRFnZj&~3zsW=aNYEzqTuvkj+Jmn+Yf zY}^M`ri#c?hh&>4n4of!nf|n11KzHl7V)lvU`e0C{YyU2vEE#cfOJZ_j}fIR363vP zkIO6ppq_pJ0BU!+{glnhF`4cKo5hOT*1IQ?nsCsc$ot|t_S(-&t(;9z={ z_H=j({sQk8?@4CuD=YXZosu3n8;cS3VubJ0zc@xmAZ4QMf5f@s<=6=5jlh|{s`k!| z_ekMHe#9-PNUoNKrVJ{N%=v-nbJ0~%F)Lz3?8hHAakh*W^(6*p!nTc&sm8|tB^@cq?v15)+(@=NRK z3_Gm)X5J%7;d?WwPboiS$RvcPWKN5uuY#_)vr#t9&iEkodjjVQkGE0`y=6MBO?ASk zomFr(snahH4||$vi$1Fk#_W$Tr8A|Nhe)BT-Ie>}{eqlQes`sHKgE1a@3UF5zGc<$ z!q#x3S=(AJPzM&f-CY@dPO9m-WvX|afJ@l|?G$1QTzWwglQxo~4)w!a6!K+L_f!1f zXfX}o=iX@A2dsKCjp#Wf6d&|P=BAR%RXadtp}NG6&sX)dEOoN0?wk5CZMLgU)T@}3 zfSQzT*6W+3WdUSYErxmm)c(Slt9BXB)wmh2{k|04z#mZbsIkupuFWa{ZE%KKPh)=0 zHW{F_z<&Ycin-zGoR4!QUua{VC%)P5-gh^*QX+Zeeo3mJnq}O+ZEi)s>Xj*Omtt>w zLdTt}E|EQifg%*$CXL*F7ExRAX4xkA4h2{3toIHpvi>AgI}4g7!D-%rB!zbxZ{gQf zHyoNu++qGx&FW5T9@hiIystp!R4~FmL5MXQWzy}ypuLjDFJn@@{pZvv-<;FJa!a(%rE?2jqcV6J2l1-%r+nYSvvWG$UYwkc-xC7LzPOIy{AF9QiZV}c z2y|;hVm3e3KTXpWSSy^z6km<&WT6u(O%P#r8j_v5MjHlP<=eyA`(bzzI_w$Qw7N_0 zP&r+C)n>t3d(=ekw4S8>gCQAKTF~#U9d+;`{-2|;E=F0mmv!1oEOjiAt~egEM|hU<8UH0o>(hHj_}H6 z@l~;>xB^SSTB(zYDkp;4{82scN4H=S#RpTR+P-bU>B8evtTr#65?GSr+C zI&{XO&%`kJVZ*@}Z)0XcXC+5;R!|cGQ)u57H6J0#2RfX$j7}o;GE$&u9+N$OP-8$> zEq0bEkt-b5x{dIj4`FI90z*mo0|{)i?9hZy&J*EXt>{zL#E&vE+XO3eVJ?03JTu54 z*x5M`N*MeK2wAC=RVQbic)8{Vbe3dnNatm4c-#;`2FEe+-0yk07{W^UfOgKOhJy@Q zlf8{C>ZH!?q?Xm#tj1QhmH^*K%s)h6`CNz@@J3*`3g4~ zFB~!oVN<+nJ>1-Tz4N4AiqD}q*hY?t_nOrBJzVbXloxdhOxE0wAdox_Ir;iTd6Ju4 z^nYoyXLkomwLKG$;#@45sD~Amq_tnNF!9_M(9*P>$6DAesE1p+ME=(C4ug5WV=R?VpOQ)Uks2@KY+_wvfh4G&G&el8G#08@a&x*ftp z+kD@mNDvi|E}T6OoeC|N(^^&B#$}gSn@$rr&HfzCfOzf-)xVtpXFRu&XO)Ew_Yz;N zyVS`7t3^~?U_2w0Anwo~1m{x0-$mgnKI$?`C2S=X+dunZRr5JgGg~%?V zOUym$!b3+--T~vzX9F$wu&b+@;SnK^G(S`OW>;VwQ2@n~kgM>1Jq>(x%nglSHX%?t zxAcN#fnwz%!#tfcGDvtX=f%`x6z(>fzH)THIlEo1a_ABZ>nJ%Mqi}dX$wr>o>)m-Q zbmcYZSh91{-(ZyXhu}a10tek9Nc=M5NmX&BB_hEGePu?0_x%i51SEYe|8wdHlk0dM zPO+?Z`iu_;&9=+p^xP7R8S0Q!NU=z|mQe1Ie&oT;&gpu8!bNrQ$Ks^xGxH58ool`K zQt}+zwGmQ6vCqu2@lfuneV2t^H-SGs^a`$q=F^uKm{O!cqQR8nVQ%TXG{YR132=JN zV;5%kD1BRnoVkp&QIL)p-*+kD<3E_?z!Udsh$10EkC(b}dK ze))3ih(Zj3h1T1!Dzy9`UUwH2kxo_;zTwNMP25?(B~6cv7@5{ng3Q9s__w6x#sIs7 zLtDM~bUU@Y?kqh>HhS{g0@FT-K?t9^w__SYGQT4IZSH3}} zUJ=dhvH%ksHFgd{BxTHugERAITCzWRL2>&TX14f4Q5Evg9lvWCl8%=RX$6Mva zAHy7}7cQs2^bQV#A4-9$4(=ugQmoIHaV2DgbN!{aAAtV{YC4dKmmZ8UanA!ebAVmC zS$zyzM%AlEgJ3=WL8r94LW&t`W~bAjr-21cu|~>cq=j`&E4v{F90p(uWIaUg@~uF&`qRjxMBZpl!+B0#~>9A z5r4R#jp=L4q*_*GIW2li3GovM%H;i#7B-~Gh$C5j%vY=*^x;tvVS$u;W|GIDY_aI_pt*8m%ekOa0I*|GQLA zCYH3@t%rG`OK3L#2E5vNs>o93Tfc7v4NA5S^zS<%rN`?{Mp*=fH9wu~L2;%e~BV63eXN0o>2H4G_H3X(()eqnfR3STm>DX?_&cWH)1IN!>dm^$M)C;onhc6OxcOgfR z!gr9;3g6vJzaa5T{G}Jxkruefx?JP6?^=D6qy9R0P2;P#*(7YA^HueY0U|z(q2@wf zgF|$V=X8!dJIC+H!JHf}r9T>@!P^=jXY6rL;YNQIT!JlFoR}|w$pp}g8r9Z<^3L#7 zuW+VJ&{)hcnEA+!Ab~=0~OGuZP7h;LiB}9gB^nK^u$Bh9vF8V!53?=?#m? z(b)})iQ}6SvDm_{SnRk=rofpvzBv(#{T8!Fjl}{ocem3Wb(2J2Bh7j$RRa@P_8R$m z1z!_5YW?EK3*k=Pzs7oA9K-=Z!^>_uKQ z5)(f;J(1Yk>un_Vgw7Tfdx=ae5!>D4LIES|?*@94e=4T1;?K!Bfbxn5=!H}FVn;mp)k~!pzqWhvF**Sr%;M)!QSC1an0GvzoQ*_hmeD9vLT9FS>&%>FXAXGW2ZHORGpvRR zdZGyUG66kp%?&u&|2q90at<3EuNi;fP)G^5=B`psE(-$I_ z4Z^Dlh3|K4H9Bx$_=0cbivbG_$U~I73ipIlY*&S)JYQr#pUv}N?Y6KVZVT5UtVo5? z$KT`X?=kiFsQUYr`g=tEJ*@s7Y5`K%VmZ~NDFo4h#O8Y8ZeFxs`M~YGj|e|2Z>FKt zYRb5mV25RE)eKvpcnfF_l~^y~9No5NY=X!uD+%^ga_P>0nZp#8N$8}RR_UV5;BYNI zIx^cXx(lV6{Rx%nO|GZ<&jlkCyPj$~=*=0P4xt%uDJv-sJnVYP;d**Y)7zQ-+uVmy z?T<{3$2Pd0ZbBsrEYK3$q@G=Mw?jRi&?h!nbS@v*GSMu4iP7Q<-;n7GFUa$SvDLst zwVThr3Uhg8g?X{*N%xt{ODYOG@C^)m4~>Y&=W2ClU)7z4FFdWSB0RYrmXrHZSExqN zt)tP1%xcXtCm-^=_q%@hIDlbJJ}S>4Q4I*)mChk1)Nsh18W;kHQZDr3Zr9N&*H>44 zm~VFnYF4IHExu!4a18zr4~iO4;4B0GVLVxn-yvu_FhJvZ!8WguY)(tp&X-hOJFP`{ zSQFnNW#)`@f0Y&`V~>Ia#pig{FDI>*WyfHb?st5YZ@G`R%j#f{+J<;_=|5CSqapqM9--C%=!0%#1Tr$kI zx$@maGoX*EocL^;Ipx-wPFNgaH^MQ00j>Y0nif+eTz~ z0sTNp&4d&GF%}(nWu{8xWtMvH#hNu$#fCIQmx~n>z1^26)N!^@Skqt}Zwd4Vyn=n= zxqp)UD$mZ~yLPvd_*U~;&?{qHPfB42*KvjxAN2?W(>%==#Ch9|)ROROI40WvPn_mS zybO)6=Mb(IjFqa_lvD?>ZT%)-8ysvs1jidYE9(N7-I{;2^^bB|d}TO9iK3K-eW4Y{ z0P%GE_%2^NhAFV_5-Es2(OlLo@EwxYhLy^TpEZ|UYvB3lqQMLGD&@AIK+P#QScD7{ zzl&DY=+3eSW7)p&tYa{-tpYw#I(rt4$8-O}@M59f7ES5$%Q|V^mc$yGP@gX|wbuxZ ze@k?+4?vgEBJ7xf*0bsu%z8^#CDY4X8fwW-B6F!QuYzCnd4;*pW5OiCM>=uGIhl7z zu;<9E=5*MU)@8FroH*2L&P-Ph4c<*tdw*oJr}~|_Uc4~lSSE0~-`uH)J1%R_TSMXW zBNkRHsO|?W+ft4+z_AzjLoKUr%d+pdv%i0BTFTcR;P_rE1LVEmaQ?kb& z@pwXy?as>H2^~HT`)sq$W&Ju?Fow_gWf!}%v!v_iiEoKW_8`^u=FmHI{SaN>Mc32i z1f=JEc+80nvsTzOU7f7S^88(}08=JXh9te##imGNhs&PyoA3IXjynC3aethNdM-1> z>`XH+c^}y+N70Jntd!s-kt_RJE(r5A`W=3_zc|O$#?xS?`l~NDgw5vCzHT?1b}~M1Nu$V<@1zN#R~K;&bQ+P8@oSm}+vsXQPHuPY=38 zt9&t@G9$Eu?eIRwQRJp9_W5Gz2Wk}rSC$(ODLzDiYao>)&h=MA)~_fi2*t}>5tFa} zs*b7VFgU0PwLfF*(n`@(Gkw3|OzF?7d$%jJh4h1yu}-T)kC!8x$r-PQyq~7lsD!hP z$h5@dTycRyI{m$od8sN2Y|Ig#Y){g!5zlg*;dqSv@mx3aC{@GdRqw^T$C#WQD$~Tx zd@{ntNG#Im__RVg+VER*>^kc==2)X6<~QGA8KFrw8cpKgWS`lJz~1ZFr@Yt1@I%mo z4bl!7cr(rmq9fRLUibU1x*stPT!h8sW?9K|WNMrBFd8tz#z42HF|Zhx9j)F+DPK6f zJ>kj!hD?-Xn0VeCX05HK@GU}m0TVhGJ>hd1to z>%64T3ZUyVe^k)`C-Z%(MJ5Ald- zIM&F;ixI75ajUn%@sSHO{!G|lP9GLX0@dtc2H#dcD<@Nat8dLIsZKnsLh^`=30U1} zeGIJXEmLM+Ji0_%ESuTY)uSTJm%)p>tsk35bmPkR7sn$%mw@aQpz5m6!z&xYE1wCk zYz%#Mx$C}J9KbbS`C%!!9uP@T_YLF)JhgEcmpA2j$7}lke$>qRyQgrAxIelj;e@Q4W12I> zugwW=-bQL~XD9J_1B0HK2^~lC=n)=J4I1ux;6a|umMM{f)Lz`*^xn#dQ??S!qy;<< zI^MCKc#8FoR5V!AU^D`sbvZOf!ZX%)?Sv0mDH0m3u$_RgAVvF_^Q;puL|!fSh>M&EA78DMQ)%O}B*lFbQ8T-q-K_n61) z_TIfhqK?M{^W^7v;AYQ36vzVC%TK0OtBU9TakRR+lp9r_vacVas56&-SGh78pgYi2l`d}-I>+VI;Km|b$qkeomtbdyFti9EKQmYh{BSWKnwpnQYb}B ziODNu7P&H#d{DI-aO2Iw2w&h9+?^p+mc{xB_IAoMw(Nd);$Z$)f$nBAD4l~aE0(RY z8?EVX>9`!1p7=(i=BrHB+I62nnwcFy2_&9-3q{4ZpLX`iU6R9a0T<}IxKqAspG--Z zPRcnV!>3YuLzw`CR$jW)06aM8V#7nLvQh&5xHNMn4Wf2YPYShGCgAVTBIc~WwfaWs zm%7*y!ed9Up$jpkiA$RqprSBu(p)gd6~XiBhfttiS^pL~d3VmSS%>_UPt zOwKpLlezRclbv9W%kKQ&-qQv zRYeo3n8Fa_-%ut#9h34@QFD*zZ*8^yI)EdrDlg7%3RMx4M9mD2k)$ZHea%BYI4O@? z{%(<+{~!ljS5G`8HYz?fb6K`wrqwfz1c_>jWlDr>@u?(s-sycED9f<`+8DHM*WLc! z?n815GxwW&%2pFf2DuZWUHp1QPn4wgw*b){VQ z0$IM$GS%hOfw4>JMe*tiS`P8VlP%5s^6W6h(TtG!YKM(QM^?bGXQQTng|r!K>Wq3s*Rq|8>@$D};t`hu;pJ zVLkXvYQM1VepKRjc`K$Yk$1g)i){x9LgbesPKAq=*LE;7X@B7eH^9GFOKPL_B&S6b zb;fY!tXdl!7VbO}JcTP1;FbedgV%}hZs^yc+}fYCOsaK8*1MYVoZ35Jil?R+AWT8U zU7=xQK1nj4;GfDdIrAJ+<9wi1GVwG|L$K8P@ac4$w?FdTZRX(d8P~yWaj7qY#>8LLwepk|p1(U}e7QZ3-nks@Xrt*@qzF~qT|Md6V`_{S zUK(w@a8I6l58UK?MgmuT8$>@>WHtTUNP3`mJxQ%!g#I!b97#3M0%*NsYXPUE#gDrKx@n%HQ}|Q;fYY�?!H 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 N70sMIW8OSN{vUE=L&yLC diff --git a/Lib/distutils/command/wininst-10.0.exe b/Lib/distutils/command/wininst-10.0.exe deleted file mode 100644 index afc3bc6c14847283f32f53327184c6c2806efe0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190976 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

OPEHI2%PD3L3F4K9SA@F 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 diff --git a/Lib/distutils/command/wininst-14.0-amd64.exe b/Lib/distutils/command/wininst-14.0-amd64.exe deleted file mode 100644 index 253c2e2eccefa79393827f44f85680536906574a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587776 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 z 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

64S?Ez{~ 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 z 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 diff --git a/Lib/distutils/command/wininst-14.0.exe b/Lib/distutils/command/wininst-14.0.exe deleted file mode 100644 index 46f5f356676c800f99742deb6bf4c0a96aa166c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 458240 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�VkkI>$}~d(uZJ57cs;^Uz@cHejzJwU6!4Wk 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%0A7`rF^n2GrI3(dH~ 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 diff --git a/Lib/distutils/command/wininst-7.1.exe b/Lib/distutils/command/wininst-7.1.exe deleted file mode 100644 index 1433bc1ad3775ec9277e13ca8bdca3a5dbc23643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/Lib/distutils/command/wininst-9.0-amd64.exe b/Lib/distutils/command/wininst-9.0-amd64.exe deleted file mode 100644 index 94fbd4341b2a140fb0aa38ed1e10ff69600d4911..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224256 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ÎsYM~fS}Xp>Y#7qtYq?Xvt~um=bn8Y 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 hJDV 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 diff --git a/Lib/distutils/command/wininst-9.0.exe b/Lib/distutils/command/wininst-9.0.exe deleted file mode 100644 index 2ec261f9fdcd034cff9602af0c81fb7953ce2e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196096 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

4O*Kp59>M2 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

rCssi!kO4wr;`PHdL*0h9uv6 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

@@ -583,6 +581,11 @@ user error. For Python code, at the shell prompt or in an editor, these are keywords, builtin class and function names, names following class and def, strings, and comments. For any text window, these are the cursor (when present), found text (when possible), and selected text.

+

IDLE also highlights the soft keywords match, +case, and _ in +pattern-matching statements. However, this highlighting is not perfect and +will be incorrect in some rare cases, including some _-s in case +patterns.

Text coloring is done in the background, so uncolorized text is occasionally visible. To change the color scheme, use the Configure IDLE dialog Highlighting tab. The marking of debugger breakpoint lines in the editor and @@ -800,7 +803,7 @@ re-enable the mainloop call when running in standard Python.

Running without a subprocess¶

By default, IDLE executes user code in a separate subprocess via a socket, which uses the internal loopback interface. This connection is not -externally visible and no data is sent to or received from the Internet. +externally visible and no data is sent to or received from the internet. If firewall software complains anyway, you can ignore it.

If the attempt to make the socket connection fails, Idle will notify you. Such failures are sometimes transient, but if persistent, the problem @@ -973,7 +976,7 @@ also used for testing.

  • - 3.11.0a4 Documentation » + 3.11.0a0 Documentation »
  • @@ -997,7 +1000,7 @@ also used for testing.