Builtin types
Builtin types
Generated Mon 05 Jan 2026 06:11:07 UTC
Exception
All exceptions have readable value and errno attributes, not just StopIteration and OSError.
Cause: MicroPython is optimised to reduce code size.
Workaround: Only use value on StopIteration exceptions, and errno on OSError exceptions. Do not use or rely on these attributes on other exceptions.
Sample code:
e = Exception(1)
print(e.value)
print(e.errno)| CPy output: | uPy output: |
|---|---|
| Traceback (most recent call last): File " <stdin>", line 8, in <module>AttributeError: 'Exception' object has no attribute 'value' | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
Exception chaining not implemented
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 | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
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 iter Traceback (most recent call last): File " <stdin>", line 10, in <module>IndexError: list index out of range | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
Exception.init method does not exist.
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: |
|---|---|
| /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
bytearray
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: ../ports/unix/build-standard/micropython: not found |
bytes
bytes objects support .format() method
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' | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
bytes() with keywords not implemented
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' | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
dict
Dictionary keys view does not behave as a set.
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} | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
float
uPy allows implicit conversion of objects in maths operations while CPython does not.
Workaround: Objects should be wrapped in float(obj) for compatibility with CPython.
Sample code:
class Test:
def __float__(self):
return 0.5
print(2.0 * Test())| CPy output: | uPy output: |
|---|---|
| Traceback (most recent call last): File " <stdin>", line 14, in <module>TypeError: unsupported operand type(s) for *: 'float' and 'Test' | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
uPy and CPython outputs formats may differ
Sample code:
print("%.1g" % -9.9)| CPy output: | uPy output: |
|---|---|
| -1e+01 | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
int
bit_length method doesn’t exist.
Cause: bit_length method is not implemented.
Workaround: Avoid using this method on MicroPython.
Sample code:
x = 255
print("{} is {} bits long.".format(x, x.bit_length()))| CPy output: | uPy output: |
|---|---|
| 255 is 8 bits long. | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
list
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: ../ports/unix/build-standard/micropython: not found |
List slice-store with non-iterable on RHS is not implemented
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] | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
memoryview
memoryview can become invalid if its target is resized
Cause: CPython prevents a bytearray or io.bytesIO object from changing size while there is a memoryview object that references it. MicroPython requires the programmer to manually ensure that an object is not resized while any memoryview references it.
In the worst case scenario, resizing an object which is the target of a memoryview can cause the memoryview(s) to reference invalid freed memory (a use-after-free bug) and corrupt the MicroPython runtime.
Workaround: Do not change the size of any bytearray or io.bytesIO object that has a memoryview assigned to it.
Sample code:
b = bytearray(b"abcdefg")
m = memoryview(b)
b.extend(b"hijklmnop")
print(b, bytes(m))| CPy output: | uPy output: |
|---|---|
| Traceback (most recent call last): File " <stdin>", line 11, in <module>BufferError: Existing exports of data: object cannot be re-sized | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
str
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: ../ports/unix/build-standard/micropython: not found |
Attributes/subscr not implemented
Sample code:
print("{a[0]}".format(a=[1, 2]))| CPy output: | uPy output: |
|---|---|
| 1 | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
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: ../ports/unix/build-standard/micropython: not found |
Subscript with step != 1 is not yet implemented
Sample code:
print("abcdefghi"[0:9:2])| CPy output: | uPy output: |
|---|---|
| acegi | /bin/sh: 1: ../ports/unix/build-standard/micropython: not found |
tuple
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: ../ports/unix/build-standard/micropython: not found |
