← index #1329Issue #7905
Related · high · value 1.383
QUERY · ISSUE

Discussion of Python 3.5 support

openby dpgeorgeopened 2015-06-15updated 2022-04-02
rfc

MicroPython aims to implement the Python 3.x "standard". At the moment x is currently 4, ie we try to be compatible with CPython 3.4. It's new territory as to what to do when CPython evolves to larger version numbers. I would say we should try to follow the changes and implement them when possible/sensible.

Python 3.5 had a feature freeze on 24 May 2015 and is scheduled for final release on 13 September 2015. This ticket here is about discussing if, what and how we should upgrade uPy to version 3.5 of the language. It may be that some issues need to break off into separate tickets and that's fine but we should link to them from this one.

The PEP discussing the new features in 3.5: https://www.python.org/dev/peps/pep-0478/

A more friendly overview in the docs: https://docs.python.org/3.5/whatsnew/3.5.html

Below is a list of finalised/accepted PEPs for 3.5 grouped into their impact to MicroPython.

Extensions to the syntax:

  • PEP 448 - additional unpacking generalizations; see #5807
  • PEP 465 - a new matrix multiplication operator; done in 2069c563f9e944d8f45e524b425fff23208e8153
  • PEP 492 - coroutines with async and await syntax

Extensions and changes to the runtime:

  • PEP 461 - %-formatting for binary strings - tentatively done
  • PEP 475 - retrying system calls that fail with EINTR - done in 9418611c8aa860812e28b6e2b6bfde7be5817b43
  • PEP 479 - change StopIteration handling inside generators - done in 3f6ffe059f64b3ebc44dc0bbc63452cb8850702b

Standard library changes:

  • PEP 471 - os.scandir()
  • PEP 485 - math.isclose(), a function for testing approximate equality - done in af5c998f37ddc62abfd36e0b8be511c392fc25d8

Miscellaneous changes that are not relevant to MicroPython:

  • PEP 441 - improved Python zip application support
  • PEP 486 - make the Python Launcher aware of virtual environments
  • PEP 484 - type hints (advisory only)
  • PEP 488 - elimination of PYO files
  • PEP 489 - redesigning extension module loading

Other Language Changes

  • Added the "namereplace" error handlers. The "backslashreplace" error handlers now work with decoding and translating.
  • Property docstrings are now writable. This is especially useful for collections.namedtuple() docstrings.
  • Circular imports involving relative imports are now supported.

New modules

Changes to MicroPython built-in modules

  • asyncio (many, may need another ticket)
  • cmath - A new function isclose() provides a way to test for approximate equality.
  • collections
    • The OrderedDict class is now implemented in C, which makes it 4 to 100 times faster.
    • OrderedDict.items(), OrderedDict.keys(), OrderedDict.values() views now support reversed() iteration.
    • The deque class now defines index(), insert(), and copy(), and supports the + and * operators.
    • Docstrings produced by namedtuple() can now be updated.
    • The UserString class now implements the __getnewargs__(), __rmod__(), casefold(), format_map(), isprintable(), and maketrans() methods to match the corresponding methods of str.
  • heapq - Element comparison in merge() can now be customized by passing a key function in a new optional key keyword argument, and a new optional reverse keyword argument can be used to reverse element comparison
  • io - A new BufferedIOBase.readinto1() method, that uses at most one call to the underlying raw stream's RawIOBase.read() or RawIOBase.readinto() methods.
  • json - JSON decoder now raises JSONDecodeError instead of ValueError to provide better context information about the error.
  • math
    • Two new constants have been added to the math module: inf and nan.
    • A new function isclose() provides a way to test for approximate equality.
    • A new gcd() function has been added. The fractions.gcd() function is now deprecated.
  • os
    • The new scandir() function returning an iterator of DirEntry objects has been added.
    • The urandom() function now uses the getrandom() syscall on Linux 3.17 or newer, and getentropy() on OpenBSD 5.6 and newer, removing the need to use /dev/urandom and avoiding failures due to potential file descriptor exhaustion.
    • New get_blocking() and set_blocking() functions allow getting and setting a file descriptor's blocking mode (O_NONBLOCK.)
    • There is a new os.path.commonpath() function returning the longest common sub-path of each passed pathname.
  • re
    • References and conditional references to groups with fixed length are now allowed in lookbehind assertions.
    • The number of capturing groups in regular expressions is no longer limited to 100.
    • The sub() and subn() functions now replace unmatched groups with empty strings instead of raising an exception.
    • The re.error exceptions have new attributes, msg, pattern, pos, lineno, and colno, that provide better context information about the error
  • socket
    • Functions with timeouts now use a monotonic clock, instead of a system clock.
    • A new socket.sendfile() method allows sending a file over a socket by using the high-performance os.sendfile() function on UNIX, resulting in uploads being from 2 to 3 times faster than when using plain socket.send().
    • The socket.sendall() method no longer resets the socket timeout every time bytes are received or sent. The socket timeout is now the maximum total duration to send all data.
    • The backlog argument of the socket.listen() method is now optional. By default it is set to SOMAXCONN or to 128, whichever is less.
  • ssl
    • Memory BIO Support
    • Application-Layer Protocol Negotiation Support
    • There is a new SSLSocket.version() method to query the actual protocol version in use.
    • The SSLSocket class now implements a SSLSocket.sendfile() method.
    • The SSLSocket.send() method now raises either the ssl.SSLWantReadError or ssl.SSLWantWriteError exception on a non-blocking socket if the operation would block. Previously, it would return 0.
    • The cert_time_to_seconds() function now interprets the input time as UTC and not as local time, per RFC 5280. Additionally, the return value is always an int.
    • New SSLObject.shared_ciphers() and SSLSocket.shared_ciphers() methods return the list of ciphers sent by the client during the handshake.
    • The SSLSocket.do_handshake(), SSLSocket.read(), SSLSocket.shutdown(), and SSLSocket.write() methods of the SSLSocket class no longer reset the socket timeout every time bytes are received or sent.
    • The match_hostname() function now supports matching of IP addresses.
  • sys
    • A new set_coroutine_wrapper() function allows setting a global hook that will be called whenever a coroutine object is created by an async def function. A corresponding get_coroutine_wrapper() can be used to obtain a currently set wrapper.
    • A new is_finalizing() function can be used to check if the Python interpreter is shutting down.
  • time The monotonic() function is now always available.

