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
|