"collections.abc" --- 컨테이너의 추상 베이스 클래스
***************************************************

버전 3.3에 추가: 이전에는, 이 모듈이 "collections" 모듈의 일부였습니다
.

**소스 코드:** Lib/_collections_abc.py

======================================================================

이 모듈은 클래스가 특정 인터페이스를 제공하는지를 검사하는 데 사용할
수 있는 *추상 베이스 클래스*를 제공합니다; 예를 들어, 해시 가능한지 또
는 매핑인지입니다.


Collections 추상 베이스 클래스
==============================

collections 모듈은 다음과 같은 *ABC*를 제공합니다:

+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| ABC                        | 상속                   | 추상 메서드             | 믹스인 메서드                                        |
|============================|========================|=========================|======================================================|
| "Container"                |                        | "__contains__"          |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Hashable"                 |                        | "__hash__"              |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Iterable"                 |                        | "__iter__"              |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Iterator"                 | "Iterable"             | "__next__"              | "__iter__"                                           |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Reversible"               | "Iterable"             | "__reversed__"          |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Generator"                | "Iterator"             | "send", "throw"         | "close", "__iter__", "__next__"                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Sized"                    |                        | "__len__"               |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Callable"                 |                        | "__call__"              |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Collection"               | "Sized", "Iterable",   | "__contains__",         |                                                      |
|                            | "Container"            | "__iter__", "__len__"   |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Sequence"                 | "Reversible",          | "__getitem__",          | "__contains__", "__iter__", "__reversed__", "index"  |
|                            | "Collection"           | "__len__"               | 및 "count"                                           |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "MutableSequence"          | "Sequence"             | "__getitem__",          | 상속된 "Sequence" 메서드와 "append", "reverse",      |
|                            |                        | "__setitem__",          | "extend", "pop", "remove" 및 "__iadd__"              |
|                            |                        | "__delitem__",          |                                                      |
|                            |                        | "__len__", "insert"     |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "ByteString"               | "Sequence"             | "__getitem__",          | 상속된 "Sequence" 메서드                             |
|                            |                        | "__len__"               |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Set"                      | "Collection"           | "__contains__",         | "__le__", "__lt__", "__eq__", "__ne__", "__gt__",    |
|                            |                        | "__iter__", "__len__"   | "__ge__", "__and__", "__or__", "__sub__", "__xor__"  |
|                            |                        |                         | 및 "isdisjoint"                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "MutableSet"               | "Set"                  | "__contains__",         | 상속된 "Set" 메서드와 "clear", "pop", "remove",      |
|                            |                        | "__iter__", "__len__",  | "__ior__", "__iand__", "__ixor__" 및 "__isub__"      |
|                            |                        | "add", "discard"        |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Mapping"                  | "Collection"           | "__getitem__",          | "__contains__", "keys", "items", "values", "get",    |
|                            |                        | "__iter__", "__len__"   | "__eq__" 및 "__ne__"                                 |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "MutableMapping"           | "Mapping"              | "__getitem__",          | 상속된 "Mapping" 메서드와 "pop", "popitem", "clear", |
|                            |                        | "__setitem__",          | "update" 및 "setdefault"                             |
|                            |                        | "__delitem__",          |                                                      |
|                            |                        | "__iter__", "__len__"   |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "MappingView"              | "Sized"                |                         | "__len__"                                            |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "ItemsView"                | "MappingView", "Set"   |                         | "__contains__", "__iter__"                           |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "KeysView"                 | "MappingView", "Set"   |                         | "__contains__", "__iter__"                           |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "ValuesView"               | "MappingView",         |                         | "__contains__", "__iter__"                           |
|                            | "Collection"           |                         |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Awaitable"                |                        | "__await__"             |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "Coroutine"                | "Awaitable"            | "send", "throw"         | "close"                                              |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "AsyncIterable"            |                        | "__aiter__"             |                                                      |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "AsyncIterator"            | "AsyncIterable"        | "__anext__"             | "__aiter__"                                          |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+
| "AsyncGenerator"           | "AsyncIterator"        | "asend", "athrow"       | "aclose", "__aiter__", "__anext__"                   |
+----------------------------+------------------------+-------------------------+------------------------------------------------------+

