What’s New In Python 3.7¶
|Date:||September 26, 2017|
This article explains the new features in Python 3.7, compared to 3.6.
For full details, see the changelog.
Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.7 moves towards release, so it’s worth checking back even after reading earlier versions.
Summary – Release highlights¶
PEP 538: Legacy C Locale Coercion¶
An ongoing challenge within the Python 3 series has been determining a sensible default strategy for handling the “7-bit ASCII” text encoding assumption currently implied by the use of the default C locale on non-Windows platforms.
PEP 538 updates the default interpreter command line interface to automatically coerce that locale to an available UTF-8 based locale as described in the documentation of the
PYTHONCOERCECLOCALE environment variable. Automatically setting
LC_CTYPE this way means that both the core interpreter
and locale-aware C extensions (such as
readline) will assume the use of UTF-8 as
the default text encoding, rather than ASCII.
The platform support definition in PEP 11 has also been updated to limit full text handling support to suitably configured non-ASCII based locales.
As part of this change, the default error handler for
stdout is now
surrogateescape (rather than
strict) when using any of the defined coercion target locales (currently
UTF-8). The default error handler for
stderr continues to be
backslashreplace, regardless of locale.
Locale coercion is silent by default, but to assist in debugging potentially locale related integration problems, explicit warnings (emitted directly on
stderr can be requested by setting
PYTHONCOERCECLOCALE=warn. This setting
will also cause the Python runtime to emit a warning if the legacy C locale remains active when the core interpreter is initialized.
- PEP 538 – Coercing the legacy C locale to a UTF-8 based locale
- PEP written and implemented by Nick Coghlan.
Other Language Changes¶
- More than 255 arguments can now be passed to a function, and a function can now have more than 255 parameters. (Contributed by Serhiy Storchaka in bpo-12844 and bpo-18896.)
bytearray.fromhex()now ignore all ASCII whitespace, not only spaces. (Contributed by Robert Xiao in bpo-28927.)
ImportErrornow displays module name and module
from ... import ...fails. (Contributed by Matthias Bussonnier in bpo-29546.)
- Circular imports involving absolute imports with binding a submodule to a name are now supported. (Contributed by Serhiy Storchaka in bpo-30024.)
object.__format__(x, '')is now equivalent to
format(str(self), ''). (Contributed by Serhiy Storchaka in bpo-28974.)
- None yet.
parse_intermixed_args() supports letting the user intermix
options and positional arguments on the command line, as is possible in many unix commands. It supports most but not all argparse features. (Contributed by paul.j3 in bpo-14191.)
dis() function now is able to disassemble nested code objects (the code of comprehensions, generator expressions and nested functions,
and the code used for building nested classes). (Contributed by Serhiy Storchaka in bpo-11822.)
README.rst is now included in the list of distutils standard READMEs and therefore included in source distributions. (Contributed by Ryan Gonzalez in bpo-11913.)
SimpleHTTPRequestHandler supports the HTTP If-Modified-Since header. The
server returns the 304 response status if the target file was not modified after the time specified in the header. (Contributed by Pierre Quentel in bpo-29654.)
Add the parameter
directory to the
SimpleHTTPRequestHandler and the
--directory to the command line of the module
this parameter, the server serves the specified directory, by default it uses the current working directory. (Contributed by Stéphane Wirtel and Julien Palard in bpo-28707.)
set_trace() now takes an optional
header keyword-only argument. If given, this is printed to the console just before
xmlrpc.server.SimpleXMLRPCDispatcher and its subclasses can be used as a decorator. (Contributed by Xiang Zhang in bpo-7769.)
urllib.parse.quote() has been updated from RFC 2396 to RFC 3986, adding ~ to the set of characters
that is never quoted by default. (Contributed by Christian Theune and Ratnadeep Debnath in bpo-16285.)
zipapp.create_archive() now accepts an optional filter argument, to allow the user to select which files should be included in the archive.
- Added two new opcodes:
CALL_METHODto avoid instantiation of bound method objects for method calls, which results in method calls being faster up to 20%. (Contributed by Yury Selivanov and INADA Naoki in bpo-26110.)
- Searching some unlucky Unicode characters (like Ukrainian capital “Є”) in a string was to 25 times slower than searching other characters. Now it is slower only by 3 times in worst case. (Contributed by Serhiy Storchaka in bpo-24821.)
- Fast implementation from standard C library is now used for functions
mathmodule. (Contributed by Serhiy Storchaka in bpo-26121.)
os.fwalk()function has been sped up by 2 times. This was done using the
os.scandir()function. (Contributed by Serhiy Storchaka in bpo-25996.)
- Optimized case-insensitive matching and searching of
regular expressions. Searching some patterns can now be up to 20 times faster. (Contributed by Serhiy Storchaka in bpo-30285.)
selectors.DevpollSelector.modify()may be around 10% faster under heavy loads. (Contributed by Giampaolo Rodola’ in bpo-30014)
Build and C API Changes¶
- A full copy of libffi is no longer bundled for use when building the
_ctypesmodule on non-OSX UNIX platforms. An installed copy of libffi is now required when building
_ctypeson such platforms. Contributed by Zachary Ware in bpo-27979.
- The fields
wrapperbaseare now of type
const char *rather of
char *. (Contributed by Serhiy Storchaka in bpo-28761.)
- The result of
PyUnicode_AsUTF8()is now of type
const char *rather of
char *. (Contributed by Serhiy Storchaka in bpo-28769.)
- Added functions
PySlice_AdjustIndices(). (Contributed by Serhiy Storchaka in bpo-27867.)
PyOS_AfterFork()is deprecated in favour of the new functions
PyOS_AfterFork_Child(). (Contributed by Antoine Pitrou in bpo-16500.)
- The Windows build process no longer depends on Subversion to pull in external sources, a Python script is used to download zipfiles from GitHub instead. If Python 3.6 is not found on the system (via
py -3.6), NuGet is used to download a copy of 32-bit Python for this purpose. (Contributed by Zachary Ware in bpo-30450.)
- Support for building
--without-threadsis removed. (Contributed by Antoine Pitrou in bpo-31370.).
Other CPython Implementation Changes¶
- Trace hooks may now opt out of receiving
lineevents from the interpreter by setting the new
Falseon the frame being traced. (Contributed by Nick Coghlan in bpo-31344.)
- Trace hooks may now opt in to receiving
opcodeevents from the interpreter by setting the new
Trueon the frame being traced. (Contributed by Nick Coghlan in bpo-31344.)
PySlice_GetIndicesEx()is deprecated and replaced with a macro if
Py_LIMITED_APIis not set or set to the value between
0x03060000(not including) or
0x03060100or higher. (Contributed by Serhiy Storchaka in bpo-27867.)
locale, use the
format_string()instead. (Contributed by Garvit in bpo-10379.)
PathEntryFinder.find_spec()) both deprecated in Python 3.4 now emit
DeprecationWarning. (Contributed by Matthias Bussonnier in bpo-29576)
- Using non-integer value for selecting a plural form in
gettextis now deprecated. It never correctly worked. (Contributed by Serhiy Storchaka in bpo-28692.)
macpathis now deprecated and will be removed in Python 3.8.
Changes in the C API¶
- The type of results of
PyThread_get_thread_ident(), and the id parameter of
unsigned long. (Contributed by Serhiy Storchaka in bpo-6532.)
PyUnicode_AsWideCharString()now raises a
ValueErrorif the second argument is NULL and the
wchar_t*string contains null characters. (Contributed by Serhiy Storchaka in bpo-30708.)
- The python launcher, (py.exe), can accept 32 & 64 bit specifiers without having to specify a minor version as well. So
py -3-64become valid as well as
py -3.7-32, also the -m-64 and -m.n-64 forms are now accepted to force 64 bit python even if 32 bit would have otherwise been used. If the specified version is not available py.exe will error exit. (Contributed by Steve Barnes in bpo-30291.)
- The launcher can be run as “py -0” to produce a list of the installed pythons, with default marked with an asterix. Running “py -0p” will include the paths. If py is run with a version specifier that cannot be matched it will also print the short form list of available specifiers. (Contributed by Steve Barnes in bpo-30362.)
API and Feature Removals¶
- Unknown escapes consisting of
'\'and an ASCII letter in replacement templates for
re.sub()were deprecated in Python 3.5, and will now cause an error.
- Removed support of the exclude argument in
tarfile.TarFile.add(). It was deprecated in Python 2.7 and 3.2. Use the filter argument instead.
splitunc()function in the
ntpathmodule was deprecated in Python 3.1, and has now been removed. Use the
collections.namedtuple()no longer supports the verbose parameter or
_sourceattribute which showed the generated source code for the named tuple class. This was part of an optimization designed to speed-up class creation. (Contributed by Jelle Zijlstra with further improvements by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in bpo-28638.)
tuple()no longer take keyword arguments. The first argument of
int()can now be passed only as positional argument.
- Removed previously deprecated in Python 2.4 classes
plistlibmodule. Dict values in the result of functions
readPlistFromBytes()are now normal dicts. You no longer can use attribute access to access items of these dictionaries.
Porting to Python 3.7¶
This section lists previously described changes and other bugfixes that may require changes to your code.
Changes in the Python API¶
pkgutil.walk_packages()now raises ValueError if path is a string. Previously an empty list was returned. (Contributed by Sanyam Khurana in bpo-24744.)
- A format string argument for
string.Formatter.format()is now positional-only. Passing it as a keyword argument was deprecated in Python 3.5. (Contributed by Serhiy Storchaka in bpo-29193.)
http.cookies.Morselare now read-only. Assigning to them was deprecated in Python 3.5. Use the
set()method for setting them. (Contributed by Serhiy Storchaka in bpo-29192.)
ClassDefAST nodes now have a new
docstringfield. The first statement in their body is not considered as a docstring anymore.
co_lnotabof code object for class and module are affected by this change. (Contributed by INADA Naoki and Eugene Toder in bpo-29463.)
- The mode argument of
os.makedirs()no longer affects the file permission bits of newly-created intermediate-level directories. To set their file permission bits you can set the umask before invoking
makedirs(). (Contributed by Serhiy Storchaka in bpo-19930.)
struct.Struct.formattype is now
bytes. (Contributed by Victor Stinner in bpo-21071.)
- Due to internal changes in
socketyou won’t be able to
share()-ed in older Python versions.
datetime.timedeltahas changed to include keyword arguments in the output. (Contributed by Utkarsh Upadhyay in bpo-30302.)