Tipuri built-in¶
Generated Fri 19 Jun 2026 22:08:45 UTC
Excepție¶
Toate excepțiile au atributele value și errno lizibile, nu doar StopIteration și OSError.¶
Cauză: MicroPython este optimizat pentru a reduce dimensiunea codului.
Soluție alternativă: Folosiți value doar pe excepțiile StopIteration și errno doar pe excepțiile OSError. Nu utilizați și nu vă bazați pe aceste atribute pentru alte excepții.
Cod exemplu:
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
|
Înlănțuirea excepțiilor nu este implementată¶
Cod exemplu:
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:
|
Atributele definite de utilizator pentru excepțiile built-in nu sunt suportate¶
Cauză: MicroPython este optimizat în mare măsură pentru utilizarea memoriei.
Soluție alternativă: Folosiți subclase de excepții definite de utilizator.
Cod exemplu:
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'
|
O excepție în condiția buclei while poate indica un număr de linie neașteptat¶
Cauză: Verificările condițiilor sunt optimizate pentru a se produce la sfârșitul corpului buclei, iar acel număr de linie este raportat.
Cod exemplu:
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__ nu există.¶
Cauză: Subclasificarea claselor native nu este complet suportată în MicroPython.
Soluție alternativă: Apelați folosind super() în schimb:
class A(Exception):
def __init__(self):
super().__init__()
Cod exemplu:
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.
Cod exemplu:
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¶
Atribuirea unui segment de array cu o valoare RHS nesuportată¶
Cod exemplu:
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¶
Obiectele bytes acceptă metoda .format()¶
Cauză: MicroPython tinde să fie o implementare mai uniformă, deci dacă atât str cât și bytes suportă __mod__() (operatorul %), are sens să suporte format() pentru amândouă. Suportul pentru __mod__ poate fi, de asemenea, exclus la compilare, rămânând doar format() pentru formatarea bytes.
Soluție alternativă: Dacă vă interesează compatibilitatea cu CPython, nu folosiți .format() pe obiecte bytes.
Cod exemplu:
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() cu argumente cheie nu este implementat¶
Soluție alternativă: Transmiteți codificarea ca parametru pozițional, de ex. print(bytes('abc', 'utf-8'))
Cod exemplu:
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
|
Subscrierea bytes cu pas != 1 nu este implementată¶
Cauză: MicroPython este optimizat în mare măsură pentru utilizarea memoriei.
Soluție alternativă: Folosiți o buclă explicită pentru această operație foarte rară.
Cod exemplu:
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¶
Cauză: MicroPython este optimizat în mare măsură pentru utilizarea memoriei.
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.
Cod exemplu:
try:
print(complex("1 1j"))
except ValueError:
print("ValueError")
CPython output: | MicroPython output: |
ValueError
| (1+1j)
|
dict¶
Vizualizarea cheilor dicționarului nu se comportă ca o mulțime.¶
Cauză: Nu este implementat.
Soluție alternativă: Convertiți explicit cheile într-o mulțime înainte de a folosi operații pe mulțimi.
Cod exemplu:
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.¶
Soluție alternativă: Obiectele trebuie înfășurate în float(obj) pentru compatibilitate cu CPython.
Cod exemplu:
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 nu există.¶
Cauză: Metoda bit_length nu este implementată.
Soluție alternativă: Evitați folosirea acestei metode în MicroPython.
Cod exemplu:
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'
|
Nu există conversie int disponibilă pentru tipurile derivate din int¶
Soluție alternativă: Evitați subclasificarea tipurilor built-in dacă nu este absolut necesar. Preferați https://en.wikipedia.org/wiki/Composition_over_inheritance .
Cod exemplu:
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 nu implementează parametrul signed.¶
Cauză: Parametrul exclusiv cheie signed nu este implementat pentru int.to_bytes().
Când numărul întreg este negativ, MicroPython se comportă la fel ca CPython int.to_bytes(..., signed=True)
Când numărul întreg este non-negativ, MicroPython se comportă la fel ca CPython int.to_bytes(..., signed=False).
(Diferența este subtilă, dar în CPython un număr întreg pozitiv convertit cu signed=True poate necesita un byte în plus în lungimea de ieșire, pentru a încadra bitul de semn 0.)
Soluție alternativă: Fiți atenți când apelați to_bytes() pe o valoare întreagă care poate fi negativă.
Cod exemplu:
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¶
Ștergerea din listă cu pas != 1 nu este implementată¶
Soluție alternativă: Folosiți o buclă explicită pentru această operație rară.
Cod exemplu:
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:
|
Stocarea unui segment de listă cu o valoare non-iterabilă pe RHS nu este implementată¶
Cauză: RHS este restricționat la un tuplu sau o listă
Soluție alternativă: Folosiți list(<iter>) pe RHS pentru a converti iterabilul într-o listă
Cod exemplu:
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
|
Stocarea în listă cu pas != 1 nu este implementată¶
Soluție alternativă: Folosiți o buclă explicită pentru această operație rară.
Cod exemplu:
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 poate deveni invalid dacă ținta sa este redimensionată¶
Cauză: CPython împiedică un obiect bytearray sau io.bytesIO să își schimbe dimensiunea atâta timp cât există un obiect memoryview care îl referențiază. MicroPython cere programatorului să se asigure manual că un obiect nu este redimensionat cât timp îl referențiază vreun memoryview.
În cel mai rău caz, redimensionarea unui obiect care este ținta unui memoryview poate face ca memoryview-ul (sau memoryview-urile) să referențieze memorie eliberată invalidă (un bug use-after-free) și să corupă mediul de execuție MicroPython.
Soluție alternativă: Nu modificați dimensiunea niciunui obiect bytearray sau io.bytesIO care are un memoryview atribuit.
Cod exemplu:
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
Cod exemplu:
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.
Cod exemplu:
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.
Cod exemplu:
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
|
Atributele/subscrierea nu sunt implementate¶
Cod exemplu:
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(…) cu argumente cheie nu este implementat¶
Soluție alternativă: Introduceți formatul de codificare direct, de ex. print(bytes('abc', 'utf-8'))
Cod exemplu:
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() nu sunt implementate¶
Cauză: MicroPython este optimizat în mare măsură pentru utilizarea memoriei. Există soluții alternative simple.
Soluție alternativă: În loc de s.ljust(10) folosiți "%-10s" % s, în loc de s.rjust(10) folosiți "% 10s" % s. Alternativ, "{:<10}".format(s) sau "{:>10}".format(s).
Cod exemplu:
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 ca prim argument pentru rsplit, cum ar fi str.rsplit(None, n), nu este implementat¶
Cod exemplu:
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)
|
Subscrierea cu pas != 1 nu este încă implementată¶
Cod exemplu:
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¶
Încărcarea tuplului cu pas != 1 nu este implementată¶
Cod exemplu:
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
|