Generated Sun 31 Jan 2021 14:55:11 UTC
Sample code:
import array print(1 in array.array("B", b"12"))
CPy output: | uPy output: |
False |
Traceback (most recent call last): File "<stdin>", line 9, in <module> NotImplementedError: |
Sample code:
import array a = array.array("b", (1, 2, 3)) del a[1] print(a)
CPy output: | uPy output: |
array('b', [1, 3]) |
Traceback (most recent call last): File "<stdin>", line 10, in <module> TypeError: 'array' object doesn't support item deletion |
Sample code:
import array a = array.array("b", (1, 2, 3)) print(a[3:2:2])
CPy output: | uPy output: |
array('b') |
Traceback (most recent call last): File "<stdin>", line 10, in <module> NotImplementedError: only slices with step=1 (aka None) are supported |
Cause: MicroPython is optimised for code space.
Workaround: Instead of val = next(it, deflt)
use:
try: val = next(it) except StopIteration: val = deflt
Sample code:
print(next(iter(range(0)), 42))
CPy output: | uPy output: |
42 |
Traceback (most recent call last): File "<stdin>", line 12, in <module> TypeError: function takes 1 positional arguments but 2 were given |
Workaround: Use regular lists. micropython-lib has implementation of collections.deque.
Sample code:
import collections D = collections.deque() print(D)
CPy output: | uPy output: |
deque([]) |
Traceback (most recent call last): File "<stdin>", line 9, in <module> TypeError: function missing 2 required positional arguments |
Sample code:
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 output: | uPy output: |
TypeError |
Should not get here |
Workaround: Use getenv
, putenv
and unsetenv
Sample code:
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 output: | uPy output: |
None VALUE |
should not get here None VALUE |
Cause: The environ
attribute is not implemented
Sample code:
import os print(os.getenv("NEW_VARIABLE")) os.putenv("NEW_VARIABLE", "VALUE") print(os.getenv("NEW_VARIABLE"))
CPy output: | uPy output: |
None None |
None VALUE |
Workaround: Test that the return value is None
Sample code:
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 output: | uPy output: |
DEFAULT |
should not get here DEFAULT |
Sample code:
import struct try: print(struct.pack("bb", 1)) print("Should not get here") except: print("struct.error")
CPy output: | uPy output: |
struct.error |
b'\x01\x00' Should not get here |
Sample code:
import struct try: print(struct.pack("bb", 1, 2, 3)) print("Should not get here") except: print("struct.error")
CPy output: | uPy output: |
struct.error |
b'\x01\x02' Should not get here |
Cause: They are stored in read-only memory.
Sample code:
import sys sys.stdin = None print(sys.stdin)
CPy output: | uPy output: |
None |
Traceback (most recent call last): File "<stdin>", line 9, in <module> AttributeError: 'module' object has no attribute 'stdin' |