Eingebaute Typen¶
Generated Fri 19 Jun 2026 22:08:45 UTC
Ausnahme¶
Alle Ausnahmen haben lesbare value- und errno-Attribute, nicht nur StopIteration und OSError.¶
Ursache: MicroPython ist auf die Reduzierung der Codegröße optimiert.
Abhilfe: Verwenden Sie value nur bei StopIteration-Ausnahmen und errno nur bei OSError-Ausnahmen. Verlassen Sie sich bei anderen Ausnahmen nicht auf diese Attribute.
Beispielcode:
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
|
Ausnahmeverkettung nicht implementiert¶
Beispielcode:
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:
|
Benutzerdefinierte Attribute für eingebaute Ausnahmen werden nicht unterstützt¶
Ursache: MicroPython ist stark auf Speicherverbrauch optimiert.
Abhilfe: Verwenden Sie benutzerdefinierte Unterklassen von Ausnahmen.
Beispielcode:
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'
|
Eine Ausnahme in einer while-Schleifenbedingung kann eine unerwartete Zeilennummer aufweisen¶
Ursache: Bedingungsprüfungen sind so optimiert, dass sie am Ende des Schleifenkörpers erfolgen, und diese Zeilennummer wird gemeldet.
Beispielcode:
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
|
Die Methode Exception.__init__ existiert nicht.¶
Ursache: Die Unterklassenbildung nativer Klassen wird in MicroPython nicht vollständig unterstützt.
Abhilfe: Verwenden Sie stattdessen super():
class A(Exception):
def __init__(self):
super().__init__()
Beispielcode:
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.
Beispielcode:
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¶
Array-Slice-Zuweisung mit nicht unterstützter rechter Seite¶
Beispielcode:
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-Objekte unterstützen die Methode .format()¶
Ursache: MicroPython strebt eine gleichmäßigere Implementierung an. Da sowohl str als auch bytes __mod__() (den %-Operator) unterstützen, ist es sinnvoll, format() für beide zu unterstützen. Die Unterstützung für __mod__ kann auch herauscompiliert werden, sodass nur format() für die Formatierung von bytes übrig bleibt.
Abhilfe: Wenn Sie CPython-Kompatibilität benötigen, verwenden Sie .format() nicht auf bytes-Objekten.
Beispielcode:
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() mit Schlüsselwortargumenten nicht implementiert¶
Abhilfe: Übergeben Sie die Kodierung als Positionsargument, z. B. print(bytes('abc', 'utf-8'))
Beispielcode:
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-Subskription mit Schritt != 1 nicht implementiert¶
Ursache: MicroPython ist stark auf Speicherverbrauch optimiert.
Abhilfe: Verwenden Sie für diese sehr seltene Operation eine explizite Schleife.
Beispielcode:
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¶
Ursache: MicroPython ist stark auf Speicherverbrauch optimiert.
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.
Beispielcode:
try:
print(complex("1 1j"))
except ValueError:
print("ValueError")
CPython output: | MicroPython output: |
ValueError
| (1+1j)
|
dict¶
Die Schlüsselansicht eines Dictionarys verhält sich nicht wie eine Menge.¶
Ursache: Nicht implementiert.
Abhilfe: Konvertieren Sie die Schlüssel explizit in eine Menge, bevor Sie Mengenoperationen verwenden.
Beispielcode:
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.¶
Abhilfe: Für die Kompatibilität mit CPython sollten Objekte mit float(obj) umgewandelt werden.
Beispielcode:
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¶
Die Methode bit_length existiert nicht.¶
Ursache: Die Methode bit_length ist nicht implementiert.
Abhilfe: Vermeiden Sie die Verwendung dieser Methode in MicroPython.
Beispielcode:
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'
|
Keine int-Konvertierung für von int abgeleitete Typen verfügbar¶
Abhilfe: Vermeiden Sie die Unterklassenbildung eingebauter Typen, wenn es nicht wirklich notwendig ist. Bevorzugen Sie https://en.wikipedia.org/wiki/Composition_over_inheritance .
Beispielcode:
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'
|
Die Methode to_bytes implementiert den Parameter signed nicht.¶
Ursache: Der nur als Schlüsselwort verwendbare Parameter signed ist für int.to_bytes() nicht implementiert.
Wenn die Ganzzahl negativ ist, verhält sich MicroPython genauso wie CPython int.to_bytes(..., signed=True)
Wenn die Ganzzahl nicht negativ ist, verhält sich MicroPython genauso wie CPython int.to_bytes(..., signed=False).
(Der Unterschied ist subtil: In CPython kann eine positive Ganzzahl, die mit signed=True konvertiert wird, ein Byte mehr in der Ausgabelänge benötigen, um das Vorzeichenbit 0 unterzubringen.)
Abhilfe: Seien Sie vorsichtig beim Aufruf von to_bytes() auf einem Ganzzahlwert, der negativ sein könnte.
Beispielcode:
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¶
Listenlöschung mit Schritt != 1 nicht implementiert¶
Abhilfe: Verwenden Sie für diese seltene Operation eine explizite Schleife.
Beispielcode:
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:
|
Listen-Slice-Speicherung mit nicht iterierbarem Wert auf der rechten Seite ist nicht implementiert¶
Ursache: Die rechte Seite muss ein Tupel oder eine Liste sein
Abhilfe: Verwenden Sie list(<iter>) auf der rechten Seite, um das Iterable in eine Liste zu konvertieren
Beispielcode:
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
|
Listen-Speicherung mit Schritt != 1 nicht implementiert¶
Abhilfe: Verwenden Sie für diese seltene Operation eine explizite Schleife.
Beispielcode:
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¶
memoryview kann ungültig werden, wenn das Zielobjekt in der Größe verändert wird¶
Ursache: CPython verhindert, dass ein bytearray- oder io.bytesIO-Objekt seine Größe ändert, solange ein memoryview-Objekt darauf verweist. MicroPython verlangt, dass der Programmierer manuell sicherstellt, dass ein Objekt nicht in der Größe verändert wird, solange ein memoryview darauf verweist.
Im schlimmsten Fall kann die Größenänderung eines Objekts, auf das ein memoryview verweist, dazu führen, dass das memoryview auf ungültigen, bereits freigegebenen Speicher verweist (ein Use-after-free-Fehler) und die MicroPython-Laufzeit beschädigt.
Abhilfe: Ändern Sie nicht die Größe eines bytearray- oder io.bytesIO-Objekts, dem ein memoryview zugewiesen ist.
Beispielcode:
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
Beispielcode:
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.
Beispielcode:
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.
Beispielcode:
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
|
Attribute/Subskript nicht implementiert¶
Beispielcode:
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(…) mit Schlüsselwortargumenten nicht implementiert¶
Abhilfe: Geben Sie das Kodierungsformat direkt an. z. B. print(bytes('abc', 'utf-8'))
Beispielcode:
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() und str.rjust() nicht implementiert¶
Ursache: MicroPython ist stark auf Speicherverbrauch optimiert. Einfache Umgehungslösungen sind verfügbar.
Abhilfe: Verwenden Sie statt s.ljust(10) den Ausdruck "%-10s" % s und statt s.rjust(10) den Ausdruck "% 10s" % s. Alternativ "{:<10}".format(s) oder "{:>10}".format(s).
Beispielcode:
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 erstes Argument für rsplit wie str.rsplit(None, n) nicht implementiert¶
Beispielcode:
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)
|
Subskript mit Schritt != 1 ist noch nicht implementiert¶
Beispielcode:
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¶
Tupel-Zugriff mit Schritt != 1 nicht implementiert¶
Beispielcode:
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
|