这涉及到了标注, 字面值,运算符, 还有解包等这些内容。这是参考自官方文档的, 并且进行了整理和验证的工作。
标注
允许在表达式这个地方使用类型标注这种说法, 而后面那个东西则是不允许的, 它是禁止的。
def f():print('test'): int
def f():
[x,y]: int
def f():
x,y: int
# 在 Cython 执行这三个函数会引发 SyntaxError
# 在 MicroPython 则不检查形式
字面值
在数字字面值里面, 我们是可以接受下划线这种内容的, 但是另外一方呢, 是不支持的。
for i in ('1_1','1__1','1_'):try:
print(eval(i))
except SyntaxError:
print('Should not work')
# CPython 输出:
# 11
# Should not work
# Should not work
# MicroPython 输出:
# 11
# 11
# 1
要求在字面数字和关键字或者点号之间留空格, 而是不需要的了。不过需要补充一点说明就是自三点一一版本开始。当字面数字后面紧跟着关键字的时候会引发相应的反应。
for i in ('1and 0','1or 0','1if 1else 0','0x1.to_bytes(1)'):try:
print(eval(i))
except SyntaxError:
print('Should have worked')
# MicroPython 输出4个:Should have worked
# CPython 输出时前三项有警告:
... SyntaxWarning: invalid decimal literal
0
... SyntaxWarning: invalid decimal literal
1
... SyntaxWarning: invalid decimal literal
... SyntaxWarning: invalid decimal literal
1
b'\x01'
运算符
大家是允许的, 在那些嵌套起来的推导式里面的时候, 是可以使用那个 := 符号的, 目的就是为了给迭代过程中用到的变量去进行一个赋值的操作, 但是另一方面来说, 系统对于这种行为是不支持的。
print([[(j := i) for i in range(2)] for j in range(2)])# CPython 报错:
# SyntaxError: assignment expression cannot rebind comprehension iteration variable 'j'
# MicroPython 输出:
# [[0, 1], [0, 1]]
# 注:Python 自 3.8 加入 := 语法,故如下示例与 MicroPython 一致:
print(a:=1); print(a)
没有实现名称转义
print('\N{LATIN SMALL LETTER A}')# CPython 输出:a
# MicroPython 报错:NotImplementedError: unicode name escapes
解包
因为 是使用来标记那些需要进行解包的参数的, 如果那些等待被解包的参数是第 n 个或者更大的话, 那么参数的解包操作就起不到任何作用了, 而这里的 n 指的是 里面的位数。
def example(*args):print(len(args))
MORE = ['a', 'b', 'c']
example(
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
*MORE,
)
# CPython 输出:67
# MicroPython 报错:SyntaxError: too many args