Lenguaje principal

Generated Fri 19 Jun 2026 22:08:45 UTC

Clases

El método especial __del__ no está implementado para las clases definidas por el usuario

Código de ejemplo:

import gc


class Foo:
    def __del__(self):
        print("__del__")


f = Foo()
del f

gc.collect()

CPython output:

MicroPython output:

__del__

__init_subclass__ isn’t automatically called.

Cause: MicroPython does not currently implement PEP 487.

Workaround: Manually call __init_subclass__ after class creation if needed. e.g.:

class A(Base):
    pass
A.__init_subclass__()

Código de ejemplo:

class Base:
    @classmethod
    def __init_subclass__(cls):
        print(f"Base.__init_subclass__({cls.__name__})")


class A(Base):
    pass

CPython output:

MicroPython output:

Base.__init_subclass__(A)

__init_subclass__ isn’t an implicit classmethod.

Cause: MicroPython does not currently implement PEP 487. __init_subclass__ is not currently in the list of special-cased class/static methods.

Workaround: Decorate declarations of __init_subclass__ with @classmethod.

Código de ejemplo:

def regularize_spelling(text, prefix="bound_"):
    # for regularizing across the CPython "method" vs MicroPython "bound_method" spelling for the type of a bound classmethod
    if text.startswith(prefix):
        return text[len(prefix) :]
    return text


class A:
    def __init_subclass__(cls):
        pass

    @classmethod
    def manual_decorated(cls):
        pass


a = type(A.__init_subclass__).__name__
b = type(A.manual_decorated).__name__

print(regularize_spelling(a))
print(regularize_spelling(b))
if a != b:
    print("FAIL")

CPython output:

MicroPython output:

method
method
function
method
FAIL

MicroPython doesn’t support parameterized __init_subclass__ class customization.

Cause: MicroPython does not currently implement PEP 487. The MicroPython syntax tree does not include a kwargs node after the class inheritance list.

Workaround: Use class variables or another mechanism to specify base-class customizations.

Código de ejemplo:

class Base:
    @classmethod
    def __init_subclass__(cls, arg=None, **kwargs):
        cls.init_subclass_was_called = True
        print(f"Base.__init_subclass__({cls.__name__}, {arg=!r}, {kwargs=!r})")


class A(Base, arg="arg"):
    pass


# Regularize across MicroPython not automatically calling __init_subclass__ either.
if not getattr(A, "init_subclass_was_called", False):
    A.__init_subclass__()

CPython output:

MicroPython output:

Base.__init_subclass__(A, arg='arg', kwargs={})
Traceback (most recent call last):
  File "<stdin>", line 16, in <module>
TypeError: function doesn't take keyword arguments

__init_subclass__ can’t be defined a cooperatively-recursive way.

Cause: MicroPython does not currently implement PEP 487. The base object type does not have an __init_subclass__ implementation.

Workaround: Omit the recursive __init_subclass__ call unless it’s known that the grandparent also defines it.

Código de ejemplo:

class Base:
    @classmethod
    def __init_subclass__(cls, **kwargs):
        cls.init_subclass_was_called = True
        super().__init_subclass__(**kwargs)


class A(Base):
    pass


# Regularize across MicroPython not automatically calling __init_subclass__ either.
if not getattr(A, "init_subclass_was_called", False):
    A.__init_subclass__()

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 22, in <module>
  File "<stdin>", line 13, in __init_subclass__
AttributeError: 'super' object has no attribute '__init_subclass__'

El Orden de Resolución de Métodos (MRO) no es conforme con CPython

Causa: Orden de resolución de métodos en profundidad primero no exhaustivo

Solución: Evite jerarquías de clases complejas con herencia múltiple y anulaciones de métodos complejas. Tenga en cuenta que muchos lenguajes no admiten la herencia múltiple en absoluto.

Código de ejemplo:

class Foo:
    def __str__(self):
        return "Foo"


class C(tuple, Foo):
    pass


t = C((1, 2, 3))
print(t)

CPython output:

MicroPython output:

Foo
(1, 2, 3)

La deformación de nombres para miembros privados de clases no está implementada

Causa: El compilador de MicroPython no implementa la deformación de nombres para miembros privados de clases.

Solución: Evite usar o tener una colisión con nombres globales añadiendo manualmente un prefijo único al nombre del miembro privado de la clase.

Código de ejemplo:

def __print_string(string):
    print(string)


