Ingebouwde typen

Generated Fri 19 Jun 2026 22:08:45 UTC

Uitzondering

Alle uitzonderingen hebben leesbare value- en errno-attributen, niet alleen StopIteration en OSError.

Oorzaak: MicroPython is geoptimaliseerd om de codeomvang te verkleinen.

Oplossing: Gebruik value alleen bij StopIteration-uitzonderingen en errno alleen bij OSError-uitzonderingen. Gebruik of vertrouw niet op deze attributen bij andere uitzonderingen.

Voorbeeldcode:

e = Exception(1)
print(e.value)
print(e.errno)

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
AttributeError: 'Exception' object has no attribute 'value'
1
1

Uitzonderingskoppelingen zijn niet geïmplementeerd

Voorbeeldcode:

try:
    raise TypeError
except TypeError:
    raise ValueError

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
TypeError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
ValueError
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
ValueError:

Door de gebruiker gedefinieerde attributen voor ingebouwde uitzonderingen worden niet ondersteund

Oorzaak: MicroPython is sterk geoptimaliseerd voor geheugengebruik.

Oplossing: Gebruik zelfgedefinieerde subklassen van uitzonderingen.

Voorbeeldcode:

e = Exception()
e.x = 0
print(e.x)

CPython output:

MicroPython output:

0
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
AttributeError: 'Exception' object has no attribute 'x'

Een uitzondering in de voorwaarde van een while-lus kan een onverwacht regelnummer hebben

Oorzaak: Voorwaardechecks zijn geoptimaliseerd om aan het einde van de lusromp te gebeuren, en dat regelnummer wordt gerapporteerd.

Voorbeeldcode:

l = ["-foo", "-bar"]

i = 0
while l[i][0] == "-":
    print("iter")
    i += 1

CPython output:

MicroPython output:

iter
iter
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
IndexError: list index out of range
iter
iter
Traceback (most recent call last):
  File "<stdin>", line 13, in <module>
IndexError: list index out of range

De methode Exception.__init__ bestaat niet.

Oorzaak: Het afleiden van subklassen van native klassen wordt in MicroPython niet volledig ondersteund.

Oplossing: Gebruik in plaats daarvan een aanroep via super():

class A(Exception):
    def __init__(self):
        super().__init__()

Voorbeeldcode:

class A(Exception):
    def __init__(self):
        Exception.__init__(self)


a = A()

CPython output:

MicroPython 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__'

OSError

OSError constructor returns a plain OSError for all errno values, rather than a relevant subtype.

Cause: MicroPython does not include the CPython-standard OSError subclasses.

Workaround: Catch OSError and use its errno attribute to discriminate the cause.

Voorbeeldcode:

import errno

errno_list = [  # i.e. the set implemented by micropython
    errno.EPERM,
    errno.ENOENT,
    errno.EIO,
    errno.EBADF,
    errno.EAGAIN,
    errno.ENOMEM,
    errno.EACCES,
    errno.EEXIST,
    errno.ENODEV,
    errno.EISDIR,
    errno.EINVAL,
    errno.EOPNOTSUPP,
    errno.EADDRINUSE,
    errno.ECONNABORTED,
    errno.ECONNRESET,
    errno.ENOBUFS,
    errno.ENOTCONN,
    errno.ETIMEDOUT,
    errno.ECONNREFUSED,
    errno.EHOSTUNREACH,
    errno.EALREADY,
    errno.EINPROGRESS,
]


def errno_output_type(n):
    try:
        raise OSError(n, "")
    except OSError as e:
        return f"{type(e).__name__}"
    except Exception as e:
        return f"non-OSError {type(e).__name__}"
    else:
        return "no error"


for n in errno_list:
    print(errno.errorcode[n], "=", errno_output_type(n))

CPython output:

MicroPython output:

