네임 스페이스를 순조롭게 서핑하는 동안 이상한이라는 객체를 발견 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에서 테스트되었습니다.