[python] 줄임표 개체는 무엇을합니까?

네임 스페이스를 순조롭게 서핑하는 동안 이상한이라는 객체를 발견 Ellipsis했지만 특별한 것으로 보이지는 않지만 전 세계적으로 사용 가능한 내장 기능입니다.

검색 후 Numpy and Scipy가 슬라이싱 구문을 모호하게 변형 한 것으로 사용되었지만 거의 아무것도 아닙니다.

이 개체가 Numpy + Scipy를 지원하기 위해 특별히 언어에 추가 되었습니까? 줄임표에는 일반적인 의미가 있거나 전혀 사용되지 않습니까?

D:\workspace\numpy>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> Ellipsis
Ellipsis



답변

최근 에 또 다른 질문 이 생겼습니다 . 나는 거기 에서 내 대답 에 대해 자세히 설명 할 것입니다 .

줄임표 는 슬라이스 표기법으로 나타날 수있는 개체입니다. 예를 들면 다음과 같습니다.

myList[1:2, ..., 0]

해석은 순전히 __getitem__함수를 구현하고 Ellipsis객체를 보는 모든 것에 달려 있지만 주된 (및 의도 된) 용도는 numpy 타사 라이브러리에 있으며 다차원 배열 유형을 추가합니다. 차원이 두 개 이상이므로 슬라이싱은 시작 및 중지 인덱스보다 더 복잡해집니다. 여러 차원으로 슬라이스 할 수있는 것도 유용합니다. 예를 들어, 4×4 배열이 주어지면 왼쪽 상단 영역이 슬라이스로 정의됩니다 [:2,:2].

>>> a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12],
       [13, 14, 15, 16]])

>>> a[:2,:2]  # top left
array([[1, 2],
       [5, 6]])

이를 더 확장하기 위해 여기서 생략 부호를 사용하여 지정되지 않은 나머지 배열 차원의 자리 표시자를 나타냅니다. 전체 슬라이스 나타내는이라고 생각 [:]하므로 3 차원 배열,이 배치 된 간격의 모든 치수를 a[...,0]동일하게하다 a[:,:,0], 그리고 4D를 위해 a[:,:,:,0], 마찬가지로 a[0,...,0]입니다 a[0,:,:,0]전체 숫자까지 중간 메이크업에 그러나 많은 콜론 ( 배열의 차원 수).

흥미롭게도 python3에서 Ellipsis 리터럴 ( ...)은 슬라이스 구문 외부에서 사용할 수 있으므로 실제로 작성할 수 있습니다.

>>> ...
Ellipsis

다양한 숫자 유형 외에는 사용되지 않는 것 같습니다. 내가 아는 한 순수하게 numpy 사용을 위해 추가되었으며 객체 및 해당 구문을 제공하는 것 외에는 핵심 지원이 없습니다. 거기에있는 객체는 이것을 필요로하지 않았지만 슬라이스에 대한 문자 “…”지원이 필요했습니다.


답변

Python 3에서 Ellipsis 리터럴 ...을 코드의 “nop”자리 표시 자로 사용할 수 있습니다.

def will_do_something():
    ...

이것은 마술 이 아닙니다 . 다음 대신에 모든 표현식을 사용할 수 있습니다 ....

def will_do_something():
    1

( “제재 됨”이라는 단어를 사용할 수는 없지만 이 사용이 Guido에 의해 완전히 거부되지 않았다고 말할 수 있습니다 .)


답변

Python 3.5 및 PEP484부터는 문자 입력 줄임표를 사용하여 입력 모듈을 사용할 때 특정 유형을 정적 유형 검사기에 표시 합니다.

예 1 :

임의의 길이의 균질 튜플은 하나의 유형과 줄임표를 사용하여 표현할 수 있습니다. Tuple[int, ...]

예 2 :

인수 목록에 리터럴 줄임표 (세 개의 점)를 대체하여 호출 서명을 지정하지 않고 호출 가능 항목의 리턴 유형을 선언 할 수 있습니다.

def partial(func: Callable[..., str], *args) -> Callable[..., str]:
    # Body


답변

예상 doctest 출력을 지정할 때 줄임표를 사용할 수도 있습니다 .

class MyClass(object):
    """Example of a doctest Ellipsis

    >>> thing = MyClass()
    >>> # Match <class '__main__.MyClass'> and <class '%(module).MyClass'>
    >>> type(thing)           # doctest:+ELLIPSIS
    <class '....MyClass'>
    """
    pass


답변

로부터 파이썬 문서 :

이 개체는 일반적으로 슬라이스 (참조에 의해 사용되는 Slicings을 ). 특별한 작업을 지원하지 않습니다. 줄임표 (내장 이름)라는 이름의 줄임표 개체가 정확히 하나 있습니다. type(Ellipsis)()줄임표 싱글 톤을 생성합니다.

Ellipsis또는 로 작성됩니다 ....


답변

Python 3부터 다른 사람들이 말한 것을 요약하면 Ellipsis는 본질적으로와 비슷 None하지만 특별한 용도가없는 다른 단일 상수 입니다. 기존 용도는 다음과 같습니다.

  • 나머지 차원에서 전체 슬라이스를 나타내는 슬라이스 구문
  • 형식 힌트에서 형식의 일부만 나타 내기 ( Callable[..., int]또는 Tuple[str, ...])
  • 스텁 파일을 입력하여 기본값을 지정하지 않음을 나타냅니다.

가능한 용도는 다음과 같습니다.

  • None유효한 옵션이있는 장소의 기본값으로
  • 아직 구현하지 않은 기능의 내용으로

답변

__getitem__...커스텀 클래스의 최소 예제

매직 구문 ...[]사용자 정의 클래스에 전달되면 클래스 객체를 __getitem__()받습니다 Ellipsis.

그러면 클래스는이 Singleton 객체로 원하는 것을 수행 할 수 있습니다.

예:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

# Slice notation generates a slice object.
assert C()[1:2:3] == slice(1, 2, 3)

# Ellipsis notation generates the Ellipsis class object.
# Ellipsis is a singleton, so we can compare with `is`.
assert C()[...] is Ellipsis

# Everything mixed up.
assert C()[1, 2:3:4, ..., 6] == (1, slice(2,3,4), Ellipsis, 6)

파이썬 내장 list클래스는 범위의 시맨틱을 제공하기로 선택했으며, 그 사용법은 물론 사용하지 않아야합니다.

개인적으로 API에서 멀리 떨어져서 별도의 더 명확한 방법을 만듭니다.

Python 3.5.2 및 2.7.12에서 테스트되었습니다.