How to use collections.abc from both Python 3.8+ and Python 2.7

One way to solve this is to simply try to get abc from collections, else assume the members of abc are already in collections.

import collections                                         
collections_abc = getattr(collections, 'abc', collections)

I was getting error like this:

C:\Users\gsc-30431\Anaconda3\lib\site-packages\unittest2\compatibility.py:148
  C:\Users\gsc-30431\Anaconda3\lib\site-packages\unittest2\compatibility.py:148: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is depr
ecated since Python 3.3,and in 3.9 it will stop working
    class ChainMap(collections.MutableMapping):

-- Docs: https://docs.pytest.org/en/latest/warnings.html

enter image description here

SO i opened the File Compatibility.py by visiting the path showing in the error above! and Searched there the code where this Collections package is being used and Changed the previous line i.e:

class ChainMap(collections.MutableMapping):

to new Line:

class ChainMap(collections.abc.MutableMapping):

Screenshot: enter image description here

Just by adding .abc has solved my problem and i'm not getting warning anymore!


Place this at the top of the script:

import collections

try:
    collectionsAbc = collections.abc
except AttributeError:
    collectionsAbc = collections

Then change all prefixes of the abstract base types, e.g. change collections.abc.MutableMapping or collections.MutableMapping to collectionsAbc.MutableMapping.

Alternatively, import what you require in the script at the top in a single place:

try:
    from collections.abc import Callable  # noqa
except ImportError:
    from collections import Callable  # noqa

Looks like fresh version of the six module have collections_abc alias, so you can use:

from six.moves import collections_abc