EPERM = PermissionError
ENOENT = FileNotFoundError
EIO = OSError
EBADF = OSError
EAGAIN = BlockingIOError
ENOMEM = OSError
EACCES = PermissionError
EEXIST = FileExistsError
ENODEV = OSError
EISDIR = IsADirectoryError
EINVAL = OSError
ENOTSUP = OSError
EADDRINUSE = OSError
ECONNABORTED = ConnectionAbortedError
ECONNRESET = ConnectionResetError
ENOBUFS = OSError
ENOTCONN = OSError
ETIMEDOUT = TimeoutError
ECONNREFUSED = ConnectionRefusedError
EHOSTUNREACH = OSError
EALREADY = BlockingIOError
EINPROGRESS = BlockingIOError
EPERM = OSError
ENOENT = OSError
EIO = OSError
EBADF = OSError
EAGAIN = OSError
ENOMEM = OSError
EACCES = OSError
EEXIST = OSError
ENODEV = OSError
EISDIR = OSError
EINVAL = OSError
EOPNOTSUPP = OSError
EADDRINUSE = OSError
ECONNABORTED = OSError
ECONNRESET = OSError
ENOBUFS = OSError
ENOTCONN = OSError
ETIMEDOUT = OSError
ECONNREFUSED = OSError
EHOSTUNREACH = OSError
EALREADY = OSError
EINPROGRESS = OSError

bytearray

Toewijzing van array-slice met niet-ondersteund rechter operand

Voorbeeldcode:

b = bytearray(4)
b[0:1] = [1, 2]
print(b)

CPython output:

MicroPython output:

bytearray(b'\x01\x02\x00\x00\x00')
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError: array/bytes required on right side

bytes

bytes-objecten ondersteunen de methode .format()

Oorzaak: MicroPython streeft naar een meer uniforme implementatie: als zowel str als bytes __mod__() (de %-operator) ondersteunen, is het logisch om format() ook voor beide te ondersteunen. Ondersteuning voor __mod__ kan ook worden weggecompileerd, waardoor alleen format() overblijft voor bytes-opmaak.

Oplossing: Als CPython-compatibiliteit gewenst is, gebruik dan geen .format() op bytes-objecten.

Voorbeeldcode:

print(b"{}".format(1))

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
AttributeError: 'bytes' object has no attribute 'format'
b'1'

bytes() met sleutelwoordargumenten is niet geïmplementeerd

Oplossing: Geef de codering door als positioneel argument, bijv. print(bytes('abc', 'utf-8'))

Voorbeeldcode:

print(bytes("abc", encoding="utf8"))

CPython output:

MicroPython output:

b'abc'
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: keyword argument(s) not implemented - use normal args instead

Bytes-subscript met stap != 1 is niet geïmplementeerd

Oorzaak: MicroPython is sterk geoptimaliseerd voor geheugengebruik.

Oplossing: Gebruik een expliciete lus voor deze zeldzame bewerking.

Voorbeeldcode:

print(b"123"[0:3:2])

CPython output:

MicroPython output:

b'13'
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: only slices with step=1 (aka None) are supported

complex

MicroPython’s complex() accepts certain incorrect values that CPython rejects

Oorzaak: MicroPython is sterk geoptimaliseerd voor geheugengebruik.

Workaround: Do not use non-standard complex literals as argument to complex()

MicroPython’s complex() function accepts literals that contain a space and no sign between the real and imaginary parts, and interprets it as a plus.

Voorbeeldcode:

try:
    print(complex("1 1j"))
except ValueError:
    print("ValueError")

CPython output:

MicroPython output:

ValueError
(1+1j)

dict

De sleutelweergave van een woordenboek gedraagt zich niet als een verzameling.

Oorzaak: Niet geïmplementeerd.

Oplossing: Converteer sleutels expliciet naar een verzameling voordat u verzamelingsbewerkingen gebruikt.

Voorbeeldcode:

print({1: 2, 3: 4}.keys() & {1})

CPython output:

MicroPython output:

{1}
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
TypeError: unsupported types for __and__: 'dict_view', 'set'

float

MicroPython allows implicit conversion of objects in maths operations while CPython does not.

Oplossing: Objecten moeten worden omsloten met float(obj) voor compatibiliteit met CPython.

Voorbeeldcode:

class Test:
    def __float__(self):
        return 0.5


print(2.0 * Test())

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 14, in <module>
TypeError: unsupported operand type(s) for *: 'float' and 'Test'
1.0

