このドキュメンテーションは、MicroPython の最新開発ブランチのためのものです。 リリースバージョンでは利用できない機能に言及することがあります。

特定のリリースのドキュメントをお探しの場合は、左側のドロップダウンメニューを使って、 望みのバージョンを選択します。

構文

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