.. This document was generated by tools/gen-cpydiff.py Modules ======= Generated Wed 17 Apr 2024 08:55:01 UTC .. Preamble section inserted into generated output Positional-only Parameters -------------------------- To save code size, many functions that accept keyword arguments in CPython only accept positional arguments in MicroPython. MicroPython marks positional-only parameters in the same way as CPython, by inserting a ``/`` to mark the end of the positional parameters. Any function whose signature ends in ``/`` takes *only* positional arguments. For more details, see `PEP 570 `_. Example ~~~~~~~ For example, in CPython 3.4 this is the signature of the constructor ``socket.socket``:: socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) However, the signature documented in :func:`MicroPython` is:: socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, /) The ``/`` at the end of the parameters indicates that they are all positional-only in MicroPython. The following code works in CPython but not in most MicroPython ports:: import socket s = socket.socket(type=socket.SOCK_DGRAM) MicroPython will raise an exception:: TypeError: function doesn't take keyword arguments The following code will work in both CPython and MicroPython:: import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) array ----- .. _cpydiff_module_array_comparison: Comparison between different typecodes not supported ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** Code size **Workaround:** Compare individual elements Sample code:: import array array.array("b", [1, 2]) == array.array("i", [1, 2]) +-------------+-------------------------------------------+ | CPy output: | uPy output: | +-------------+-------------------------------------------+ | | :: | | | | | | Traceback (most recent call last): | | | File "", line 9, in | | | NotImplementedError: | +-------------+-------------------------------------------+ .. _cpydiff_module_array_constructor: Overflow checking is not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** MicroPython implements implicit truncation in order to reduce code size and execution time **Workaround:** If CPython compatibility is needed then mask the value explicitly Sample code:: import array a = array.array("b", [257]) print(a) +--------------------------------------------------------+---------------------+ | CPy output: | uPy output: | +--------------------------------------------------------+---------------------+ | :: | :: | | | | | Traceback (most recent call last): | array('b', [1]) | | File "", line 9, in | | | OverflowError: signed char is greater than maximum | | +--------------------------------------------------------+---------------------+ .. _cpydiff_modules_array_containment: Looking for integer not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: import array print(1 in array.array("B", b"12")) +-------------+-------------------------------------------+ | CPy output: | uPy output: | +-------------+-------------------------------------------+ | :: | :: | | | | | False | Traceback (most recent call last): | | | File "", line 9, in | | | NotImplementedError: | +-------------+-------------------------------------------+ .. _cpydiff_modules_array_deletion: Array deletion not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: import array a = array.array("b", (1, 2, 3)) del a[1] print(a) +------------------------+-------------------------------------------------------------+ | CPy output: | uPy output: | +------------------------+-------------------------------------------------------------+ | :: | :: | | | | | array('b', [1, 3]) | Traceback (most recent call last): | | | File "", line 10, in | | | TypeError: 'array' object doesn't support item deletion | +------------------------+-------------------------------------------------------------+ .. _cpydiff_modules_array_subscrstep: Subscript with step != 1 is not yet implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: import array a = array.array("b", (1, 2, 3)) print(a[3:2:2]) +----------------+---------------------------------------------------------------------------+ | CPy output: | uPy output: | +----------------+---------------------------------------------------------------------------+ | :: | :: | | | | | array('b') | Traceback (most recent call last): | | | File "", line 10, in | | | NotImplementedError: only slices with step=1 (aka None) are supported | +----------------+---------------------------------------------------------------------------+ builtins -------- .. _cpydiff_builtin_next_arg2: Second argument to next() is not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** MicroPython is optimised for code space. **Workaround:** Instead of ``val = next(it, deflt)`` use:: try: val = next(it) except StopIteration: val = deflt Sample code:: print(next(iter(range(0)), 42)) +-------------+-----------------------------------------------------------------------+ | CPy output: | uPy output: | +-------------+-----------------------------------------------------------------------+ | :: | :: | | | | | 42 | Traceback (most recent call last): | | | File "", line 12, in | | | TypeError: function takes 1 positional arguments but 2 were given | +-------------+-----------------------------------------------------------------------+ deque ----- .. _cpydiff_modules_deque: Deque not implemented ~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Use regular lists. micropython-lib has implementation of collections.deque. Sample code:: import collections D = collections.deque() print(D) +---------------+-----------------------------------------------------------------+ | CPy output: | uPy output: | +---------------+-----------------------------------------------------------------+ | :: | :: | | | | | deque([]) | Traceback (most recent call last): | | | File "", line 9, in | | | TypeError: function missing 2 required positional arguments | +---------------+-----------------------------------------------------------------+ json ---- .. _cpydiff_modules_json_nonserializable: JSON module does not throw exception when object is not serialisable ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: import json a = bytes(x for x in range(256)) try: z = json.dumps(a) x = json.loads(z) print("Should not get here") except TypeError: print("TypeError") +---------------+--------------------------------------------+ | CPy output: | uPy output: | +---------------+--------------------------------------------+ | :: | :: | | | | | TypeError | Traceback (most recent call last): | | | File "", line 12, in | | | UnicodeError: | +---------------+--------------------------------------------+ os -- .. _cpydiff_modules_os_environ: ``environ`` attribute is not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Use ``getenv``, ``putenv`` and ``unsetenv`` Sample code:: import os try: print(os.environ.get("NEW_VARIABLE")) os.environ["NEW_VARIABLE"] = "VALUE" print(os.environ["NEW_VARIABLE"]) except AttributeError: print("should not get here") print(os.getenv("NEW_VARIABLE")) os.putenv("NEW_VARIABLE", "VALUE") print(os.getenv("NEW_VARIABLE")) +-------------+-------------------------+ | CPy output: | uPy output: | +-------------+-------------------------+ | :: | :: | | | | | None | should not get here | | VALUE | None | | | VALUE | +-------------+-------------------------+ .. _cpydiff_modules_os_getenv: ``getenv`` returns actual value instead of cached value ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** The ``environ`` attribute is not implemented Sample code:: import os print(os.getenv("NEW_VARIABLE")) os.putenv("NEW_VARIABLE", "VALUE") print(os.getenv("NEW_VARIABLE")) +-------------+-------------+ | CPy output: | uPy output: | +-------------+-------------+ | :: | :: | | | | | None | None | | None | VALUE | +-------------+-------------+ random ------ .. _cpydiff_modules_random_getrandbits: ``getrandbits`` method can only return a maximum of 32 bits at a time. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** PRNG's internal state is only 32bits so it can only return a maximum of 32 bits of data at a time. **Workaround:** If you need a number that has more than 32 bits then utilize the random module from micropython-lib. Sample code:: import random x = random.getrandbits(64) print("{}".format(x)) +-------------------------+--------------------------------------------+ | CPy output: | uPy output: | +-------------------------+--------------------------------------------+ | :: | :: | | | | | 3783822645117898148 | Traceback (most recent call last): | | | File "", line 11, in | | | ValueError: bits must be 32 or less | +-------------------------+--------------------------------------------+ .. _cpydiff_modules_random_randint: ``randint`` method can only return an integer that is at most the native word size. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** PRNG is only able to generate 32 bits of state at a time. The result is then cast into a native sized int instead of a full int object. **Workaround:** If you need integers larger than native wordsize use the random module from micropython-lib. Sample code:: import random x = random.randint(2**128 - 1, 2**128) print("x={}".format(x)) +-----------------------------------------------+-----------------------------------------------------------------+ | CPy output: | uPy output: | +-----------------------------------------------+-----------------------------------------------------------------+ | :: | :: | | | | | x=340282366920938463463374607431768211455 | Traceback (most recent call last): | | | File "", line 11, in | | | OverflowError: overflow converting long int to machine word | +-----------------------------------------------+-----------------------------------------------------------------+ struct ------ .. _cpydiff_modules_struct_fewargs: Struct pack with too few args, not checked by uPy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: import struct try: print(struct.pack("bb", 1)) print("Should not get here") except: print("struct.error") +------------------+-------------------------+ | CPy output: | uPy output: | +------------------+-------------------------+ | :: | :: | | | | | struct.error | b'\x01\x00' | | | Should not get here | +------------------+-------------------------+ .. _cpydiff_modules_struct_manyargs: Struct pack with too many args, not checked by uPy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: import struct try: print(struct.pack("bb", 1, 2, 3)) print("Should not get here") except: print("struct.error") +------------------+-------------------------+ | CPy output: | uPy output: | +------------------+-------------------------+ | :: | :: | | | | | struct.error | b'\x01\x02' | | | Should not get here | +------------------+-------------------------+ .. _cpydiff_modules_struct_whitespace_in_format: Struct pack with whitespace in format, whitespace ignored by CPython, error on uPy ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** MicroPython is optimised for code size. **Workaround:** Don't use spaces in format strings. Sample code:: import struct try: print(struct.pack("b b", 1, 2)) print("Should have worked") except: print("struct.error") +------------------------+------------------+ | CPy output: | uPy output: | +------------------------+------------------+ | :: | :: | | | | | b'\x01\x02' | struct.error | | Should have worked | | +------------------------+------------------+ sys --- .. _cpydiff_modules_sys_stdassign: Overriding sys.stdin, sys.stdout and sys.stderr not possible ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** They are stored in read-only memory. Sample code:: import sys sys.stdin = None print(sys.stdin) +-------------+--------------------------------------------------------------+ | CPy output: | uPy output: | +-------------+--------------------------------------------------------------+ | :: | :: | | | | | None | Traceback (most recent call last): | | | File "", line 9, in | | | AttributeError: 'module' object has no attribute 'stdin' | +-------------+--------------------------------------------------------------+