内置类型¶
2021 年 7 月 9 日星期五 00:08:56 UTC 生成
例外¶
所有异常都具有可读value
和errno
属性,而不仅仅是 StopIteration
和 OSError
。¶
原因: MicroPython 经过优化以减少代码大小。
解决方法:只使用value
上StopIteration
的异常,并 errno
在 OSError
异常。不要在其他异常中使用或依赖这些属性。
示例代码:
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努力成为一个更经常的实现,所以如果这两个str
和 bytes
支持 __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'
|
整数¶
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
|