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

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

モジュール

Generated Wed 07 Feb 2024 12:13:19 UTC

位置引数のみ場合がある

コードサイズを節約するため、CPython ではキーワード引数を受け入れる関数でも、MicroPython では位置引数のみのものがあります。

MicroPython は、位置引数のみを受け入れるように関数をマークします。そのシグネチャの末尾に / を挿入することで、CPython と同じように位置専用パラメータをマークします。シグネチャの末尾に / がある関数は、位置引数のみを受け入れます。詳細については PEP 570 を参照してください。

たとえば CPython 3.4 で socket.socket のコンストラクタのシグネチャは次のようになっています:

socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

しかし MicroPython で文書化されているシグネチャは次のようになっています:

socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, /)

パラメーターの末尾にある / は、それらがすべて MicroPython では位置引数のみであることを示しています。次のコードは、CPythonでは動作しますが、ほとんどの MicroPython ポートでは動作しません:

import socket
s = socket.socket(type=socket.SOCK_DGRAM)

MicroPython では次の例外が起きるでしょう:

TypeError: function doesn't take keyword arguments

次のコードは CPython でも MicroPython でも動作します:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

array

異なるタイプコード間の比較は未サポート

原因: コードサイズ

回避策: 個々の要素を比較する

サンプルコード:

import array

array.array("b", [1, 2]) == array.array("i", [1, 2])

CPy 出力:

uPy 出力:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError:

オーバーフローチェックは未実装

原因: MicroPython は、コードサイズと実行時間を削減するために暗黙の切り捨てを実装

回避策: CPythonとの互換性が必要な場合は、明示的に値をマスクする。

サンプルコード:

import array

a = array.array("b", [257])
print(a)

CPy 出力:

uPy 出力:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
OverflowError: signed char is greater than maximum
array('b', [1])

整数の探索は未実装

サンプルコード:

import array

print(1 in array.array("B", b"12"))

CPy 出力:

uPy 出力:

False
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
NotImplementedError:

配列要素の削除は未実装

サンプルコード:

import array

a = array.array("b", (1, 2, 3))
del a[1]
print(a)

CPy 出力:

uPy 出力:

array('b', [1, 3])
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
TypeError: 'array' object doesn't support item deletion

ステップが 1 でないスライスは未実装

サンプルコード:

import array

a = array.array("b", (1, 2, 3))
print(a[3:2:2])

CPy 出力:

uPy 出力:

array('b')
Traceback (most recent call last):
  File "<stdin>", line 10, in <module>
NotImplementedError: only slices with step=1 (aka None) are supported

builtins

next() の第2引数は未実装

原因: MicroPython はコードスペースに最適化されています。

回避策: val = next(it, deflt) とする代わりに、次のようにする:

try:
    val = next(it)
except StopIteration:
    val = deflt

サンプルコード:

print(next(iter(range(0)), 42))

CPy 出力:

uPy 出力:

42
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
TypeError: function takes 1 positional arguments but 2 were given

deque

deque は未実装

回避策: 通常のリストを使う。micropython-lib には collections.deque の実装がある。

サンプルコード:

import collections

D = collections.deque()
print(D)

CPy 出力:

uPy 出力:

deque([])
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
TypeError: function missing 2 required positional arguments

json

json モジュールは、オブジェクトが直列化可能でなくとも例外を発生しない

サンプルコード:

import json

a = bytes(x for x in range(256))
try:
    z = json.dumps(a)
    x = json.loads(z)
    print("Should not get here")
except TypeError:
    print("TypeError")

CPy 出力:

uPy 出力:

TypeError
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
UnicodeError:

os

environ 属性は未実装

回避策: getenv, putenv, unsetenv を使う。

サンプルコード:

import os

try:
    print(os.environ.get("NEW_VARIABLE"))
    os.environ["NEW_VARIABLE"] = "VALUE"
    print(os.environ["NEW_VARIABLE"])
except AttributeError:
    print("should not get here")
    print(os.getenv("NEW_VARIABLE"))
    os.putenv("NEW_VARIABLE", "VALUE")
    print(os.getenv("NEW_VARIABLE"))

CPy 出力:

uPy 出力:

None
VALUE
should not get here
None
VALUE

getenv はキャッシュされている値ではなく、実際の値を返す

原因: environ 属性が未実装

サンプルコード:

import os

print(os.getenv("NEW_VARIABLE"))
os.putenv("NEW_VARIABLE", "VALUE")
print(os.getenv("NEW_VARIABLE"))

CPy 出力:

uPy 出力:

None
None
None
VALUE

random

getrandbits メソッドは一度に最大32ビットまでしか返せない。

原因: は PRNG の内部状態が32ビットしかないので、一度に最大32ビットのデータしか返せない。

回避策: 32ビット以上の数値が必要な場合は、micropython-lib の random モジュールを使う。

サンプルコード:

import random


x = random.getrandbits(64)
print("{}".format(x))

CPy 出力:

uPy 出力:

10504416032882596038
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
ValueError: bits must be 32 or less

randint メソッドは最大でネイティブワードサイズの整数しか返せない。

原因: PRNG は一度に 32 ビットの状態しか生成できない。その結果は完全な int オブジェクトではなく、ネイティブサイズの int にキャストされる。

回避策: ネイティブのワードサイズより大きな整数が必要な場合は、micropython-lib の random モジュールを使う。

サンプルコード:

import random


x = random.randint(2**128 - 1, 2**128)
print("x={}".format(x))

CPy 出力:

uPy 出力:

x=340282366920938463463374607431768211455
Traceback (most recent call last):
  File "<stdin>", line 11, in <module>
OverflowError: overflow converting long int to machine word

struct

struct の pack で引数が少なすぎても uPy はチェックしない

サンプルコード:

import struct

try:
    print(struct.pack("bb", 1))
    print("Should not get here")
except:
    print("struct.error")

CPy 出力:

uPy 出力:

struct.error
b'\x01\x00'
Should not get here

struct の pack で引数が多すぎても uPy はチェックしない

サンプルコード:

import struct

try:
    print(struct.pack("bb", 1, 2, 3))
    print("Should not get here")
except:
    print("struct.error")

CPy 出力:

uPy 出力:

struct.error
b'\x01\x02'
Should not get here

struct の pack のフォーマットに空白がある場合、CPythonでは空白が無視され、uPy¶ではエラーが発生する。

原因: MicroPythonはコードサイズに最適化されている。

回避策: フォーマット文字列に空白を使わない。

サンプルコード:

import struct

try:
    print(struct.pack("b b", 1, 2))
    print("Should have worked")
except:
    print("struct.error")

CPy 出力:

uPy 出力:

b'\x01\x02'
Should have worked
struct.error

sys

sys.stdin, sys.stdout, sys.stderr のオーバーライドは不可能

原因: これらは読取り専用メモリに格納されている。

サンプルコード:

import sys

sys.stdin = None
print(sys.stdin)

CPy 出力:

uPy 出力:

None
Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
AttributeError: 'module' object has no attribute 'stdin'