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