Python 3.8+ と Python 2.7 の両方で collections.abc を使用する方法 質問する

Python 3.8+ と Python 2.7 の両方で collections.abc を使用する方法 質問する

Python 3.3 では、 の「抽象基本クラス」collections(またはMutableMappingなどMutableSequence) は第 2 レベルのモジュール に移動されましたcollections.abc。したがって、Python 3.3 以降では、実際の型はcollections.abc.MutableMappingなどになります。ドキュメンテーション古いエイリアス名 (例collections.MutableMapping) は Python 3.7 (現在の最新バージョン) まで使用できますが、3.8 ではこれらのエイリアスは削除されると記載されています。

現在のバージョンの Python 3.7 では、エイリアス名を使用すると警告が表示されます。

./scripts/generateBoard.py:145: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  elif isinstance(value, (collections.MutableMapping, collections.MutableSequence)) == True:

Python 2.7 にはありませんcollections.abc

Python スクリプトは、(ほぼ) すべての Python バージョンで使用することを想定しているのに、この違いを最も便利な方法で処理するにはどうすればよいでしょうか。try: ... except: ...この型が必要なスクリプト全体で使用せずに、この混乱を 1 か所で解決できる理想的なソリューションを探しています。

ベストアンサー1

これをスクリプトの先頭に配置します。

import collections

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

次に、抽象基本型のすべてのプレフィックスを変更します。たとえば、collections.abc.MutableMappingまたはcollections.MutableMappingを に変更しますcollectionsAbc.MutableMapping

または、スクリプトの一番上に必要なものを 1 か所にインポートします。

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

おすすめ記事