Wbudowane typy¶
Generated Fri 19 Jun 2026 22:08:45 UTC
Wyjątek¶
Wszystkie wyjątki mają czytelne atrybuty value i errno, a nie tylko StopIteration i OSError.¶
Przyczyna: MicroPython jest zoptymalizowany w celu zmniejszenia rozmiaru kodu.
Obejście: Używaj value tylko na wyjątkach StopIteration i errno tylko na wyjątkach OSError. Nie używaj tych atrybutów ani nie polegaj na nich w przypadku innych wyjątków.
Przykładowy kod:
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
|
Łańcuchowanie wyjątków nie jest zaimplementowane¶
Przykładowy kod:
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:
|
Atrybuty zdefiniowane przez użytkownika dla wbudowanych wyjątków nie są obsługiwane¶
Przyczyna: MicroPython jest wysoce zoptymalizowany pod kątem użycia pamięci.
Obejście: Używaj podklas wyjątków zdefiniowanych przez użytkownika.
Przykładowy kod:
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'
|
Wyjątek w warunku pętli while może mieć nieoczekiwany numer wiersza¶
Przyczyna: Sprawdzanie warunków jest zoptymalizowane tak, aby następowało na końcu ciała pętli, i to ten numer wiersza jest raportowany.
Przykładowy kod:
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
|
Metoda Exception.__init__ nie istnieje.¶
Przyczyna: Dziedziczenie po klasach natywnych nie jest w pełni obsługiwane w MicroPython.
Obejście: Zamiast tego wywołaj używając super():
class A(Exception):
def __init__(self):
super().__init__()
Przykładowy kod:
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.
Przykładowy kod:
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¶
Przypisanie wycinka tablicy z nieobsługiwanym prawostronnym wyrażeniem¶
Przykładowy kod:
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¶
Obiekty bytes obsługują metodę .format()¶
Przyczyna: MicroPython dąży do bycia bardziej regularną implementacją, więc jeśli zarówno str, jak i bytes obsługują __mod__() (operator %), sensowne jest również obsługiwanie format() dla obu. Obsługa __mod__ może być też wyłączona podczas kompilacji, co pozostawia tylko format() do formatowania bytes.
Obejście: Jeśli zależy ci na zgodności z CPython, nie używaj .format() na obiektach bytes.
Przykładowy kod:
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() ze słowami kluczowymi nie jest zaimplementowane¶
Obejście: Przekaż kodowanie jako parametr pozycyjny, np. print(bytes('abc', 'utf-8'))
Przykładowy kod:
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
|
Indeksowanie bytes z krokiem != 1 nie jest zaimplementowane¶
Przyczyna: MicroPython jest wysoce zoptymalizowany pod kątem użycia pamięci.
Obejście: Użyj jawnej pętli dla tej bardzo rzadkiej operacji.
Przykładowy kod:
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¶
Przyczyna: MicroPython jest wysoce zoptymalizowany pod kątem użycia pamięci.
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.
Przykładowy kod:
try:
print(complex("1 1j"))
except ValueError:
print("ValueError")
CPython output: | MicroPython output: |
ValueError
| (1+1j)
|
dict¶
Widok kluczy słownika nie zachowuje się jak zbiór.¶
Przyczyna: Nie zaimplementowano.
Obejście: Przed użyciem operacji na zbiorach jawnie przekonwertuj klucze na zbiór.
Przykładowy kod:
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.¶
Obejście: Obiekty powinny być opakowywane w float(obj) dla zgodności z CPython.
Przykładowy kod:
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¶
Metoda bit_length nie istnieje.¶
Przyczyna: Metoda bit_length nie jest zaimplementowana.
Obejście: Unikaj używania tej metody w MicroPython.
Przykładowy kod:
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'
|
Brak dostępnej konwersji int dla typów pochodnych od int¶
Obejście: Unikaj dziedziczenia po wbudowanych typach, chyba że jest to naprawdę konieczne. Preferuj https://en.wikipedia.org/wiki/Composition_over_inheritance .
Przykładowy kod:
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'
|
Metoda to_bytes nie implementuje parametru signed.¶
Przyczyna: Parametr wyłącznie słowny kluczowy signed nie jest zaimplementowany dla int.to_bytes().
Gdy liczba całkowita jest ujemna, MicroPython zachowuje się tak samo jak CPython int.to_bytes(..., signed=True)
Gdy liczba całkowita jest nieujemna, MicroPython zachowuje się tak samo jak CPython int.to_bytes(..., signed=False).
(Różnica jest subtelna, ale w CPython dodatnia liczba całkowita konwertowana z signed=True może wymagać jednego bajtu więcej w długości wyjścia, aby zmieścić bit znaku 0.)
Obejście: Zachowaj ostrożność podczas wywoływania to_bytes() na wartości całkowitej, która może być ujemna.
Przykładowy kod:
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¶
Usuwanie elementów listy z krokiem != 1 nie jest zaimplementowane¶
Obejście: Użyj jawnej pętli dla tej rzadkiej operacji.
Przykładowy kod:
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:
|
Przechowywanie wycinka listy z nieiterowalnym prawostronnym wyrażeniem nie jest zaimplementowane¶
Przyczyna: Prawostronne wyrażenie jest ograniczone do krotki lub listy
Obejście: Użyj list(<iter>) po prawej stronie, aby przekonwertować iterowalny obiekt na listę
Przykładowy kod:
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
|
Przechowywanie elementów listy z krokiem != 1 nie jest zaimplementowane¶
Obejście: Użyj jawnej pętli dla tej rzadkiej operacji.
Przykładowy kod:
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 może stać się nieprawidłowy, jeśli jego cel zostanie zmieniony rozmiar¶
Przyczyna: CPython uniemożliwia zmienianie rozmiaru obiektu bytearray lub io.bytesIO, gdy istnieje obiekt memoryview odwołujący się do niego. MicroPython wymaga od programisty ręcznego zapewnienia, że obiekt nie jest zmieniany pod kątem rozmiaru, gdy jakikolwiek memoryview odwołuje się do niego.
W najgorszym przypadku zmiana rozmiaru obiektu będącego celem memoryview może spowodować, że memoryview będzie odwoływać się do nieprawidłowej zwolnionej pamięci (błąd use-after-free) i uszkodzić środowisko uruchomieniowe MicroPython.
Obejście: Nie zmieniaj rozmiaru żadnego obiektu bytearray ani io.bytesIO, do którego przypisany jest memoryview.
Przykładowy kod:
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
Przykładowy kod:
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.
Przykładowy kod:
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.
Przykładowy kod:
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
|
Atrybuty/indeksowanie nie są zaimplementowane¶
Przykładowy kod:
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(…) ze słowami kluczowymi nie jest zaimplementowane¶
Obejście: Podaj format kodowania bezpośrednio, np. print(bytes('abc', 'utf-8'))
Przykładowy kod:
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() i str.rjust() nie są zaimplementowane¶
Przyczyna: MicroPython jest wysoce zoptymalizowany pod kątem użycia pamięci. Dostępne są łatwe obejścia.
Obejście: Zamiast s.ljust(10) używaj "%-10s" % s, zamiast s.rjust(10) używaj "% 10s" % s. Alternatywnie "{:<10}".format(s) lub "{:>10}".format(s).
Przykładowy kod:
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 jako pierwszy argument dla rsplit, np. str.rsplit(None, n), nie jest zaimplementowane¶
Przykładowy kod:
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)
|
Indeksowanie z krokiem != 1 nie jest jeszcze zaimplementowane¶
Przykładowy kod:
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¶
Odczyt krotki z krokiem != 1 nie jest zaimplementowany¶
Przykładowy kod:
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
|