.. This document was generated by tools/gen-cpydiff.py Builtin Types ============= Generated Thu 16 May 2019 04:46:41 UTC Exception --------- .. _cpydiff_types_exception_chaining: Exception chaining not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: try: raise TypeError except TypeError: raise ValueError +-------------------------------------------------------------------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------------------------------------------------------------------+------------------------------------------------+ | :: | :: | | | | | Traceback (most recent call last): | /bin/sh: 1: ../unix/micropython: not found | | File "", line 8, in | | | TypeError | | | | | | During handling of the above exception, another exception occurred: | | | | | | Traceback (most recent call last): | | | File "", line 10, in | | | ValueError | | +-------------------------------------------------------------------------+------------------------------------------------+ .. _cpydiff_types_exception_instancevar: User-defined attributes for builtin exceptions are not supported ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** MicroPython is highly optimized for memory usage. **Workaround:** Use user-defined exception subclasses. Sample code:: e = Exception() e.x = 0 print(e.x) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | 0 | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_exception_loops: Exception in while loop condition may have unexpected line number ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** Condition checks are optimized to happen at the end of loop body, and that line number is reported. Sample code:: l = ["-foo", "-bar"] i = 0 while l[i][0] == "-": print("iter") i += 1 +--------------------------------------------+------------------------------------------------+ | CPy output: | uPy output: | +--------------------------------------------+------------------------------------------------+ | :: | :: | | | | | iter | /bin/sh: 1: ../unix/micropython: not found | | iter | | | Traceback (most recent call last): | | | File "", line 10, in | | | IndexError: list index out of range | | +--------------------------------------------+------------------------------------------------+ .. _cpydiff_types_exception_subclassinit: Exception.__init__ raises TypeError if overridden and called by subclass ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: class A(Exception): def __init__(self): Exception.__init__(self) a = A() +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | | :: | | | | | | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ bytearray --------- .. _cpydiff_types_bytearray_sliceassign: Array slice assignment with unsupported RHS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: b = bytearray(4) b[0:1] = [1, 2] print(b) +----------------------------------------+------------------------------------------------+ | CPy output: | uPy output: | +----------------------------------------+------------------------------------------------+ | :: | :: | | | | | bytearray(b'\x01\x02\x00\x00\x00') | /bin/sh: 1: ../unix/micropython: not found | +----------------------------------------+------------------------------------------------+ bytes ----- .. _cpydiff_types_bytes_keywords: bytes() with keywords not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Pass the encoding as a positional paramter, e.g. ``print(bytes('abc', 'utf-8'))`` Sample code:: print(bytes('abc', encoding='utf8')) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | b'abc' | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_bytes_subscrstep: Bytes subscription with step != 1 not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** MicroPython is highly optimized for memory usage. **Workaround:** Use explicit loop for this very rare operation. Sample code:: print(b'123'[0:3:2]) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | b'13' | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ float ----- .. _cpydiff_types_float_rounding: uPy and CPython outputs formats may differ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: print('%.1g' % -9.9) print('%.1e' % 9.99) print('%.1e' % 0.999) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | -1e+01 | /bin/sh: 1: ../unix/micropython: not found | | 1.0e+01 | | | 1.0e+00 | | +-------------+------------------------------------------------+ int --- .. _cpydiff_types_int_subclassconv: No int conversion for int-derived types available ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Avoid subclassing builtin types unless really needed. Prefer https://en.wikipedia.org/wiki/Composition_over_inheritance . Sample code:: class A(int): __add__ = lambda self, other: A(int(self) + other) a = A(42) print(a+a) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | 84 | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_int_tobytesfloat: Incorrect error message when passing float into to_bytes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: try: int('1').to_bytes(1.0) except TypeError as e: print(e) +------------------------------------------+------------------------------------------------+ | CPy output: | uPy output: | +------------------------------------------+------------------------------------------------+ | :: | :: | | | | | integer argument expected, got float | /bin/sh: 1: ../unix/micropython: not found | +------------------------------------------+------------------------------------------------+ list ---- .. _cpydiff_types_list_delete_subscrstep: List delete with step != 1 not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Use explicit loop for this rare operation. Sample code:: l = [1, 2, 3, 4] del l[0:4:2] print(l) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | [2, 4] | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_list_store_noniter: List slice-store with non-iterable on RHS is not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** RHS is restricted to be a tuple or list **Workaround:** Use ``list()`` on RHS to convert the iterable to a list Sample code:: l = [10, 20] l[0:1] = range(4) print(l) +----------------------+------------------------------------------------+ | CPy output: | uPy output: | +----------------------+------------------------------------------------+ | :: | :: | | | | | [0, 1, 2, 3, 20] | /bin/sh: 1: ../unix/micropython: not found | +----------------------+------------------------------------------------+ .. _cpydiff_types_list_store_subscrstep: List store with step != 1 not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Use explicit loop for this rare operation. Sample code:: l = [1, 2, 3, 4] l[0:4:2] = [5, 6] print(l) +------------------+------------------------------------------------+ | CPy output: | uPy output: | +------------------+------------------------------------------------+ | :: | :: | | | | | [5, 2, 6, 4] | /bin/sh: 1: ../unix/micropython: not found | +------------------+------------------------------------------------+ str --- .. _cpydiff_types_str_decodeerror: UnicodeDecodeError not raised when expected ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: try: print(repr(str(b"\xa1\x80", 'utf8'))) print('Should not get here') except UnicodeDecodeError: print('UnicodeDecodeError') +------------------------+------------------------------------------------+ | CPy output: | uPy output: | +------------------------+------------------------------------------------+ | :: | :: | | | | | UnicodeDecodeError | /bin/sh: 1: ../unix/micropython: not found | +------------------------+------------------------------------------------+ .. _cpydiff_types_str_endswith: Start/end indices such as str.endswith(s, start) not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: print('abc'.endswith('c', 1)) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | True | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_str_formatsubscr: Attributes/subscr not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: print('{a[0]}'.format(a=[1, 2])) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | 1 | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_str_keywords: str(...) with keywords not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Workaround:** Input the encoding format directly. eg ``print(bytes('abc', 'utf-8'))`` Sample code:: print(str(b'abc', encoding='utf8')) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | abc | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_str_ljust_rjust: str.ljust() and str.rjust() not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **Cause:** MicroPython is highly optimized for memory usage. Easy workarounds available. **Workaround:** Instead of `s.ljust(10)` use `"%-10s" % s`, instead of `s.rjust(10)` use `"% 10s" % s`. Alternatively, `"{:<10}".format(s)` or `"{:>10}".format(s)`. Sample code:: print('abc'.ljust(10)) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | abc | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_str_rsplitnone: None as first argument for rsplit such as str.rsplit(None, n) not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: print('a a a'.rsplit(None, 1)) +------------------+------------------------------------------------+ | CPy output: | uPy output: | +------------------+------------------------------------------------+ | :: | :: | | | | | ['a a', 'a'] | /bin/sh: 1: ../unix/micropython: not found | +------------------+------------------------------------------------+ .. _cpydiff_types_str_subclassequality: Instance of a subclass of str cannot be compared for equality with an instance of a str ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: class S(str): pass s = S('hello') print(s == 'hello') +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | True | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ .. _cpydiff_types_str_subscrstep: Subscript with step != 1 is not yet implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: print('abcdefghi'[0:9:2]) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | acegi | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+ tuple ----- .. _cpydiff_types_tuple_subscrstep: Tuple load with step != 1 not implemented ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sample code:: print((1, 2, 3, 4)[0:4:2]) +-------------+------------------------------------------------+ | CPy output: | uPy output: | +-------------+------------------------------------------------+ | :: | :: | | | | | (1, 3) | /bin/sh: 1: ../unix/micropython: not found | +-------------+------------------------------------------------+