構文
Generated Sat 08 Aug 2026 01:23:30 UTC
アノテーション
MicroPythonは、CPython では禁止されている式への型注釈を受け入れる。
原因: コードサイズを削減するため、MicroPython は型注釈が適用された式の形式をチェックしません。
回避策: リンティングツールを使用して、常に有効な Python コードであることを確認してください。
式自体は評価されません。
サンプルコード:
def test(expr):
code = f"def f():\n {expr}: int"
print(code)
try:
exec(code)
print("OK")
except SyntaxError as e:
print("SyntaxError")
print()
test("print('test')")
test("[x,y]")
test("x,y")
CPython 出力: |
MicroPython 出力 |
def f():
print('test'): int
SyntaxError
def f():
[x,y]: int
SyntaxError
def f():
x,y: int
SyntaxError
|
def f():
print('test'): int
OK
def f():
[x,y]: int
OK
def f():
x,y: int
OK
|
リテラル
CPython が数値リテラルで受け入れないアンダースコアを MicroPython は受け入れる
原因: パーサーの実装の違い。
MicroPython のトークナイザーは数値リテラル内のアンダースコアを無視しますが、CPython は連続する複数のアンダースコアと最後の桁の後のアンダースコアを拒否します。
回避策: CPython で受け入れられないアンダースコアを削除します。
サンプルコード:
try:
print(eval("1__1"))
except SyntaxError:
print("Should not work")
try:
print(eval("1_"))
except SyntaxError:
print("Should not work")
CPython 出力: |
MicroPython 出力 |
Should not work
Should not work
|
11
1
|
MicroPythonでは、リテラル数値とキーワードの間、リテラル数値と "." の間にスペースが必要だが、CPython では必要ない
原因: パーサーの実装の違い。
MicroPython のトークナイザーは 1and のようなシーケンスを単一のトークンとして扱いますが、CPython はそれを 2 つのトークンとして扱います。
CPython 3.11 以降、リテラル数値の後にトークンが続く場合、この構文は「無効なリテラル」として SyntaxWarning を引き起こします。リテラル数値の後に属性アクセスを示す "." が続く場合、CPython は警告を発しません。
回避策: 整数リテラルと次のトークンの間にスペースを追加します。
これにより、CPython の SyntaxWarning も修正されます。
サンプルコード:
try:
print(eval("1and 0"))
except SyntaxError:
print("Should have worked")
try:
print(eval("1or 0"))
except SyntaxError:
print("Should have worked")
try:
print(eval("1if 1else 0"))
except SyntaxError:
print("Should have worked")
try:
print(eval("0x1.to_bytes(1)"))
except SyntaxError:
print("Should have worked")
CPython 出力: |
MicroPython 出力 |
<string>:1: SyntaxWarning: invalid decimal literal
0
<string>:1: SyntaxWarning: invalid decimal literal
1
<string>:1: SyntaxWarning: invalid decimal literal
<string>:1: SyntaxWarning: invalid decimal literal
1
b'\x01'
|
Should have worked
Should have worked
Should have worked
Should have worked
|
演算子
MicroPythonでは、ネストされた内包表記で反復変数に := 演算子を使って値を代入できるが、CPython ではできない。
原因: MicroPythonはコードサイズを最適化しています。標準の内包表記で反復変数に代入すると構文エラーになりますが(CPythonと同様)、内側のネストされた内包表記が外側の内包表記の反復変数に代入しているかどうかはチェックされません。
回避策: 内包表記の反復変数に代入する際に := を使用しないでください。
サンプルコード:
print([[(j := i) for i in range(2)] for j in range(2)])
CPython 出力: |
MicroPython 出力 |
File "<stdin>", line 8
SyntaxError: assignment expression cannot rebind comprehension iteration variable 'j'
|
[[0, 1], [0, 1]]
|
Unicode
Unicode 名エスケープは未実装
サンプルコード:
print("\N{LATIN SMALL LETTER A}")
CPython 出力: |
MicroPython 出力 |
a
|
NotImplementedError: unicode name escapes
|
アンパック
引数の展開において、引数の数がn以上の場合(nは MP_SMALL_INT のビット数)、動作しない。
原因: 実装では MP_SMALL_INT を使って展開する必要がある引数をフラグ付けしているます。
回避策: 引数をより少なくしてください。
サンプルコード:
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 出力: |
MicroPython 出力 |
67
|
Traceback (most recent call last):
File "<stdin>", line 21, in <module>
SyntaxError: too many args
|