モジュール¶
Generated Sat 05 Feb 2022 04:06:58 UTC
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
|
Should not get here
|
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
|
getenv
には1引数だけ指定できる¶
回避策: 戻り値が None
であるかをチェックする
サンプルコード:
import os
try:
print(os.getenv("NEW_VARIABLE", "DEFAULT"))
except TypeError:
print("should not get here")
# this assumes NEW_VARIABLE is never an empty variable
print(os.getenv("NEW_VARIABLE") or "DEFAULT")
CPy 出力: | uPy 出力: |
DEFAULT
|
should not get here
DEFAULT
|
random¶
getrandbits
メソッドは一度に最大32ビットまでしか返せない。¶
原因: は PRNG の内部状態が32ビットしかないので、一度に最大32ビットのデータしか返せない。
回避策: 32ビット以上の数値が必要な場合は、micropython-lib の random モジュールを使う。
サンプルコード:
import random
x = random.getrandbits(64)
print("{}".format(x))
CPy 出力: | uPy 出力: |
2164811888406875915
|
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>
AttributeError: 'module' object has no attribute 'randint'
|
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
|