Các module¶
Generated Thu 18 Jun 2026 14:23:40 UTC
Tham số chỉ theo vị trí (Positional-only Parameters)¶
Để tiết kiệm kích thước mã, nhiều hàm chấp nhận đối số từ khóa trong CPython chỉ chấp nhận đối số vị trí trong MicroPython.
MicroPython đánh dấu các tham số chỉ theo vị trí theo cùng cách với CPython, bằng cách chèn / để đánh dấu cuối các tham số vị trí. Bất kỳ hàm nào có chữ ký kết thúc bằng / chỉ nhận các đối số vị trí. Để biết thêm chi tiết, xem PEP 570.
Ví dụ¶
Ví dụ, trong CPython 3.4, đây là chữ ký của constructor socket.socket
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
Tuy nhiên, chữ ký được ghi lại trong MicroPython là:
socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, /)
Dấu / ở cuối các tham số chỉ ra rằng tất cả chúng đều chỉ theo vị trí trong MicroPython. Đoạn mã sau hoạt động trong CPython nhưng không hoạt động trong hầu hết các cổng MicroPython:
import socket
s = socket.socket(type=socket.SOCK_DGRAM)
MicroPython sẽ báo lỗi ngoại lệ:
TypeError: function doesn't take keyword arguments
Đoạn mã sau sẽ hoạt động trong cả CPython và MicroPython:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
array¶
So sánh giữa các typecode khác nhau không được hỗ trợ¶
Nguyên nhân: Kích thước mã
Cách khắc phục: So sánh các phần tử riêng lẻ
Mã ví dụ:
import array
array.array("b", [1, 2]) == array.array("i", [1, 2])
CPython output: |
MicroPython output: |
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
NotImplementedError:
|
Kiểm tra tràn số chưa được triển khai¶
Nguyên nhân: MicroPython triển khai cắt bớt ngầm định để giảm kích thước mã và thời gian thực thi
Cách khắc phục: Nếu cần tương thích với CPython thì che mặt nạ giá trị một cách tường minh
Mã ví dụ:
import array
a = array.array("b", [257])
print(a)
CPython output: |
MicroPython output: |
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
OverflowError: signed char is greater than maximum
|
array('b', [1])
|
Tìm kiếm số nguyên chưa được triển khai¶
Mã ví dụ:
import array
print(1 in array.array("B", b"12"))
CPython output: |
MicroPython output: |
False
|
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
NotImplementedError:
|
Xóa mảng chưa được triển khai¶
Mã ví dụ:
import array
a = array.array("b", (1, 2, 3))
del a[1]
print(a)
CPython output: |
MicroPython output: |
array('b', [1, 3])
|
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
TypeError: 'array' object doesn't support item deletion
|
Đăng ký với bước != 1 chưa được triển khai¶
Mã ví dụ:
import array
a = array.array("b", (1, 2, 3))
print(a[3:2:2])
CPython output: |
MicroPython output: |
array('b')
|
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
NotImplementedError: only slices with step=1 (aka None) are supported
|
errno¶
MicroPython does not include ENOTSUP as a name for errno 95.¶
Cause: MicroPython does not implement the ENOTSUP canonical alias for EOPNOTSUPP added in CPython 3.2.
Workaround: Use errno.EOPNOTSUPP in place of errno.ENOTSUP.
Mã ví dụ:
import errno
print(f"{errno.errorcode[errno.EOPNOTSUPP]=!s}")
CPython output: |
MicroPython output: |
errno.errorcode[errno.EOPNOTSUPP]=ENOTSUP
|
errno.errorcode[errno.EOPNOTSUPP]=EOPNOTSUPP
|
json¶
Module JSON không báo lỗi ngoại lệ khi đối tượng không thể tuần tự hóa¶
Mã ví dụ:
import json
try:
print(json.dumps(b"shouldn't be able to serialise bytes"))
except TypeError:
print("TypeError")
CPython output: |
MicroPython output: |
TypeError
|
"shouldn't be able to serialise bytes"
|
os¶
Thuộc tính environ chưa được triển khai¶
Cách khắc phục: Sử dụng getenv, putenv và unsetenv
Mã ví dụ:
import os
try:
print(os.environ.get("NEW_VARIABLE"))
os.environ["NEW_VARIABLE"] = "VALUE"
print(os.environ["NEW_VARIABLE"])
except AttributeError:
print("should not get here")
print(os.getenv("NEW_VARIABLE"))
os.putenv("NEW_VARIABLE", "VALUE")
print(os.getenv("NEW_VARIABLE"))
CPython output: |
MicroPython output: |
None
VALUE
|
should not get here
None
VALUE
|
getenv trả về giá trị thực tế thay vì giá trị được lưu trong bộ nhớ đệm¶
Nguyên nhân: Thuộc tính environ chưa được triển khai
Mã ví dụ:
import os
print(os.getenv("NEW_VARIABLE"))
os.putenv("NEW_VARIABLE", "VALUE")
print(os.getenv("NEW_VARIABLE"))
CPython output: |
MicroPython output: |
None
None
|
None
VALUE
|
random¶
Phương thức getrandbits chỉ có thể trả về tối đa 32 bit mỗi lần.¶
Nguyên nhân: Trạng thái nội bộ của PRNG chỉ là 32 bit nên nó chỉ có thể trả về tối đa 32 bit dữ liệu mỗi lần.
Cách khắc phục: Nếu bạn cần một số có nhiều hơn 32 bit thì hãy sử dụng module random từ micropython-lib.
Mã ví dụ:
import random
x = random.getrandbits(64)
print("{}".format(x))
CPython output: |
MicroPython output: |
12327776399964966313
|
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
ValueError: bits must be 32 or less
|
Phương thức randint chỉ có thể trả về số nguyên tối đa bằng kích thước từ native.¶
Nguyên nhân: PRNG chỉ có thể tạo 32 bit trạng thái mỗi lần. Kết quả sau đó được chuyển đổi thành int có kích thước native thay vì đối tượng int đầy đủ.
Cách khắc phục: Nếu bạn cần số nguyên lớn hơn kích thước từ native, hãy sử dụng module random từ micropython-lib.
Mã ví dụ:
import random
x = random.randint(2**128 - 1, 2**128)
print("x={}".format(x))
CPython output: |
MicroPython output: |
x=340282366920938463463374607431768211456
|
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
OverflowError: overflow converting long int to machine word
|
struct¶
Struct pack with too few args, not checked by MicroPython¶
Mã ví dụ:
import struct
try:
print(struct.pack("bb", 1))
print("Should not get here")
except:
print("struct.error")
CPython output: |
MicroPython output: |
struct.error
|
b'\x01\x00'
Should not get here
|
Struct pack with too many args, not checked by MicroPython¶
Mã ví dụ:
import struct
try:
print(struct.pack("bb", 1, 2, 3))
print("Should not get here")
except:
print("struct.error")
CPython output: |
MicroPython output: |
struct.error
|
b'\x01\x02'
Should not get here
|
Struct pack with whitespace in format, whitespace ignored by CPython, error on MicroPython¶
Nguyên nhân: MicroPython được tối ưu hóa cho kích thước mã.
Cách khắc phục: Không sử dụng khoảng trắng trong chuỗi định dạng.
Mã ví dụ:
import struct
try:
print(struct.pack("b b", 1, 2))
print("Should have worked")
except:
print("struct.error")
CPython output: |
MicroPython output: |
b'\x01\x02'
Should have worked
|
struct.error
|
sys¶
Không thể ghi đè sys.stdin, sys.stdout và sys.stderr¶
Nguyên nhân: Chúng được lưu trữ trong bộ nhớ chỉ đọc.
Mã ví dụ:
import sys
sys.stdin = None
print(sys.stdin)
CPython output: |
MicroPython output: |
None
|
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
AttributeError: 'module' object has no attribute 'stdin'
|