内置类型¶
Generated Wed 14 Aug 2024 09:10:45 UTC
异常¶
所有异常都具有可读的 value
和 errno
属性,不仅限于 StopIteration
和 OSError
。¶
原因: MicroPython 优化了代码大小。
解决方法: 仅在 StopIteration
异常上使用 value
,在 OSError
异常上使用 errno
。不要在其他异常上使用或依赖这些属性。
示例代码:
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'
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现异常链接¶
示例代码:
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
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
不支持内置异常的用户定义属性¶
原因: MicroPython 对内存使用进行了高度优化。
解决方法: 使用用户定义的异常子类。
示例代码:
e = Exception()
e.x = 0
print(e.x)
CPy输出: |
uPy输出: |
0
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
在 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
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
Exception.__init__ 方法不存在。¶
原因: 在 MicroPython 中并不完全支持对原生类进行子类化。
解决方法: 使用 super()
调用:
class A(Exception):
def __init__(self):
super().__init__()
示例代码:
class A(Exception):
def __init__(self):
Exception.__init__(self)
a = A()
CPy输出: |
uPy输出: |
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
字节数组¶
使用不受支持的 RHS 进行数组切片赋值¶
示例代码:
b = bytearray(4)
b[0:1] = [1, 2]
print(b)
CPy输出: |
uPy输出: |
bytearray(b'\x01\x02\x00\x00\x00')
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
bytes¶
bytes 对象支持 .format() 方法¶
原因: MicroPython 力求实现更规范的实现,因此如果 str
和 bytes
都支持 __mod__()
(% 运算符),那么支持 format()
对于两者都是有意义的。对于 __mod__
的支持也可以编译出来,这样就只剩下了字节格式化的 format()
。
解决方法: 如果你关心与 CPython 的兼容性,请不要在 bytes 对象上使用 .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'
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现带有关键字的 bytes() 方法¶
解决方法: 将编码作为位置参数传递,例如 print(bytes('abc', 'utf-8'))
示例代码:
print(bytes("abc", encoding="utf8"))
CPy输出: |
uPy输出: |
b'abc'
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现step != 1的字节订阅¶
原因: MicroPython 对内存使用进行了高度优化。
解决方法: 对于这种非常罕见的操作,请使用显式循环。
示例代码:
print(b"123"[0:3:2])
CPy输出: |
uPy输出: |
b'13'
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
字典¶
字典键视图的行为不像集合。¶
原因: 未实现。
解决方法: 在使用集合操作之前,将键明确转换为集合。
示例代码:
print({1: 2, 3: 4}.keys() & {1})
CPy输出: |
uPy输出: |
{1}
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
float¶
uPy allows implicit conversion of objects in maths operations while CPython does not.¶
Workaround: Objects should be wrapped in float(obj)
for compatibility with CPython.
示例代码:
class Test:
def __float__(self):
return 0.5
print(2.0 * Test())
CPy输出: |
uPy输出: |
Traceback (most recent call last):
File "<stdin>", line 14, in <module>
TypeError: unsupported operand type(s) for *: 'float' and 'Test'
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
uPy 和 CPython 输出格式可能不同¶
示例代码:
print("%.1g" % -9.9)
CPy输出: |
uPy输出: |
-1e+01
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
int¶
bit_length
方法不存在。¶
原因: 未实现 bit_length 方法。
解决方法: 在 MicroPython 上避免使用此方法。
示例代码:
x = 255
print("{} is {} bits long.".format(x, x.bit_length()))
CPy输出: |
uPy输出: |
255 is 8 bits long.
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
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
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
list¶
未实现step != 1 的列表删除¶
解决方法: 对于此罕见操作,请使用显式循环。
示例代码:
l = [1, 2, 3, 4]
del l[0:4:2]
print(l)
CPy输出: |
uPy输出: |
[2, 4]
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现 RHS 上不可迭代的列表切片存储¶
原因: RHS 受限于为元组或列表
解决方法: 在 RHS 上使用 list(<iter>)
将可迭代对象转换为列表
示例代码:
l = [10, 20]
l[0:1] = range(4)
print(l)
CPy输出: |
uPy输出: |
[0, 1, 2, 3, 20]
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现step != 1 的列表存储¶
解决方法: 对于此罕见操作,请使用显式循环。
示例代码:
l = [1, 2, 3, 4]
l[0:4:2] = [5, 6]
print(l)
CPy输出: |
uPy输出: |
[5, 2, 6, 4]
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
str¶
开始/结束索引(例如 str.endswith(s, start))未实现¶
示例代码:
print("abc".endswith("c", 1))
CPy输出: |
uPy输出: |
True
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现属性/订阅¶
示例代码:
print("{a[0]}".format(a=[1, 2]))
CPy输出: |
uPy输出: |
1
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现带关键字的 str(…) 方法¶
解决方法: 直接输入编码格式。例如 print(bytes('abc', 'utf-8'))
示例代码:
print(str(b"abc", encoding="utf8"))
CPy输出: |
uPy输出: |
abc
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
未实现str.ljust() 和 str.rjust()¶
原因: MicroPython 高度优化了内存使用。提供了简单的解决方法。
解决方法: 使用 "%-10s" % s
代替 s.ljust(10)
,使用 "% 10s" % s
代替 s.rjust(10)
。或者,使用 "{:<10}".format(s)
或 "{:>10}".format(s)
。
示例代码:
print("abc".ljust(10))
CPy输出: |
uPy输出: |
abc
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
将 None 作为 rsplit 的第一个参数(例如 str.rsplit(None, n))未实现¶
示例代码:
print("a a a".rsplit(None, 1))
CPy输出: |
uPy输出: |
['a a', 'a']
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
带步长的下标!=1尚未实现¶
示例代码:
print("abcdefghi"[0:9:2])
CPy输出: |
uPy输出: |
acegi
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|
元组¶
尚未实现步长不等于 1 的元组加载¶
示例代码:
print((1, 2, 3, 4)[0:4:2])
CPy输出: |
uPy输出: |
(1, 3)
|
/bin/sh: 1: ../ports/unix/build-standard/micropython: not found
|