class collections.abc.Container
class collections.abc.Hashable
class collections.abc.Sized
class collections.abc.Callable

   각각 메서드 "__contains__()", "__hash__()", "__len__()" 및
   "__call__()"을 제공하는 클래스의 ABC.

class collections.abc.Iterable

   "__iter__()" 메서드를 제공하는 클래스의 ABC.

   "isinstance(obj, Iterable)"를 검사하면 "Iterable"로 등록되었거나
   "__iter__()" 메서드가 있는 클래스를 감지하지만, "__getitem__()" 메
   서드로 이터레이트 하는 클래스는 감지하지 않습니다. 객체가 *이터러블
   *인지를 확인하는 유일하게 신뢰성 있는 방법은 "iter(obj)"를 호출하는
   것입니다.

class collections.abc.Collection

   길이가 있는 이터러블 컨테이너 클래스의 ABC.

   버전 3.6에 추가.

class collections.abc.Iterator

   "__iter__()" 와 "__next__()" 메서드를 제공하는 클래스의 ABC. *이터
   레이터*의 정의도 참조하십시오.

class collections.abc.Reversible

   "__reversed__()" 메서드도 제공하는 이터러블 클래스의 ABC.

   버전 3.6에 추가.

class collections.abc.Generator

   "send()", "throw()" 및 "close()" 메서드로 이터레이터를 확장하는
   **PEP 342**에 정의된 프로토콜을 구현하는 제너레이터 클래스의 ABC. *
   제너레이터*의 정의도 참조하십시오.

   버전 3.5에 추가.

class collections.abc.Sequence
class collections.abc.MutableSequence
class collections.abc.ByteString

   읽기 전용과 가변 *시퀀스*의 ABC.

   구현 참고 사항: "__iter__()", "__reversed__()" 및 "index()"와 같은
   일부 믹스인(mixin) 메서드는 하부 "__getitem__()" 메서드를 반복적으
   로 호출합니다. 따라서, "__getitem__()"이 상수 액세스 속도로 구현되
   면 믹스인 메서드는 선형 성능을 갖습니다; 그러나 하부 메서드가 선형
   이면 (링크드 리스트에서처럼), 믹스인은 2차 함수 성능을 가지므로 재
   정의해야 할 수 있습니다.

   버전 3.5에서 변경: index() 메서드는 *stop*과 *start* 인자에 대한 지
   원을 추가했습니다.

class collections.abc.Set
class collections.abc.MutableSet

   읽기 전용과 가변 집합의 ABC.

class collections.abc.Mapping
class collections.abc.MutableMapping

   읽기 전용과 가변 *매핑*의 ABC.

class collections.abc.MappingView
class collections.abc.ItemsView
class collections.abc.KeysView
class collections.abc.ValuesView

   매핑, 항목, 키 및 값 *뷰*의 ABC.

class collections.abc.Awaitable

   "await" 표현식에서 사용할 수 있는 *어웨이터블* 객체의 ABC. 사용자
   정의 구현은 "__await__()" 메서드를 제공해야 합니다.

   *코루틴* 객체와 "Coroutine" ABC의 인스턴스는 모두 이 ABC의 인스턴스
   입니다.

   참고:

     CPython에서, 제너레이터 기반 코루틴("types.coroutine()"이나
     "asyncio.coroutine()"으로 데코레이트 된 제너레이터)은,
     "__await__()" 메서드가 없어도 *어웨이터블* 입니다. 이들에 대해
     "isinstance(gencoro, Awaitable)"를 사용하면 "False"가 반환됩니다.
     이들을 감지하려면 "inspect.isawaitable()"을 사용하십시오.

   버전 3.5에 추가.

class collections.abc.Coroutine

   코루틴 호환 클래스의 ABC. 코루틴 객체(Coroutine Objects)에 정의된
   다음 메서드를 구현합니다: "send()", "throw()" 및 "close()". 사용자
   정의 구현은 "__await__()"도 구현해야 합니다. 모든 "Coroutine" 인스
   턴스는 "Awaitable"의 인스턴스이기도 합니다. *코루틴*의 정의도 참조
   하십시오.

   참고:

     CPython에서, 제너레이터 기반 코루틴("types.coroutine()"이나
     "asyncio.coroutine()"으로 데코레이트 된 제너레이터)은,
     "__await__()" 메서드가 없어도 *어웨이터블* 입니다. 이들에 대해
     "isinstance(gencoro, Coroutine)"을 사용하면 "False"가 반환됩니다.
     이들을 감지하려면 "inspect.isawaitable()"을 사용하십시오.

   버전 3.5에 추가.