class Foo:
    def __init__(self, string):
        self.string = string

    def do_print(self):
        __print_string(self.string)


example_string = "Example String to print."

class_item = Foo(example_string)
print(class_item.string)

class_item.do_print()

CPython output:

MicroPython output:

Example String to print.
Traceback (most recent call last):
  File "<stdin>", line 26, in <module>
  File "<stdin>", line 18, in do_print
NameError: name '_Foo__print_string' is not defined. Did you mean: '__print_string'?
Example String to print.
Example String to print.

Al heredar tipos nativos, llamar a un método en __init__(self, ...) antes de super().__init__() lanza un AttributeError (o produce un fallo de segmentación si MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG no está habilitado).

Causa: MicroPython no tiene métodos __new__ y __init__ separados en los tipos nativos.

Solución: Llame a super().__init__() primero.

Código de ejemplo:

class L1(list):
    def __init__(self, a):
        self.append(a)


try:
    L1(1)
    print("OK")
except AttributeError:
    print("AttributeError")


class L2(list):
    def __init__(self, a):
        super().__init__()
        self.append(a)


try:
    L2(1)
    print("OK")
except AttributeError:
    print("AttributeError")

CPython output:

MicroPython output:

OK
OK
AttributeError
OK

Al heredar de múltiples clases, super() solo llama a una clase

Causa: Véase El Orden de Resolución de Métodos (MRO) no es conforme con CPython

Solución: Véase El Orden de Resolución de Métodos (MRO) no es conforme con CPython

Código de ejemplo:

class A:
    def __init__(self):
        print("A.__init__")


class B(A):
    def __init__(self):
        print("B.__init__")
        super().__init__()


class C(A):
    def __init__(self):
        print("C.__init__")
        super().__init__()


class D(B, C):
    def __init__(self):
        print("D.__init__")
        super().__init__()


D()

CPython output:

MicroPython output:

D.__init__
B.__init__
C.__init__
A.__init__
D.__init__
B.__init__
A.__init__

Llamar a una propiedad getter de super() en una subclase devolverá un objeto property, no el valor

Código de ejemplo:

class A:
    @property
    def p(self):
        return {"a": 10}


class AA(A):
    @property
    def p(self):
        return super().p


a = AA()
print(a.p)

CPython output:

MicroPython output:

{'a': 10}
<property>

Exceptions

Throwing a derived exception class instance in its __init__ without first calling super().__init__ is a TypeError

Cause: In MicroPython, an object is incompletely constructed if it does not call its superclass init function or return normally from its __init__. This prevents its usage in some circumstances.

Workaround: Call the superclass __init__ method before raising the exception.

Código de ejemplo:

class C(Exception):
    def __init__(self):
        raise self


class C1(Exception):
    def __init__(self):
        super().__init__()
        raise self


try:
    C()
except Exception as e:
    print(type(e).__name__)

try:
    C1()
except Exception as e:
    print(type(e).__name__)

CPython output:

MicroPython output:

C
C1
TypeError
C1

Funciones

Los mensajes de error para métodos pueden mostrar conteos de argumentos inesperados

Causa: MicroPython cuenta «self» como un argumento.

Solución: Interprete los mensajes de error teniendo en cuenta la información anterior.

Código de ejemplo:

try:
    [].append()
except Exception as e:
    print(e)

CPython output:

MicroPython output:

list.append() takes exactly one argument (0 given)
function takes 2 positional arguments but 1 were given

Los objetos función no tienen el atributo __module__

Causa: MicroPython está optimizado para reducir el tamaño del código y el uso de RAM.

Solución: Use sys.modules[function.__globals__['__name__']] para módulos no integrados.

Código de ejemplo:

def f():
    pass


print(f.__module__)

CPython output:

MicroPython output:

__main__
Traceback (most recent call last):
  File "<stdin>", line 13, in <module>
AttributeError: 'function' object has no attribute '__module__'

Los atributos definidos por el usuario para las funciones no están admitidos

Causa: MicroPython está muy optimizado para el uso de memoria.

Solución: Use un diccionario externo, p. ej. FUNC_X[f] = 0.

Código de ejemplo:

def f():
    pass


f.x = 0
print(f.x)

CPython output:

MicroPython output:

0
Traceback (most recent call last):
  File "<stdin>", line 13, in <module>
AttributeError: 'function' object has no attribute 'x'

Generador

El gestor de contexto __exit__() no se llama en un generador que no se ejecuta hasta completarse

Código de ejemplo:

