Tipos integrados¶
Generated Fri 19 Jun 2026 22:08:45 UTC
Excepción¶
Todas las excepciones tienen atributos legibles value y errno, no solo StopIteration y OSError.¶
Causa: MicroPython está optimizado para reducir el tamaño del código.
Solución: Use value solo en excepciones StopIteration, y errno solo en excepciones OSError. No use ni dependa de estos atributos en otras excepciones.
Código de ejemplo:
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
|
El encadenamiento de excepciones no está implementado¶
Código de ejemplo:
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:
|
Los atributos definidos por el usuario para las excepciones integradas no están admitidos¶
Causa: MicroPython está muy optimizado para el uso de memoria.
Solución: Use subclases de excepciones definidas por el usuario.
Código de ejemplo:
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'
|
Una excepción en la condición de un bucle while puede tener un número de línea inesperado¶
Causa: Las verificaciones de condición están optimizadas para ocurrir al final del cuerpo del bucle, y ese número de línea es el que se reporta.
Código de ejemplo:
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
|
El método Exception.__init__ no existe.¶
Causa: La creación de subclases de clases nativas no está completamente admitida en MicroPython.
Solución: Use super() en su lugar:
class A(Exception):
def __init__(self):
super().__init__()
Código de ejemplo:
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.
Código de ejemplo:
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¶
La asignación de segmento de array con RHS no admitido¶
Código de ejemplo:
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¶
Los objetos bytes admiten el método .format()¶
Causa: MicroPython busca ser una implementación más regular, por lo que si tanto str como bytes admiten __mod__() (el operador %), tiene sentido admitir format() para ambos también. El soporte de __mod__ también puede excluirse en la compilación, dejando solo format() para el formateo de bytes.
Solución: Si le interesa la compatibilidad con CPython, no use .format() en objetos bytes.
Código de ejemplo:
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() con palabras clave no está implementado¶
Solución: Pase la codificación como argumento posicional, p. ej. print(bytes('abc', 'utf-8'))
Código de ejemplo:
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
|
La suscripción de bytes con paso != 1 no está implementada¶
Causa: MicroPython está muy optimizado para el uso de memoria.
Solución: Use un bucle explícito para esta operación muy poco frecuente.
Código de ejemplo:
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¶
Causa: MicroPython está muy optimizado para el uso de memoria.
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.
Código de ejemplo:
try:
print(complex("1 1j"))
except ValueError:
print("ValueError")
CPython output: | MicroPython output: |
ValueError
| (1+1j)
|
dict¶
La vista de claves de un diccionario no se comporta como un conjunto.¶
Causa: No está implementado.
Solución: Convierta las claves explícitamente a un conjunto antes de usar operaciones de conjuntos.
Código de ejemplo:
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.¶
Solución: Los objetos deben envolverse con float(obj) para compatibilidad con CPython.
Código de ejemplo:
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¶
El método bit_length no existe.¶
Causa: El método bit_length no está implementado.
Solución: Evite usar este método en MicroPython.
Código de ejemplo:
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'
|
No hay conversión a int disponible para tipos derivados de int¶
Solución: Evite crear subclases de tipos integrados a menos que sea realmente necesario. Prefiera https://en.wikipedia.org/wiki/Composition_over_inheritance .
Código de ejemplo:
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'
|
El método to_bytes no implementa el parámetro signed.¶
Causa: El parámetro de solo palabra clave signed no está implementado para int.to_bytes().
Cuando el entero es negativo, MicroPython se comporta igual que CPython int.to_bytes(..., signed=True)
Cuando el entero no es negativo, MicroPython se comporta igual que CPython int.to_bytes(..., signed=False).
(La diferencia es sutil, pero en CPython un entero positivo convertido con signed=True puede requerir un byte más en la longitud de salida, para dar cabida al bit de signo 0.)
Solución: Tenga cuidado al llamar a to_bytes() sobre un valor entero que pueda ser negativo.
Código de ejemplo:
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¶
La eliminación de lista con paso != 1 no está implementada¶
Solución: Use un bucle explícito para esta operación poco frecuente.
Código de ejemplo:
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:
|
El almacenamiento por segmento de lista con un no iterable en el RHS no está implementado¶
Causa: El RHS está restringido a ser una tupla o una lista
Solución: Use list(<iter>) en el RHS para convertir el iterable a una lista
Código de ejemplo:
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
|
El almacenamiento de lista con paso != 1 no está implementado¶
Solución: Use un bucle explícito para esta operación poco frecuente.
Código de ejemplo:
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¶
Una memoryview puede volverse inválida si su destino cambia de tamaño¶
Causa: CPython impide que un objeto bytearray o io.bytesIO cambie de tamaño mientras existe un objeto memoryview que lo referencia. MicroPython requiere que el programador se asegure manualmente de que un objeto no cambie de tamaño mientras alguna memoryview lo referencia.
En el peor caso, redimensionar un objeto que es el destino de una memoryview puede causar que la(s) memoryview(s) referencien memoria liberada inválida (un error de uso después de liberación) y corrompan el entorno de ejecución de MicroPython.
Solución: No cambie el tamaño de ningún objeto bytearray o io.bytesIO que tenga una memoryview asignada.
Código de ejemplo:
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
Código de ejemplo:
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.
Código de ejemplo:
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.
Código de ejemplo:
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
|
Atributos/suscripción no implementados¶
Código de ejemplo:
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(...) con palabras clave no está implementado¶
Solución: Ingrese el formato de codificación directamente. p. ej. print(bytes('abc', 'utf-8'))
Código de ejemplo:
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() y str.rjust() no están implementados¶
Causa: MicroPython está muy optimizado para el uso de memoria. Hay soluciones alternativas sencillas disponibles.
Solución: En lugar de s.ljust(10) use "%-10s" % s, en lugar de s.rjust(10) use "% 10s" % s. Alternativamente, "{:<10}".format(s) o "{:>10}".format(s).
Código de ejemplo:
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 como primer argumento de rsplit, como en str.rsplit(None, n), no está implementado¶
Código de ejemplo:
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)
|
La suscripción con paso != 1 aún no está implementada¶
Código de ejemplo:
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¶
La carga de tupla con paso != 1 no está implementada¶
Código de ejemplo:
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
|