class collections.abc.AsyncIterable

   "__aiter__" 메서드를 제공하는 클래스의 ABC. *비동기 이터러블*의 정
   의도 참조하십시오.

   버전 3.5에 추가.

class collections.abc.AsyncIterator

   "__aiter__" 와 "__anext__" 메서드를 제공하는 클래스의 ABC. *비동기
   이터레이터*의 정의도 참조하십시오.

   버전 3.5에 추가.

class collections.abc.AsyncGenerator

   **PEP 525**와 **PEP 492**에 정의된 프로토콜을 구현하는 비동기 제너
   레이터 클래스의 ABC.

   버전 3.6에 추가.

이러한 ABC들은 클래스나 인스턴스가 특정 기능을 제공하는지 묻는 것을 허
용합니다, 예를 들어:

   size = None
   if isinstance(myvar, collections.abc.Sized):
       size = len(myvar)

ABC 중 일부는 믹스인으로도 유용하여 컨테이너 API를 지원하는 클래스를
쉽게 개발할 수 있게 합니다. 예를 들어, 전체 "Set" API를 지원하는 클래
스를 작성하려면, "__contains__()", "__iter__()" 및 "__len__()"의 세 가
지 하부 추상 메서드 만 제공하면 됩니다. ABC는 "__and__()"와
"isdisjoint()"와 같은 나머지 메서드를 제공합니다:

   class ListBasedSet(collections.abc.Set):
       ''' Alternate set implementation favoring space over speed
           and not requiring the set elements to be hashable. '''
       def __init__(self, iterable):
           self.elements = lst = []
           for value in iterable:
               if value not in lst:
                   lst.append(value)

       def __iter__(self):
           return iter(self.elements)

       def __contains__(self, value):
           return value in self.elements

       def __len__(self):
           return len(self.elements)

   s1 = ListBasedSet('abcdef')
   s2 = ListBasedSet('defghi')
   overlap = s1 & s2            # The __and__() method is supported automatically

"Set"과 "MutableSet"을 믹스인으로 사용할 때의 주의 사항:

1. 일부 집합 연산은 새로운 집합을 만들기 때문에, 기본 믹스인 메서드는
   이터러블로부터 새 인스턴스를 만드는 방법이 필요합니다. 클래스 생성
   자가 "ClassName(iterable)" 형식의 서명을 가진 것으로 가정합니다. 이
   가정은 새로운 집합을 생성하기 위해 "cls(iterable)"를 호출하는
   "_from_iterable()"이라는 내부 클래스 메서드로 분리되었습니다. "Set"
   믹스인이 다른 생성자 서명을 갖는 클래스에서 사용되고 있으면, 이터러
   블 인자로부터 새 인스턴스를 생성할 수 있는 클래스 메서드로
   "_from_iterable()"을 재정의해야 합니다.

2. 비교를 재정의하려면 (의미는 고정되었으므로, 아마도 속도 때문에),
   "__le__()"와 "__ge__()"를 재정의하십시오, 그러면 다른 연산은 자동으
   로 맞춰집니다.

3. "Set" 믹스인은 집합의 해시값을 계산하는 "_hash()" 메서드를 제공합니
   다; 그러나 모든 집합이 해시 가능하거나 불변이지는 않기 때문에
   "__hash__()"는 정의되지 않습니다. 믹스인을 사용하여 집합 해시 가능
   성을 추가하려면, "Set()"와 "Hashable()"을 모두 상속한 다음,
   "__hash__ = Set._hash"를 정의하십시오.

더 보기:

  * "MutableSet"으로 구축한 예제 OrderedSet 조리법.

  * ABC에 대한 자세한 내용은, "abc" 모듈과 **PEP 3119**를 참조하십시오
    .
