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


539

네임 스페이스를 순조롭게 서핑하는 동안 이상한이라는 객체를 발견 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


19
나는 다음과 같이 발견했다 x=[];x.append(x);print(x). 반환했습니다 [[...]]. "입력하면 어떻게되는지 궁금 [[...]]합니다. 구문 오류가 발생했습니다. 대신에 오류가 발생했습니다 [[Ellipsis]]. 파이썬이 너무 이상합니다. Google 검색으로
인해이

22
있습니다 ...재귀에 repr에 그냥 자리 표시 자와는 전혀 관련이 없습니다Ellipsis
Eevee

16
참고로 가져 오기의 트리플 도트는 "두 패키지에서 가져 오기"를 의미합니다.
Mad Physicist

1
@croq stackoverflow.com/q/32395926/2988730 . stackoverflow.com/q/1054271/2988730 . 이 두 사람은 모든 답변을 문서와 PEP에 올바르게 연결하여 모든 것을 설명해야합니다.
Mad Physicist

답변:


557

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

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

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

해석은 순전히 __getitem__함수를 구현하고 Ellipsis객체를 보는 모든 것에 달려 있지만 주된 (및 의도 된) 용도는 numpy 타사 라이브러리에 있으며 다차원 배열 유형을 추가합니다. 차원이 두 개 이상이므로 슬라이싱은 시작 및 중지 인덱스보다 더 복잡해집니다. 여러 차원으로 슬라이스 할 수있는 것도 유용합니다. 예를 들어, 4x4 배열이 주어지면 왼쪽 상단 영역이 슬라이스로 정의됩니다 [: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 사용을 위해 추가되었으며 객체 및 해당 구문을 제공하는 것 외에는 핵심 지원이 없습니다. 거기에있는 객체는 이것을 필요로하지 않았지만 슬라이스에 대한 문자 "..."지원이 필요했습니다.


22
스텁 파일에서 힌트를주는 PEP484 유형에서도 사용됩니다
noɥʇʎԀʎzɐɹƆ

24
궁금한 점이있는 경우 : 표준 라이브러리 typing모듈 에서도 사용됩니다 . 예 : 서명을 지정하지 않고 Callable[..., int]를 반환하는 호출 가능 항목 을 표시하거나 가변 길이의 균일 한 문자열 튜플을 표시합니다. intTuple[str, ...]
Anakhand 2016 년

6
참고로 FastAPI 프레임 워크 (python 3.6 이상용)도 현재 사용하고 있습니다. fastapi.tiangolo.com/tutorial/query-params-str-validations
Andrew Allaire

2
@ArtOfWarfare 당신은 전적으로 옳습니다. 이것은 문장 사이에 흔적을 남기지 않고 구두로 말줄임표를 사용하는 사람에게서 나옵니다.
PrimeRibeyeDeal

나는 이것을 찾았다. 목록에서 자체 참조 (원형 참조)를 만들 때 나타납니다. a = [1, 2]; a[0] = a; print(a)gives [[...], 2]. 이것은 같은 것입니까 아니면 다른 용도입니까?

219

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

def will_do_something():
    ...

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

def will_do_something():
    1

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


180
반 컨벤션에서, ...사람들이 나중에 채우려 고하는 무언가 ( 'todo'빈 블록)를 표시하고 pass코드가없는 블록을 의미하는 경우가 종종 있습니다 .
Gareth Latty

26
파이썬에는 NotImplemented리터럴이 있는데, 이는 불완전한 함수가 None예제에서 와 같이 의미있는 것을 반환하기를 원할 때 유용합니다 . (다른 사용
사례

13
@zvyn 문자 그대로가 아닙니다. 그냥 이름입니다. 예를 들어 NotImplemented = 'something_else'유효한 파이썬이지만 ... = 'something_else'구문 오류입니다.
wim

4
@zvyn 해당 모듈을 가져 오는 동안 예외가 발생하면 어떻게합니까? :)
pizzapants184 1

7
@zvyn NotImplemented은에 대한 대안이 아닙니다 None. 사용법이 다소 좁습니다. 여기에서
hans

68

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

예 1 :

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

예 2 :

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

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

46

예상 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

9
그러나 이것은 실제로 줄임표 개체와 관련이 있습니까? 그것은 doctest 파서 / 매칭 기의 기능이 아닌가?
akaihola 2012 년

1
@akaihola 난에 설명 된대로,하지 말 것 doctest.ELLIPSIS . 나는 모든 용도 ...가 구문 적으로 사용되는 것이 아니라 use실제 Ellipsis 객체 가 아니라고 생각 합니다. 적응 가능한 개념에 대한 편리한 이름에 지나지 않습니까?
nealmcb

34

로부터 파이썬 문서 :

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

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


25

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

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

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

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

14

__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에서 테스트되었습니다.


이것을 -O 인수와 함께 실행하면 코드는 항상; D
moshevi를



2

의도 된 용도는 이러한 타사 모듈에만 사용해서는 안됩니다. 파이썬 문서에서 제대로 언급되지 않았거나 (아마도 그것을 찾을 수 없었습니다) 실제로 줄임표 ...는 CPython 에서 적어도 한 곳에서 실제로 사용됩니다 .

파이썬에서 무한한 데이터 구조를 나타내는 데 사용됩니다. 나는 목록을 가지고 놀 면서이 표기법을 사용했습니다.

자세한 내용은 이 질문 을 참조하십시오.


8
이 질문은 ellipsis내장 유형과 Ellipsis객체 에 대해 묻습니다 . 타원으로 무한한 데이터 구조를 나타내는 것은 순수하게 표시하기위한 것이며 ellipsis유형이나 Ellipsis객체 와는 아무런 관련이 없습니다 .
chys

3
@chys 사실, 파이썬 __repr__문자열은 유효한 파이썬 표현을 목표로합니다. 언어에 생략 부호가 없다면 표현은 유효한 표현이 아닙니다.
Gareth Latty

3
@Lattyware 글쎄, 원래 디자인이 의도 한 것이 사실입니다. 또한 eval(repr(a))같은 목표를 의도 합니다 a. 불행히도 실제로 내장 유형의 경우에도 실제로는 잘못된 것입니다. 이것을 시도하십시오 : a=[]; a.append(a); eval(repr(a)). repr(a)[[...]]파이썬 2에서 유효하지 않은 표현입니다. (파이썬 3에서는 유효하지만 평가 결과는 원래 의도와는 달리 다른 결과입니다.)
chys

1

이것은 동등합니다.

l=[..., 1,2,3]
l=[Ellipsis, 1,2,3]

...내부에 정의 된 상수 built-in constants입니다.

생략

줄임표 리터럴 "..."과 동일합니다. 사용자 정의 컨테이너 데이터 유형에 대한 확장 슬라이싱 구문과 함께 주로 사용되는 특수 값입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.