Skip to content

Type annotation of Mapping in Python 3.8 #502

@sveinse

Description

@sveinse

This is a discussion related to typing, #358.

canopen use Mapping and MutableMapping for 10 classes. Due to limitations in Python 3.8, they cannot be annotated and the following will not work

class Network(MutableMapping[int, Union[RemoteNode, LocalNode]]):

Python 3.8 gives the error: TypeError: 'ABCMeta' object is not subscriptable. The effect is that a code base supporting 3.8 cannot use type hints on Mapping. These classes are very central to the function of canopen, so I think we'd miss out on significant type annotation aids if we don't get to use it.

There are a few options available to us:

  1. Bump the minimum Python version to 3.9
  2. Don't use type annotations on any of the Mapping and MutableMapping classes because we need Python 3.8 compatibility
  3. Use a run-time hack that conditionally adds the type annotations. Below example is inspired from this example
  4. Some way to annotate these classes that works with >=3.8 that I don't know about
# Example to annotate MutableMapping that makes it run on Python 3.8
import sys
if sys.version_info >= (3, 9):
    TMutableMapping = MutableMapping[int, Union[RemoteNode, LocalNode]]
else:
    TMutableMapping = MutableMapping

class Network(TMutableMapping):
    """Representation of one CAN bus containing one or more nodes."""

Metadata

Metadata

Assignees

No one assigned

    Labels

    code-qualitytypingConcerns typing information to be consumed by library users.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions