Generated Sun 31 Jan 2021 14:55:11 UTC
Sample code:
try: raise TypeError except TypeError: raise ValueError
CPy output: | uPy output: |
Traceback (most recent call last): File "<stdin>", line 8, in <module> TypeError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 10, in <module> ValueError |
Traceback (most recent call last): File "<stdin>", line 10, in <module> ValueError: |
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 |
Traceback (most recent call last): File "<stdin>", line 8, in <module> AttributeError: 'Exception' object has no attribute 'x' |
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 iter Traceback (most recent call last): File "<stdin>", line 10, in <module> IndexError: list index out of range |
iter iter Traceback (most recent call last): File "<stdin>", line 12, in <module> IndexError: list index out of range |
Cause: Subclassing native classes is not fully supported in MicroPython.
Workaround: Call using super()
instead:
class A(Exception): def __init__(self): super().__init__()
Sample code:
class A(Exception): def __init__(self): Exception.__init__(self) a = A()
CPy output: | uPy output: |
Traceback (most recent call last): File "<stdin>", line 18, in <module> File "<stdin>", line 15, in __init__ AttributeError: type object 'Exception' has no attribute '__init__' |
Sample code:
b = bytearray(4) b[0:1] = [1, 2] print(b)
CPy output: | uPy output: |
bytearray(b'\x01\x02\x00\x00\x00') |
Traceback (most recent call last): File "<stdin>", line 8, in <module> NotImplementedError: array/bytes required on right side |
Cause: MicroPython strives to be a more regular implementation, so if both str and bytes support __mod__()
(the % operator), it makes sense to support format()
for both too. Support for __mod__
can also be compiled out, which leaves only format()
for bytes formatting.
Workaround: If you are interested in CPython compatibility, don't use .format()
on bytes objects.
Sample code:
print(b"{}".format(1))
CPy output: | uPy output: |
Traceback (most recent call last): File "<stdin>", line 7, in <module> AttributeError: 'bytes' object has no attribute 'format' |
b'1' |
Workaround: Pass the encoding as a positional parameter, e.g. print(bytes('abc', 'utf-8'))
Sample code:
print(bytes("abc", encoding="utf8"))
CPy output: | uPy output: |
b'abc' |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: keyword argument(s) not yet implemented - use normal args instead |
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' |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: only slices with step=1 (aka None) are supported |
Cause: Not implemented.
Workaround: Explicitly convert keys to a set before using set operations.
Sample code:
print({1: 2, 3: 4}.keys() & {1})
CPy output: | uPy output: |
{1} |
Traceback (most recent call last): File "<stdin>", line 7, in <module> TypeError: unsupported types for __and__: 'dict_view', 'set' |
Sample code:
print("%.1g" % -9.9)
CPy output: | uPy output: |
-1e+01 |
-10 |
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 |
Traceback (most recent call last): File "<stdin>", line 14, in <module> File "<stdin>", line 10, in <lambda> TypeError: unsupported types for __radd__: 'int', 'int' |
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] |
Traceback (most recent call last): File "<stdin>", line 8, in <module> NotImplementedError: |
Cause: RHS is restricted to be a tuple or list
Workaround: Use list(<iter>)
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] |
Traceback (most recent call last): File "<stdin>", line 8, in <module> TypeError: object 'range' isn't a tuple or list |
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] |
Traceback (most recent call last): File "<stdin>", line 8, in <module> NotImplementedError: |
Sample code:
print("abc".endswith("c", 1))
CPy output: | uPy output: |
True |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: start/end indices |
Sample code:
print("{a[0]}".format(a=[1, 2]))
CPy output: | uPy output: |
1 |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: attributes not supported yet |
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 |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: keyword argument(s) not yet implemented - use normal args instead |
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 |
Traceback (most recent call last): File "<stdin>", line 7, in <module> AttributeError: 'str' object has no attribute 'ljust' |
Sample code:
print("a a a".rsplit(None, 1))
CPy output: | uPy output: |
['a a', 'a'] |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: rsplit(None,n) |
Sample code:
print("abcdefghi"[0:9:2])
CPy output: | uPy output: |
acegi |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: only slices with step=1 (aka None) are supported |
Sample code:
print((1, 2, 3, 4)[0:4:2])
CPy output: | uPy output: |
(1, 3) |
Traceback (most recent call last): File "<stdin>", line 7, in <module> NotImplementedError: only slices with step=1 (aka None) are supported |