4

コレクションモジュールのソースを読んでいます。モジュールは、collections.py と _abcoll.py の 2 つのファイルを組み合わせたものです。これがモジュールのドキュメントで、ソースコードへのリンクが含まれています。

collections.py の冒頭:

__all__ = ['Counter', 'deque', 'defaultdict', 'namedtuple', 'OrderedDict']
# For bootstrapping reasons, the collection ABCs are defined in _abcoll.py.
# They should however be considered an integral part of collections.py.
from _abcoll import *
import _abcoll
__all__ += _abcoll.__all__
...

_abcoll.py では、実際の「ブートストラップの理由」が何であるかがよくわかりません。

 6 DON'T USE THIS MODULE DIRECTLY!  The classes here should be imported
 7 via collections; they are defined here only to alleviate certain
 8 bootstrapping issues.  Unit tests are in test_collections.
 9 """
10 
11 from abc import ABCMeta, abstractmethod
12 import sys
13 
14 __all__ = ["Hashable", "Iterable", "Iterator",
15            "Sized", "Container", "Callable",
16            "Set", "MutableSet",
17            "Mapping", "MutableMapping",
18            "MappingView", "KeysView", "ItemsView", "ValuesView",
19            "Sequence", "MutableSequence",
20            ]
...

_abc.__all__は、このファイル内のすべてのクラス定義が含まれており、collections.py では、* からインポートして独自の_abcollに追加します。この方法で「特定のブートストラップの問題を軽減」できる理由がわかりませんでした。_abcoll.__all____all__

何かご意見は?ありがとう

4

1 に答える 1

1

この問題は、古いバージョンos.py、たとえばのバージョンにあるようです。

from _abcoll import MutableMapping # Can't use collections (bootstrap)

どうやら、collections間接的にos(おそらく、いくつかのピクルスが行われるモジュールの最後でのテストのために、そしておそらく他の場所で)必要なので、_abcollモジュールなしで循環依存があります。

(Python> = 3.3では、別のcollections.abcモジュールがあることに注意してください。)

于 2012-08-27T15:16:05.793 に答える