内置类型

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

例外

所有异常都具有可读valueerrno属性,而不仅仅是 StopIterationOSError

原因: MicroPython 经过优化以减少代码大小。

解决方法:只使用valueStopIteration的异常,并 errnoOSError异常。不要在其他异常中使用或依赖这些属性。

示例代码:

e = Exception(1)
print(e.value)
print(e.errno)

CPy 输出:

uPy 输出:

Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
AttributeError: 'Exception' object has no attribute 'value'
1
1

未实现异常链

示例代码:

try:
    raise TypeError
except TypeError:
    raise ValueError

CPy 输出:

uPy 输出:

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

During handling of the above exception, another exception occurred:

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

不支持内置异常的用户定义属性

原因: MicroPython 针对内存使用进行了高度优化。

解决方法: 使用用户定义的异常子类。

示例代码:

e = Exception()
e.x = 0
print(e.x)

CPy 输出:

uPy 输出:

0
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
AttributeError: 'Exception' object has no attribute 'x'

while 循环条件中的异常可能具有意外的行号

原因:条件检查被优化为发生在循环体的末尾,并报告该行号。

示例代码:

l = ["-foo", "-bar"]

i = 0
while l[i][0] == "-":
    print("iter")
    i += 1

CPy 输出:

uPy 输出:

iter
iter
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
IndexError: list index out of range
iter
iter
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
IndexError: list index out of range

异常 __init__ 方法不存在。

原因: MicroPython 不完全支持子类化本机类。

解决方法:调用使用 super() instead:

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

示例代码:

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


a = A()

CPy 输出:

uPy 输出:

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__'

字节数组

不支持 RHS 的数组切片分配

示例代码:

b = bytearray(4)
b[0:1] = [1, 2]
print(b)

CPy 输出:

uPy 输出:

bytearray(b'\x01\x02\x00\x00\x00')
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError: array/bytes required on right side

字节

bytes 对象支持 .format() 方法

原因:MicroPython努力成为一个更经常的实现,所以如果这两个strbytes支持 __mod__()%运算符),它是有道理的,支持 format() 两个了。支持 __mod__ 也可以编译出来,只剩 format() 下字节格式。

解决方法:如果您对 CPython 兼容性感兴趣,请不要 .format() 在字节对象上使用。

示例代码:

print(b"{}".format(1))

CPy 输出:

uPy 输出:

Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
AttributeError: 'bytes' object has no attribute 'format'
b'1'

未实现关键字的 bytes()

解决方法: 将编码作为位置参数传递,例如print(bytes('abc', 'utf-8'))

示例代码:

print(bytes("abc", encoding="utf8"))

CPy 输出:

uPy 输出:

b'abc'
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
NotImplementedError: keyword argument(s) not yet implemented - use normal args instead

未实现步骤 != 1 的字节订阅

原因: MicroPython 针对内存使用进行了高度优化。

解决方法: 对这种非常罕见的操作使用显式循环。

示例代码:

print(b"123"[0:3:2])

CPy 输出:

uPy 输出:

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

字典

字典键视图不作为一个集合。

原因: 未实施。

解决方法:在使用集合操作之前,将键显式转换为集合。

示例代码:

print({1: 2, 3: 4}.keys() & {1})

CPy 输出:

uPy 输出:

{1}
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
TypeError: unsupported types for __and__: 'dict_view', 'set'

漂浮

uPy 和 CPython 输出格式可能不同

示例代码:

print("%.1g" % -9.9)

CPy 输出:

uPy 输出:

-1e+01
-10

整数

bit_length方法不存在。

原因:bit_length 方法没有实现。

解决方法: 避免在 MicroPython 上使用此方法。

示例代码:

x = 255
print("{} is {} bits long.".format(x, x.bit_length()))

CPy 输出:

uPy 输出:

255 is 8 bits long.
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
AttributeError: 'int' object has no attribute 'bit_length'

没有 int 派生类型的 int 转换可用

解决方法:除非确实需要,否则避免子类化内置类型。首选 https://en.wikipedia.org/wiki/Composition_over_inheritance

示例代码:

class A(int):
    __add__ = lambda self, other: A(int(self) + other)


a = A(42)
print(a + a)

CPy 输出:

uPy 输出:

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'

列表

列表删除步骤 != 1 未实现

解决方法: 对这种罕见的操作使用显式循环。

示例代码:

l = [1, 2, 3, 4]
del l[0:4:2]
print(l)

CPy 输出:

uPy 输出:

[2, 4]
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError:

未实现 RHS 上不可迭代的列表切片存储

原因: RHS 被限制为元组或列表

解决方法: list(<iter>) 在 RHS 上使用将可迭代对象转换为列表

示例代码:

l = [10, 20]
l[0:1] = range(4)
print(l)

CPy 输出:

uPy 输出:

[0, 1, 2, 3, 20]
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
TypeError: object 'range' isn't a tuple or list

未实现步骤 != 1 的列表存储

解决方法: 对这种罕见的操作使用显式循环。

示例代码:

l = [1, 2, 3, 4]
l[0:4:2] = [5, 6]
print(l)

CPy 输出:

uPy 输出:

[5, 2, 6, 4]
Traceback (most recent call last):
  File "<stdin>", line 8, in <module>
NotImplementedError:

字符串

未实现 str.endswith(s, start) 等开始/结束索引

示例代码:

print("abc".endswith("c", 1))

CPy 输出:

uPy 输出:

True
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
NotImplementedError: start/end indices

未实现属性/订阅

示例代码:

print("{a[0]}".format(a=[1, 2]))

CPy 输出:

uPy 输出:

1
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
NotImplementedError: attributes not supported yet

未实现关键字的 str(...)

解决方法 直接输入编码格式。例如 print(bytes('abc', 'utf-8'))

示例代码:

print(str(b"abc", encoding="utf8"))

CPy 输出:

uPy 输出:

abc
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
NotImplementedError: keyword argument(s) not yet implemented - use normal args instead

str.ljust() 和 str.rjust() 未实现

原因: MicroPython 针对内存使用进行了高度优化。可用的简单解决方法。

解决方法:"%-10s" % s代替s.ljust(10),用"% 10s" % s, "{:<10}".format(s)"{:>10}".format(s)代替s.rjust(10)

示例代码:

print("abc".ljust(10))

CPy 输出:

uPy 输出:

abc
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
AttributeError: 'str' object has no attribute 'ljust'

None 作为 rsplit 的第一个参数,例如 str.rsplit(None, n) 未实现

示例代码:

print("a a a".rsplit(None, 1))

CPy 输出:

uPy 输出:

['a a', 'a']
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
NotImplementedError: rsplit(None,n)

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

示例代码:

print("abcdefghi"[0:9:2])

CPy 输出:

uPy 输出:

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

元组

元组加载步骤 != 1 未实现

示例代码:

print((1, 2, 3, 4)[0:4:2])

CPy 输出:

uPy 输出:

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