Programming

Python Ellipsis 객체는 무엇을합니까?

procodes 2020. 2. 16. 20:51
반응형

Python Ellipsis 객체는 무엇을합니까?


이름 공간을 훑어 보는 동안 " 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객체를 보는 모든 것에 달려 있지만 주된 (및 의도 된) 용도는 숫자 파이썬 확장에 있으며 다차원 배열 유형을 추가합니다. 차원이 두 개 이상이므로 슬라이싱은 시작 및 중지 인덱스보다 더 복잡해집니다. 여러 차원으로 슬라이스 할 수있는 것도 유용합니다. 예를 들어, 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 사용을 위해 추가되었으며 객체와 해당 구문을 제공하는 것 외에는 핵심 지원이 없습니다. 거기에있는 객체는 이것을 필요로하지 않았지만 슬라이스에 대한 문자 "..."지원이 필요했습니다.


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

로부터 파이썬 문서 :

이 객체는 확장 슬라이스 표기법으로 사용됩니다 ( Python Reference Manual 참조 ). 특별한 작업을 지원하지 않습니다. 정확히 하나의 줄임표 개체 (이름 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에서 테스트되었습니다.


numpy와 같은 사용자 정의 슬라이싱 상황에서 Ellipsis를 직접 사용할 수 있지만 내장 클래스에서는 사용되지 않습니다.

그것이 numpy에서 사용하기 위해 특별히 추가되었는지는 모르겠지만 확실히 다른 곳에서 사용되는 것을 보지 못했습니다.

참조 : 파이썬에서 줄임표 슬라이스 구문을 어떻게 사용합니까?


@ noɥʇʎԀʎzɐɹƆ 및 @phoenix에서 언급했듯이 실제로 스텁 파일에서 사용할 수 있습니다. 예 :

class Foo:
    bar: Any = ...
    def __init__(self, name: str=...) -> None: ...

이 줄임표를 사용하는 방법에 대한 자세한 정보와 예는 https://www.python.org/dev/peps/pep-0484/#stub-files 에서 확인할 수 있습니다.


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

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

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


이것은 동등합니다.

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

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

생략

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

참고 URL : https://stackoverflow.com/questions/772124/what-does-the-python-ellipsis-object-do



반응형