int

De methode bit_length bestaat niet.

Oorzaak: De methode bit_length is niet geïmplementeerd.

Oplossing: Vermijd het gebruik van deze methode in MicroPython.

Voorbeeldcode:

x = 255
print("{} is {} bits long.".format(x, x.bit_length()))

CPython output:

MicroPython output:

255 is 8 bits long.
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
AttributeError: 'int' object has no attribute 'bit_length'

Geen int-conversie beschikbaar voor van int afgeleide typen

Oplossing: Vermijd het afleiden van subklassen van ingebouwde typen tenzij echt noodzakelijk. Geef de voorkeur aan https://en.wikipedia.org/wiki/Composition_over_inheritance .

Voorbeeldcode:

class A(int):
    __add__ = lambda self, other: A(int(self) + other)


a = A(42)
print(a + a)

CPython output:

MicroPython 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'

De methode to_bytes implementeert de parameter signed niet.

Oorzaak: De uitsluitend als sleutelwoordargument bruikbare parameter signed is niet geïmplementeerd voor int.to_bytes().

Wanneer het gehele getal negatief is, gedraagt MicroPython zich hetzelfde als CPython int.to_bytes(..., signed=True)

Wanneer het gehele getal niet-negatief is, gedraagt MicroPython zich hetzelfde als CPython int.to_bytes(..., signed=False).

(Het verschil is subtiel: in CPython kan een positief geheel getal geconverteerd met signed=True één byte extra vereisen in de uitvoerlengte, om de 0-tekenbit te kunnen bevatten.)

Oplossing: Wees voorzichtig bij het aanroepen van to_bytes() op een geheel getal dat negatief kan zijn.

Voorbeeldcode:

x = -1
print(x.to_bytes(1, "big"))

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 16, in <module>
OverflowError: can't convert negative int to unsigned
b'\xff'

list

Lijstverwijdering met stap != 1 is niet geïmplementeerd

Oplossing: Gebruik een expliciete lus voor deze zeldzame bewerking.

Voorbeeldcode:

l = [1, 2, 3, 4]
del l[0:4:2]
print(l)

CPython output:

MicroPython output:

[2, 4]
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError:

Opslaan van een lijst-slice met een niet-itereerbaar rechter operand is niet geïmplementeerd

Oorzaak: Het rechter operand is beperkt tot een tuple of list

Oplossing: Gebruik list(<iter>) als rechter operand om het itereerbare object naar een list te converteren

Voorbeeldcode:

l = [10, 20]
l[0:1] = range(4)
print(l)

CPython output:

MicroPython output:

[0, 1, 2, 3, 20]
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
TypeError: object 'range' isn't a tuple or list

Lijstopslag met stap != 1 is niet geïmplementeerd

Oplossing: Gebruik een expliciete lus voor deze zeldzame bewerking.

Voorbeeldcode:

l = [1, 2, 3, 4]
l[0:4:2] = [5, 6]
print(l)

CPython output:

MicroPython output:

[5, 2, 6, 4]
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError:

memoryview

Een memoryview kan ongeldig worden als de grootte van het doelobject wordt gewijzigd

Oorzaak: CPython voorkomt dat een bytearray- of io.bytesIO-object van grootte verandert zolang er een memoryview-object naar verwijst. MicroPython vereist dat de programmeur handmatig garandeert dat een object niet van grootte verandert zolang een memoryview ernaar verwijst.

In het ergste geval kan het wijzigen van de grootte van een object dat het doel is van een memoryview ertoe leiden dat de memoryview(s) verwijzen naar ongeldig vrijgegeven geheugen (een use-after-free-fout) en de MicroPython-runtime beschadigen.

Oplossing: Wijzig de grootte van een bytearray- of io.bytesIO-object waaraan een memoryview is toegewezen niet.

Voorbeeldcode:

b = bytearray(b"abcdefg")
m = memoryview(b)
b.extend(b"hijklmnop")
print(b, bytes(m))

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
BufferError: Existing exports of data: object cannot be re-sized
bytearray(b'abcdefghijklmnop') b'abcdefg'