class foo(object):
    def __enter__(self):
        print("Enter")

    def __exit__(self, *args):
        print("Exit")


def bar(x):
    with foo():
        while True:
            x += 1
            yield x


def func():
    g = bar(0)
    for _ in range(3):
        print(next(g))


func()

CPython output:

MicroPython output:

Enter
1
2
3
Exit
Enter
1
2
3

Tiempo de ejecución

Las variables locales no están incluidas en el resultado de locals()

Causa: MicroPython no mantiene un entorno local simbólico; está optimizado en una matriz de ranuras. Por lo tanto, las variables locales no son accesibles por nombre.

Código de ejemplo:

def test():
    val = 2
    print(locals())


test()

CPython output:

MicroPython output:

{'val': 2}
{'test': <function test at 0x7f5d74c05260>, '__name__': '__main__', '__file__': '<stdin>'}

El código que se ejecuta en la función eval() no tiene acceso a las variables locales

Causa: MicroPython no mantiene un entorno local simbólico; está optimizado en una matriz de ranuras. Por lo tanto, las variables locales no son accesibles por nombre. En la práctica, eval(expr) en MicroPython equivale a eval(expr, globals(), globals()).

Código de ejemplo:

val = 1


def test():
    val = 2
    print(val)
    eval("print(val)")


test()

CPython output:

MicroPython output:

2
2
2
1

f-strings

Las f-strings no admiten la concatenación con literales adyacentes si dichos literales contienen llaves

Causa: MicroPython está optimizado para el espacio de código.

Solución: Use el operador + entre cadenas literales cuando no sean ambas f-strings

Código de ejemplo:

x, y = 1, 2
print("aa" f"{x}")  # works
print(f"{x}" "ab")  # works
print("a{}a" f"{x}")  # fails
print(f"{x}" "a{}b")  # fails

CPython output:

MicroPython output:

aa1
1ab
a{}a1
1a{}b
aa1
1ab
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
IndexError: tuple index out of range

Las f-strings no pueden admitir expresiones que requieran análisis para resolver llaves y corchetes anidados desequilibrados

Causa: MicroPython está optimizado para el espacio de código.

Solución: Use siempre llaves y corchetes equilibrados en expresiones dentro de f-strings

Código de ejemplo:

print(f"{'hello { world'}")
print(f"{'hello ] world'}")

CPython output:

MicroPython output:

hello { world
hello ] world
Traceback (most recent call last):
  File "<stdin>", line 9
SyntaxError: invalid syntax

Las f-strings no admiten conversiones !a

Causa: MicroPython no implementa ascii()

Solución: Ninguna

Código de ejemplo:

f"{'unicode text'!a}"

CPython output:

MicroPython output:

Traceback (most recent call last):
  File "<stdin>", line 8
SyntaxError: invalid syntax

import

El atributo __path__ de un paquete tiene un tipo diferente (cadena simple en lugar de lista de cadenas) en MicroPython

Causa: MicroPython no admite paquetes de espacio de nombres divididos en el sistema de archivos. Además, el sistema de importación de MicroPython está muy optimizado para el uso mínimo de memoria.

Solución: Los detalles del manejo de importaciones son inherentemente dependientes de la implementación. No dependa de dichos detalles en aplicaciones portables.

Código de ejemplo:

import modules

print(modules.__path__)

CPython output:

MicroPython output:

['/home/runner/work/openmv-doc/openmv-doc/micropython/tests/cpydiff/modules']
../tests/cpydiff/modules

MicroPython no admite paquetes de espacio de nombres divididos en el sistema de archivos.

Causa: El sistema de importación de MicroPython está muy optimizado para la simplicidad, el uso mínimo de memoria y la mínima sobrecarga de búsqueda en el sistema de archivos.

Solución: No instale módulos que pertenezcan al mismo paquete de espacio de nombres en directorios diferentes. Para MicroPython, se recomienda tener como máximo rutas de búsqueda de módulos de 3 componentes: para la aplicación actual, por usuario (escribible) y para todo el sistema (no escribible).

Código de ejemplo:

import sys

sys.path.append(sys.path[1] + "/modules")
sys.path.append(sys.path[1] + "/modules2")

import subpkg.foo
import subpkg.bar

print("Two modules of a split namespace package imported")

CPython output:

MicroPython output:

Two modules of a split namespace package imported
Traceback (most recent call last):
  File "<stdin>", line 14, in <module>
ImportError: no module named 'subpkg.bar'