(Changes to non-built-in modules will need to be documented elsewhere.)

The above list should be edited if/when progress is made on a given feature.

CANDIDATE · ISSUE

Discussion of Python 3.9 support

openby mattytrentiniopened 2021-10-15updated 2025-10-03
enhancementpy-core

This issue is intended to track the status of Python 3.9 core features as implemented by MicroPython.

Python 3.9.0 (final) was released on the 5th October 2020. The Features for 3.9 are defined in PEP 596 and a detailed description of the changes can be found in What's New in Python 3.9.

  • PEP 584, union operators added to dict;
  • PEP 585, type hinting generics in standard collections;
  • PEP 614, relaxed grammar restrictions on decorators.
  • PEP 616, string methods to remove prefixes and suffixes.
  • PEP 593, flexible function and variable annotations;
  • PEP 573, fast access to module state from methods of C extension types;
  • PEP 617, CPython now uses a new parser based on PEG;
  • PEP 615, the IANA Time Zone Database is now present in the standard library in the zoneinfo module;
  • PEP 602, CPython adopts an annual release cycle. Instead of annual, aiming for two month release cycle

Other language changes

  • __import__() now raises ImportError instead of ValueError; Done, see 53519e322a5a0bb395676cdaa132f5e82de22909
  • Python now gets the absolute path of the script filename specified on the command line (ex: python3 script.py): the __file__ attribute of the __main__ module became an absolute path, rather than a relative path.
  • By default, for best performance, the errors argument is only checked at the first encoding/decoding error and the encoding argument is sometimes ignored for empty strings.
  • "".replace("", s, n) now returns s instead of an empty string for all non-zero n. It is now consistent with "".replace("", s).
  • Any valid expression can now be used as a decorator. Previously, the grammar was much more restrictive.
  • Parallel running of aclose() / asend() / athrow() is now prohibited, and ag_running now reflects the actual running status of the async generator.
  • Unexpected errors in calling the __iter__ method are no longer masked by TypeError in the in operator and functions contains(), indexOf() and countOf() of the operator module.
  • Unparenthesized lambda expressions can no longer be the expression part in an if clause in comprehensions and generator expressions.

Changes to MicroPython built-in modules

  • asyncio
    • Due to significant security concerns, the reuse_address parameter of asyncio.loop.create_datagram_endpoint() is no longer supported
    • Added a new coroutine shutdown_default_executor() that schedules a shutdown for the default executor that waits on the ThreadPoolExecutor to finish closing. Also, asyncio.run() has been updated to use the new coroutine.
    • Added asyncio.PidfdChildWatcher, a Linux-specific child watcher implementation that polls process file descriptors
    • Added a new coroutine asyncio.to_thread()
    • When cancelling the task due to a timeout, asyncio.wait_for() will now wait until the cancellation is complete also in the case when timeout is <= 0, like it does with positive timeouts.
    • asyncio now raises TyperError when calling incompatible methods with an ssl.SSLSocket socket
  • gc
    • Garbage collection does not block on resurrected objects
    • Added a new function gc.is_finalized() to check if an object has been finalized by the garbage collector
  • math
    • Expanded the math.gcd() function to handle multiple arguments. Formerly, it only supported two arguments.
    • Added math.lcm(): return the least common multiple of specified arguments
    • Added math.nextafter(): return the next floating-point value after x towards y
    • Added math.ulp(): return the value of the least significant bit of a float
  • os
    • Exposed the Linux-specific os.pidfd_open() and os.P_PIDFD
    • The os.unsetenv() function is now also available on Windows
    • The os.putenv() and os.unsetenv() functions are now always available
    • Added os.waitstatus_to_exitcode() function: convert a wait status to an exit code
  • random - Added a new random.Random.randbytes method: generate random bytes
  • sys
    • Added a new sys.platlibdir attribute: name of the platform-specific library directory
    • Previously, sys.stderr was block-buffered when non-interactive. Now stderr defaults to always being line-buffered.

(Changes to non-built-in modules will need to be documented elsewhere.)

Keyboard

j / / n
next pair
k / / p
previous pair
1 / / h
show query pane
2 / / l
show candidate pane
c
copy suggested comment
r
toggle reasoning
g i
go to index
?
show this help
esc
close overlays

press ? or esc to close

copied