# Builtin types

Generated Wed 19 Jul 2023 21:24:18 UTC

## Exception

### All exceptions have readable `value` and `errno` attributes, not just `StopIteration` and `OSError`.

Cause: MicroPython is optimised to reduce code size.

Workaround: Only use `value` on `StopIteration` exceptions, and `errno` on `OSError` exceptions. Do not use or rely on these attributes on other exceptions.

Sample code:

    e = Exception(1)
    print(e.value)
    print(e.errno)

CPy output: | uPy output:
    Traceback (most recent call last):
      File "<stdin>", line 8, in <module>
    AttributeError: 'Exception' object has no attribute 'value'
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### Exception chaining not implemented

Sample code:

    try:
        raise TypeError
    except TypeError:
        raise ValueError

CPy output: | uPy output:
    Traceback (most recent call last):
      File "<stdin>", line 8, in <module>
    TypeError

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<stdin>", line 10, in <module>
    ValueError
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### User-defined attributes for builtin exceptions are not supported

Cause: MicroPython is highly optimized for memory usage.

Workaround: Use user-defined exception subclasses.

Sample code:

    e = Exception()
    e.x = 0
    print(e.x)

CPy output: | uPy output:
    0
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### Exception in while loop condition may have unexpected line number

Cause: Condition checks are optimized to happen at the end of loop body, and that line number is reported.

Sample code:

    l = ["-foo", "-bar"]

    i = 0
    while l[i][0] == "-":
        print("iter")
        i += 1

CPy output: | uPy output:
    iter
    iter
    Traceback (most recent call last):
      File "<stdin>", line 10, in <module>
    IndexError: list index out of range
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### Exception.__init__ method does not exist.

Cause: Subclassing native classes is not fully supported in MicroPython.

Workaround: Call using `super()` instead:

    class A(Exception):
        def __init__(self):
            super().__init__()

Sample code:

    class A(Exception):
        def __init__(self):
            Exception.__init__(self)

    a = A()

CPy output: | uPy output:
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## bytearray

### Array slice assignment with unsupported RHS

Sample code:

    b = bytearray(4)
    b[0:1] = [1, 2]
    print(b)

CPy output: | uPy output:
    bytearray(b'\x01\x02\x00\x00\x00')
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## bytes

### bytes objects support .format() method

Cause: MicroPython strives to be a more regular implementation, so if both `str` and `bytes` support `__mod__()` (the % operator), it makes sense to support `format()` for both too. Support for `__mod__` can also be compiled out, which leaves only `format()` for bytes formatting.

Workaround: If you are interested in CPython compatibility, don’t use `.format()` on bytes objects.

Sample code:

    print(b"{}".format(1))

CPy output: | uPy output:
    Traceback (most recent call last):
      File "<stdin>", line 7, in <module>
    AttributeError: 'bytes' object has no attribute 'format'
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### bytes() with keywords not implemented

Workaround: Pass the encoding as a positional parameter, e.g. `print(bytes('abc', 'utf-8'))`

Sample code:

    print(bytes("abc", encoding="utf8"))

CPy output: | uPy output:
    b'abc'
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### Bytes subscription with step != 1 not implemented

Cause: MicroPython is highly optimized for memory usage.

Workaround: Use explicit loop for this very rare operation.

Sample code:

    print(b"123"[0:3:2])

CPy output: | uPy output:
    b'13'
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## dict

### Dictionary keys view does not behave as a set.

Cause: Not implemented.

Workaround: Explicitly convert keys to a set before using set operations.

Sample code:

    print({1: 2, 3: 4}.keys() & {1})

CPy output: | uPy output:
    {1}
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## float

### uPy allows implicit conversion of objects in maths operations while CPython does not.

Workaround: Objects should be wrapped in `float(obj)` for compatibility with CPython.

Sample code:

    class Test:
        def __float__(self):
            return 0.5

    print(2.0 * Test())

CPy output: | uPy output:
    Traceback (most recent call last):
      File "<stdin>", line 14, in <module>
    TypeError: unsupported operand type(s) for *: 'float' and 'Test'
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### uPy and CPython outputs formats may differ

Sample code:

    print("%.1g" % -9.9)

CPy output: | uPy output:
    -1e+01
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## int

### `bit_length` method doesn’t exist.

Cause: bit_length method is not implemented.

Workaround: Avoid using this method on MicroPython.

Sample code:

    x = 255
    print("{} is {} bits long.".format(x, x.bit_length()))

CPy output: | uPy output:
    255 is 8 bits long.
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### No int conversion for int-derived types available

Workaround: Avoid subclassing builtin types unless really needed. Prefer https://en.wikipedia.org/wiki/Composition_over_inheritance .

Sample code:

    class A(int):
        __add__ = lambda self, other: A(int(self) + other)

    a = A(42)
    print(a + a)

CPy output: | uPy output:
    84
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## list

### List delete with step != 1 not implemented

Workaround: Use explicit loop for this rare operation.

Sample code:

    l = [1, 2, 3, 4]
    del l[0:4:2]
    print(l)

CPy output: | uPy output:
    [2, 4]
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### List slice-store with non-iterable on RHS is not implemented

Cause: RHS is restricted to be a tuple or list

Workaround: Use `list(<iter>)` on RHS to convert the iterable to a list

Sample code:

    l = [10, 20]
    l[0:1] = range(4)
    print(l)

CPy output: | uPy output:
    [0, 1, 2, 3, 20]
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### List store with step != 1 not implemented

Workaround: Use explicit loop for this rare operation.

Sample code:

    l = [1, 2, 3, 4]
    l[0:4:2] = [5, 6]
    print(l)

CPy output: | uPy output:
    [5, 2, 6, 4]
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## str

### Start/end indices such as str.endswith(s, start) not implemented

Sample code:

    print("abc".endswith("c", 1))

CPy output: | uPy output:
    True
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### Attributes/subscr not implemented

Sample code:

    print("{a[0]}".format(a=[1, 2]))

CPy output: | uPy output:
    1
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### str(…) with keywords not implemented

Workaround: Input the encoding format directly. eg `print(bytes('abc', 'utf-8'))`

Sample code:

    print(str(b"abc", encoding="utf8"))

CPy output: | uPy output:
    abc
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### str.ljust() and str.rjust() not implemented

Cause: MicroPython is highly optimized for memory usage. Easy workarounds available.

Workaround: Instead of `s.ljust(10)` use `"%-10s" % s`, instead of `s.rjust(10)` use `"% 10s" % s`. Alternatively, `"{:<10}".format(s)` or `"{:>10}".format(s)`.

Sample code:

    print("abc".ljust(10))

CPy output: | uPy output:
    abc
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### None as first argument for rsplit such as str.rsplit(None, n) not implemented

Sample code:

    print("a a a".rsplit(None, 1))

CPy output: | uPy output:
    ['a a', 'a']
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

### Subscript with step != 1 is not yet implemented

Sample code:

    print("abcdefghi"[0:9:2])

CPy output: | uPy output:
    acegi
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

## tuple

### Tuple load with step != 1 not implemented

Sample code:

    print((1, 2, 3, 4)[0:4:2])

CPy output: | uPy output:
    (1, 3)
    /bin/sh: 1: ../ports/unix/build-standard/micropython: not found

Language and External Links

Language
  English
  中文

External links
  openmv.io
  forums.openmv.io
  github.com/openmv/openmv
  micropython.org
  forum.micropython.org
  github.com/micropython/micropython