☰
MicroPython 语法与 CPython 的不同
2026/9/27 22:37:17 网站建设 项目流程

这涉及到了标注, 字面值,运算符, 还有解包等这些内容。这是参考自官方文档的, 并且进行了整理和验证的工作。

标注

允许在表达式这个地方使用类型标注这种说法, 而后面那个东西则是不允许的, 它是禁止的。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询