Встроенные типы¶
Generated Fri 19 Jun 2026 22:08:45 UTC
Исключение¶
Все исключения имеют читаемые атрибуты value и errno, а не только StopIteration и OSError.¶
Причина: MicroPython оптимизирован для уменьшения размера кода.
Обходное решение: Используйте value только для исключений StopIteration, а errno — только для OSError. Не используйте и не полагайтесь на эти атрибуты в других исключениях.
Пример кода:
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
|
Цепочки исключений не реализованы¶
Пример кода:
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:
|
Пользовательские атрибуты для встроенных исключений не поддерживаются¶
Причина: MicroPython высоко оптимизирован для использования памяти.
Обходное решение: Используйте пользовательские подклассы исключений.
Пример кода:
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'
|
Исключение в условии цикла while может содержать неожиданный номер строки¶
Причина: Проверка условия оптимизирована для выполнения в конце тела цикла, и именно этот номер строки указывается.
Пример кода:
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
|
Метод Exception.__init__ не существует.¶
Причина: Создание подклассов встроенных классов не полностью поддерживается в MicroPython.
Обходное решение: Используйте вместо этого вызов через super():
class A(Exception):
def __init__(self):
super().__init__()
Пример кода:
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.
Пример кода:
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¶
Присваивание среза массива с неподдерживаемой правой частью¶
Пример кода:
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 поддерживают метод .format()¶
Причина: MicroPython стремится быть более единообразной реализацией: если и str, и bytes поддерживают __mod__() (оператор %), логично поддерживать format() для обоих типов. Поддержку __mod__ можно отключить при компиляции, и тогда для форматирования bytes останется только format().
Обходное решение: Если важна совместимость с CPython, не используйте .format() на объектах bytes.
Пример кода:
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() с именованными аргументами не реализован¶
Обходное решение: Передавайте кодировку как позиционный параметр, например print(bytes('abc', 'utf-8'))
Пример кода:
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 с шагом != 1 не реализована¶
Причина: MicroPython высоко оптимизирован для использования памяти.
Обходное решение: Используйте явный цикл для этой редкой операции.
Пример кода:
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¶
Причина: MicroPython высоко оптимизирован для использования памяти.
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.
Пример кода:
try:
print(complex("1 1j"))
except ValueError:
print("ValueError")
CPython output: | MicroPython output: |
ValueError
| (1+1j)
|
dict¶
Представление ключей словаря не ведёт себя как множество.¶
Причина: Не реализовано.
Обходное решение: Явно преобразуйте ключи в множество перед применением операций над множествами.
Пример кода:
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.¶
Обходное решение: Оберните объекты в float(obj) для совместимости с CPython.
Пример кода:
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¶
Метод bit_length отсутствует.¶
Причина: Метод bit_length не реализован.
Обходное решение: Избегайте использования этого метода в MicroPython.
Пример кода:
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'
|
Преобразование в int для типов, производных от int, недоступно¶
Обходное решение: Избегайте создания подклассов встроенных типов без необходимости. Предпочитайте https://en.wikipedia.org/wiki/Composition_over_inheritance .
Пример кода:
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'
|
Метод to_bytes не реализует параметр signed.¶
Причина: Именованный параметр signed не реализован для int.to_bytes().
Когда целое число отрицательное, MicroPython ведёт себя так же, как CPython int.to_bytes(..., signed=True)
Когда целое число неотрицательное, MicroPython ведёт себя так же, как CPython int.to_bytes(..., signed=False).
(Разница незначительна, но в CPython положительное целое число, преобразованное с signed=True, может потребовать на один байт больше в выходной длине, чтобы вместить нулевой бит знака.)
Обходное решение: Будьте осторожны при вызове to_bytes() для целочисленного значения, которое может быть отрицательным.
Пример кода:
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¶
Удаление элементов списка с шагом != 1 не реализовано¶
Обходное решение: Используйте явный цикл для этой редкой операции.
Пример кода:
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:
|
Сохранение среза списка с неитерируемым объектом в правой части не реализовано¶
Причина: Правая часть ограничена кортежем или списком
Обходное решение: Используйте list(<iter>) в правой части для преобразования итерируемого объекта в список
Пример кода:
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
|
Сохранение элементов списка с шагом != 1 не реализовано¶
Обходное решение: Используйте явный цикл для этой редкой операции.
Пример кода:
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 может стать недействительным, если размер его цели изменяется¶
Причина: CPython запрещает изменение размера объекта bytearray или io.bytesIO, пока существует ссылающийся на него объект memoryview. MicroPython требует, чтобы программист вручную гарантировал, что размер объекта не изменяется, пока на него ссылается memoryview.
В худшем случае изменение размера объекта, являющегося целью memoryview, может привести к тому, что memoryview будут ссылаться на недействительную освобождённую память (ошибка использования после освобождения) и повредить среду выполнения MicroPython.
Обходное решение: Не изменяйте размер объектов bytearray или io.bytesIO, на которые назначен memoryview.
Пример кода:
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
Пример кода:
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.
Пример кода:
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.
Пример кода:
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
|
Атрибуты/индексирование не реализованы¶
Пример кода:
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(…) с именованными аргументами не реализован¶
Обходное решение: Укажите формат кодировки напрямую, например print(bytes('abc', 'utf-8'))
Пример кода:
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() и str.rjust() не реализованы¶
Причина: MicroPython высоко оптимизирован для использования памяти. Доступны простые обходные решения.
Обходное решение: Вместо s.ljust(10) используйте "%-10s" % s, вместо s.rjust(10) — "% 10s" % s. Также можно использовать "{:<10}".format(s) или "{:>10}".format(s).
Пример кода:
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 в качестве первого аргумента rsplit, например str.rsplit(None, n), не реализован¶
Пример кода:
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)
|
Индексирование с шагом != 1 пока не реализовано¶
Пример кода:
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¶
Получение элементов кортежа с шагом != 1 не реализовано¶
Пример кода:
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
|