range

Range objects with large start or stop arguments misbehave.

Cause: Intermediate calculations overflow the C mp_int_t type

Workaround: Avoid using such ranges

Voorbeeldcode:

from sys import maxsize

# A range including `maxsize-1` cannot be created
try:
    print(range(-maxsize - 1, 0))
except OverflowError:
    print("OverflowError")

# A range with `stop-start` exceeding sys.maxsize has incorrect len(), while CPython cannot calculate len().
try:
    print(len(range(-maxsize, maxsize)))
except OverflowError:
    print("OverflowError")

# A range with `stop-start` exceeding sys.maxsize has incorrect len()
try:
    print(len(range(-maxsize, maxsize, maxsize)))
except OverflowError:
    print("OverflowError")

CPython output:

MicroPython output:

range(-9223372036854775808, 0)
OverflowError
2
OverflowError
0
0

str

MicroPython accepts the “,” grouping option with any radix, unlike CPython

Cause: To reduce code size, MicroPython does not issue an error for this combination

Workaround: Do not use a format string like {:,b} if CPython compatibility is required.

Voorbeeldcode:

try:
    print("{:,b}".format(99))
except ValueError:
    print("ValueError")
try:
    print("{:,x}".format(99))
except ValueError:
    print("ValueError")
try:
    print("{:,o}".format(99))
except ValueError:
    print("ValueError")

CPython output:

MicroPython output:

ValueError
ValueError
ValueError
110,0011
63
143

MicroPython accepts but does not properly implement the “,” or “_” grouping character for float values

Cause: To reduce code size, MicroPython does not implement this combination. Grouping characters will not appear in the number’s significant digits and will appear at incorrect locations in leading zeros.

Workaround: Do not use a format string like {:,f} if exact CPython compatibility is required.

Voorbeeldcode:

print("{:,f}".format(3141.159))
print("{:_f}".format(3141.159))
print("{:011,.2f}".format(3141.159))
print("{:011_.2f}".format(3141.159))

CPython output:

MicroPython output:

3,141.159000
3_141.159000
0,003,141.16
0_003_141.16
3141.159000
3141.159000
000,3141.16
0_003141.16

Attributen/subscript zijn niet geïmplementeerd

Voorbeeldcode:

print("{a[0]}".format(a=[1, 2]))

CPython output:

MicroPython output:

1
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: attributes not supported

str(…) met sleutelwoordargumenten is niet geïmplementeerd

Oplossing: Geef het coderingsformaat rechtstreeks op, bijv. print(bytes('abc', 'utf-8'))

Voorbeeldcode:

print(str(b"abc", encoding="utf8"))

CPython output:

MicroPython output:

abc
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: keyword argument(s) not implemented - use normal args instead

str.ljust() en str.rjust() zijn niet geïmplementeerd

Oorzaak: MicroPython is sterk geoptimaliseerd voor geheugengebruik. Er zijn eenvoudige alternatieven beschikbaar.

Oplossing: Gebruik in plaats van s.ljust(10) de expressie "%-10s" % s, en in plaats van s.rjust(10) de expressie "% 10s" % s. Als alternatief: "{:<10}".format(s) of "{:>10}".format(s).

Voorbeeldcode:

print("abc".ljust(10))

CPython output:

MicroPython output:

abc
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
AttributeError: 'str' object has no attribute 'ljust'

None als eerste argument voor rsplit, zoals str.rsplit(None, n), is niet geïmplementeerd

Voorbeeldcode:

print("a a a".rsplit(None, 1))

CPython output:

MicroPython output:

['a a', 'a']
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: rsplit(None,n)

Subscript met stap != 1 is nog niet geïmplementeerd

Voorbeeldcode:

print("abcdefghi"[0:9:2])

CPython output:

MicroPython output:

acegi
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: only slices with step=1 (aka None) are supported

tuple

Tuple-uitlezen met stap != 1 is niet geïmplementeerd

Voorbeeldcode:

print((1, 2, 3, 4)[0:4:2])

CPython output:

MicroPython output:

(1, 3)
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: only slices with step=1 (aka None) are supported