模块

2021 年 7 月 9 日星期五 00:08:56 UTC 生成

大批

不支持不同类型代码之间的比较

原因:代码大小

解决方法:比较单个元素

示例代码:

import array

array.array("b", [1, 2]) == array.array("i", [1, 2])

CPy 输出:

uPy 输出:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError:

未实施溢出检查

原因:MicroPython 实现了隐式截断以减少代码大小和执行时间

解决方法:如果需要 CPython 兼容性,则显式屏蔽该值

示例代码:

import array

a = array.array("b", [257])
print(a)

CPy 输出:

uPy 输出:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
OverflowError: signed char is greater than maximum
array('b', [1])

寻找未实现的整数

示例代码:

import array

print(1 in array.array("B", b"12"))

CPy 输出:

uPy 输出:

False
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError:

未实现数组删除

示例代码:

import array

a = array.array("b", (1, 2, 3))
del a[1]
print(a)

CPy 输出:

uPy 输出:

array('b', [1, 3])
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
TypeError: 'array' object doesn't support item deletion

带有 step != 1 的下标尚未实现

示例代码:

import array

a = array.array("b", (1, 2, 3))
print(a[3:2:2])

CPy 输出:

uPy 输出:

array('b')
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
NotImplementedError: only slices with step=1 (aka None) are supported

内置函数

next() 的第二个参数未实现

原因:MicroPython 针对代码空间进行了优化。

解决方法:而不是使用:val = next(it, deflt)

try:
    val = next(it)
except StopIteration:
    val = deflt

示例代码:

print(next(iter(range(0)), 42))

CPy 输出:

uPy 输出:

42
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
TypeError: function takes 1 positional arguments but 2 were given

双端队列

双端队列未实现

解决方法: 使用常规列表。micropython-lib 实现了 collections.deque。

示例代码:

import collections

D = collections.deque()
print(D)

CPy 输出:

uPy 输出:

deque([])
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
TypeError: function missing 2 required positional arguments

json

当对象不可序列化时,JSON 模块不会抛出异常

示例代码:

import json

a = bytes(x for x in range(256))
try:
    z = json.dumps(a)
    x = json.loads(z)
    print("Should not get here")
except TypeError:
    print("TypeError")

CPy 输出:

uPy 输出:

TypeError
Should not get here

操作系统

environ 属性未实现

解决方法: 使用 getenv, putenvunsetenv

示例代码:

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"))

CPy 输出:

uPy 输出:

None
VALUE
should not get here
None
VALUE

getenv 返回实际值而不是缓存值

原因:environ 属性未实现

示例代码:

import os

print(os.getenv("NEW_VARIABLE"))
os.putenv("NEW_VARIABLE", "VALUE")
print(os.getenv("NEW_VARIABLE"))

CPy 输出:

uPy 输出:

None
None
None
VALUE

getenv只允许一个参数

解决方法:测试返回值是否为 None

示例代码:

import os

try:
    print(os.getenv("NEW_VARIABLE", "DEFAULT"))
except TypeError:
    print("should not get here")
    # this assumes NEW_VARIABLE is never an empty variable
    print(os.getenv("NEW_VARIABLE") or "DEFAULT")

CPy 输出:

uPy 输出:

DEFAULT
should not get here
DEFAULT

随机的

getrandbits 方法一次最多只能返回 32 位。

原因:PRNG 的内部状态只有 32 位,所以它一次最多只能返回 32 位的数据。

解决方法:如果您需要一个超过 32 位的数字,请使用 micropython-lib 中的随机模块。

示例代码:

import random


x = random.getrandbits(64)
print("{}".format(x))

CPy 输出:

uPy 输出:

14480283856151964251
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
ValueError: bits must be 32 or less

randint方法只能返回一个最多为原生字长的整数。

原因:PRNG 一次只能生成 32 位状态。然后将结果转换为原生大小的 int 而不是完整的 int 对象。

解决方法:如果您需要大于原生 wordsize 的整数,请使用 micropython-lib 中的随机模块。

示例代码:

import random


x = random.randint(2 ** 128 - 1, 2 ** 128)
print("x={}".format(x))

CPy 输出:

uPy 输出:

x=340282366920938463463374607431768211456
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
AttributeError: 'module' object has no attribute 'randint'

结构

参数太少的结构包,没有被 uPy 检查

示例代码:

import struct

try:
    print(struct.pack("bb", 1))
    print("Should not get here")
except:
    print("struct.error")

CPy 输出:

uPy 输出:

struct.error
b'\x01\x00'
Should not get here

参数过多的结构包,未由 uPy 检查

示例代码:

import struct

try:
    print(struct.pack("bb", 1, 2, 3))
    print("Should not get here")
except:
    print("struct.error")

CPy 输出:

uPy 输出:

struct.error
b'\x01\x02'
Should not get here

格式中带有空格的结构包,CPython 忽略空格,uPy 上出错

原因: MicroPython 针对代码大小进行了优化。

解决方法:不要在格式字符串中使用空格。

示例代码:

import struct

try:
    print(struct.pack("b b", 1, 2))
    print("Should have worked")
except:
    print("struct.error")

CPy 输出:

uPy 输出:

b'\x01\x02'
Should have worked
ustruct.error

系统

无法覆盖 sys.stdin、sys.stdout 和 sys.stderr

原因: 它们存储在只读存储器中。

示例代码:

import sys

sys.stdin = None
print(sys.stdin)

CPy 输出:

uPy 输出:

None
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
AttributeError: 'module' object has no attribute 'stdin'