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
|