Tipe bawaan

Generated Thu 18 Jun 2026 19:58:13 UTC

Exception

Semua exception memiliki atribut value dan errno yang dapat dibaca, bukan hanya StopIteration dan OSError.

Penyebab: MicroPython dioptimalkan untuk mengurangi ukuran kode.

Solusi: Gunakan value hanya pada exception StopIteration, dan errno hanya pada exception OSError. Jangan gunakan atau mengandalkan atribut ini pada exception lain.

Contoh kode:

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

Rantai exception tidak diimplementasikan

Contoh kode:

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:

Atribut yang ditentukan pengguna untuk exception bawaan tidak didukung

Penyebab: MicroPython sangat dioptimalkan untuk penggunaan memori.

Solusi: Gunakan subkelas exception yang ditentukan pengguna.

Contoh kode:

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'

Exception dalam kondisi perulangan while mungkin memiliki nomor baris yang tidak terduga

Penyebab: Pemeriksaan kondisi dioptimalkan agar terjadi di akhir badan perulangan, dan nomor baris tersebut yang dilaporkan.

Contoh kode:

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

Metode Exception.__init__ tidak ada.

Penyebab: Pewarisan subkelas dari kelas asli tidak sepenuhnya didukung di MicroPython.

Solusi: Gunakan super() sebagai gantinya:

class A(Exception):
    def __init__(self):
        super().__init__()

Contoh kode:

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.

Contoh kode:

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

Penugasan irisan array dengan RHS yang tidak didukung

Contoh kode:

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

Objek bytes mendukung metode .format()

Penyebab: MicroPython berupaya menjadi implementasi yang lebih konsisten, sehingga jika str dan bytes keduanya mendukung __mod__() (operator %), maka masuk akal untuk mendukung format() untuk keduanya juga. Dukungan untuk __mod__ juga dapat dikompilasi keluar, yang hanya menyisakan format() untuk pemformatan bytes.

Solusi: Jika Anda ingin kompatibel dengan CPython, jangan gunakan .format() pada objek bytes.

Contoh kode:

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() dengan argumen kata kunci tidak diimplementasikan

Solusi: Berikan encoding sebagai parameter posisional, misalnya print(bytes('abc', 'utf-8'))

Contoh kode:

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

Subscript bytes dengan step != 1 tidak diimplementasikan

Penyebab: MicroPython sangat dioptimalkan untuk penggunaan memori.

Solusi: Gunakan perulangan eksplisit untuk operasi yang sangat jarang ini.

Contoh kode:

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

Penyebab: MicroPython sangat dioptimalkan untuk penggunaan memori.

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.

Contoh kode:

try:
    print(complex("1 1j"))
except ValueError:
    print("ValueError")

CPython output:

MicroPython output:

ValueError
(1+1j)

dict

Tampilan kunci dictionary tidak berperilaku seperti set.

Penyebab: Tidak diimplementasikan.

Solusi: Konversikan kunci secara eksplisit ke set sebelum menggunakan operasi set.

Contoh kode:

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.

Solusi: Objek harus dibungkus dalam float(obj) untuk kompatibilitas dengan CPython.

Contoh kode:

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

Metode bit_length tidak ada.

Penyebab: Metode bit_length tidak diimplementasikan.

Solusi: Hindari menggunakan metode ini di MicroPython.

Contoh kode:

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'

Tidak ada konversi int untuk tipe yang diturunkan dari int

Solusi: Hindari mewarisi subkelas dari tipe bawaan kecuali benar-benar diperlukan. Lebih baik gunakan https://en.wikipedia.org/wiki/Composition_over_inheritance .

Contoh kode:

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'

Metode to_bytes tidak mengimplementasikan parameter signed.

Penyebab: Parameter kata kunci signed tidak diimplementasikan untuk int.to_bytes().

Ketika bilangan bulat bernilai negatif, MicroPython berperilaku sama seperti CPython int.to_bytes(..., signed=True)

Ketika bilangan bulat bernilai non-negatif, MicroPython berperilaku sama seperti CPython int.to_bytes(..., signed=False).

(Perbedaannya halus, tetapi di CPython bilangan bulat positif yang dikonversi dengan signed=True mungkin memerlukan satu byte lebih dalam panjang output, untuk menampung bit tanda 0.)

Solusi: Berhati-hatilah saat memanggil to_bytes() pada nilai bilangan bulat yang mungkin negatif.

Contoh kode:

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

Penghapusan list dengan step != 1 tidak diimplementasikan

Solusi: Gunakan perulangan eksplisit untuk operasi yang jarang ini.

Contoh kode:

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:

Penyimpanan irisan list dengan non-iterable di RHS tidak diimplementasikan

Penyebab: RHS dibatasi hanya tuple atau list

Solusi: Gunakan list(<iter>) pada RHS untuk mengonversi iterable menjadi list

Contoh kode:

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

Penyimpanan list dengan step != 1 tidak diimplementasikan

Solusi: Gunakan perulangan eksplisit untuk operasi yang jarang ini.

Contoh kode:

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 dapat menjadi tidak valid jika target-nya diubah ukurannya

Penyebab: CPython mencegah objek bytearray atau io.bytesIO dari perubahan ukuran selama ada objek memoryview yang mereferensikannya. MicroPython mengharuskan programmer untuk memastikan secara manual bahwa suatu objek tidak diubah ukurannya selama ada memoryview yang mereferensikannya.

Dalam skenario terburuk, mengubah ukuran objek yang menjadi target memoryview dapat menyebabkan memoryview mereferensikan memori yang sudah dibebaskan (bug use-after-free) dan merusak runtime MicroPython.

Solusi: Jangan ubah ukuran objek bytearray atau io.bytesIO yang memiliki memoryview yang ditetapkan padanya.

Contoh kode:

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

Contoh kode:

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.

Contoh kode:

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.

Contoh kode:

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

Atribut/subscr tidak diimplementasikan

Contoh kode:

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(...) dengan argumen kata kunci tidak diimplementasikan

Solusi: Masukkan format encoding secara langsung. mis. print(bytes('abc', 'utf-8'))

Contoh kode:

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() dan str.rjust() tidak diimplementasikan

Penyebab: MicroPython sangat dioptimalkan untuk penggunaan memori. Solusi mudah tersedia.

Solusi: Alih-alih s.ljust(10) gunakan "%-10s" % s, alih-alih s.rjust(10) gunakan "% 10s" % s. Atau, "{:<10}".format(s) atau "{:>10}".format(s).

Contoh kode:

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 sebagai argumen pertama untuk rsplit seperti str.rsplit(None, n) tidak diimplementasikan

Contoh kode:

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)

Subscript dengan step != 1 belum diimplementasikan

Contoh kode:

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

Pemuatan tuple dengan step != 1 tidak diimplementasikan

Contoh kode:

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