Встроенные типы

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