Sementara berselancar di namespace saya melihat sebuah objek aneh yang disebut Ellipsis
, tampaknya tidak menjadi atau melakukan sesuatu yang istimewa, tapi itu adalah builtin yang tersedia secara global.
Setelah pencarian saya menemukan bahwa itu digunakan dalam beberapa varian sintak slicing oleh Numpy dan Scipy ... tetapi hampir tidak ada yang lain.
Apakah objek ini ditambahkan ke bahasa khusus untuk mendukung Numpy + Scipy? Apakah Ellipsis memiliki makna generik atau penggunaan sama sekali?
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
x=[];x.append(x);print(x)
, untuk melihat bagaimana ia menangani pengubahan objek siklis. Ia kembali[[...]]
. Saya berpikir, "Saya ingin tahu apa yang terjadi jika saya mengetik[[...]]
? Dugaan saya, itu akan membuat kesalahan sintaksis. Sebaliknya, itu mengembalikan[[Ellipsis]]
. Python sangat aneh. Pencarian Google yang terjadi kemudian membawa saya ke halaman ini....
repr rekursif hanyalah pengganti dan tidak ada hubungannya denganEllipsis
Jawaban:
Ini muncul dalam pertanyaan lain baru-baru ini. Saya akan menguraikan jawaban saya dari sana:
Ellipsis adalah objek yang dapat muncul dalam irisan notasi. Sebagai contoh:
Penafsirannya murni untuk apa pun yang mengimplementasikan
__getitem__
fungsi dan melihatEllipsis
objek di sana, tetapi penggunaan utamanya (dan yang dimaksudkan) adalah di perpustakaan pihak ketiga yang numpy , yang menambahkan tipe array multidimensi. Karena ada lebih dari satu dimensi, mengiris menjadi lebih kompleks dari sekadar indeks awal dan berhenti; itu berguna untuk dapat memotong dalam berbagai dimensi juga. Misalnya, diberikan array 4x4, area kiri atas akan ditentukan oleh slice[:2,:2]
:Memperluas ini lebih lanjut, Ellipsis digunakan di sini untuk menunjukkan placeholder untuk sisa dimensi array yang tidak ditentukan. Anggap saja menunjukkan irisan penuh
[:]
untuk semua dimensi di celah itu ditempatkan, jadi untuk array 3d,a[...,0]
sama dengana[:,:,0]
dan untuk 4da[:,:,:,0]
, sama halnya,a[0,...,0]
adalaha[0,:,:,0]
(dengan bagaimanapun banyak titik dua di tengah membuat angka penuh dimensi dalam array).Menariknya, dalam python3, literal Ellipsis (
...
) dapat digunakan di luar sintaks slice, sehingga Anda dapat benar-benar menulis:Selain berbagai jenis numerik, tidak, saya tidak berpikir itu digunakan. Sejauh yang saya ketahui, itu ditambahkan murni untuk penggunaan numpy dan tidak memiliki dukungan inti selain menyediakan objek dan sintaks yang sesuai. Objek yang ada di sana tidak memerlukan ini, tetapi dukungan "..." literal memang diperlukan.
sumber
typing
modul standar-perpustakaan : misalnyaCallable[..., int]
untuk menunjukkan callable yang mengembalikanint
tanpa menentukan tanda tangan, atauTuple[str, ...]
untuk menunjukkan tupel string homogen panjang variabel.a = [1, 2]; a[0] = a; print(a)
memberi[[...], 2]
. Apakah ini hal yang sama atau penggunaan yang berbeda?Dalam Python 3, Anda bisa menggunakan Ellipsis literal
...
sebagai pengganti "nop" untuk kode:Ini bukan sihir; ekspresi apa pun dapat digunakan sebagai ganti
...
, misalnya:(Tidak dapat menggunakan kata "sanksi", tetapi saya dapat mengatakan bahwa penggunaan ini tidak langsung ditolak oleh Guido.)
sumber
...
digunakan di mana orang ingin menunjukkan sesuatu yang mereka ingin isi nanti (blok kosong 'todo') danpass
berarti blok yang dimaksudkan untuk tidak memiliki kode.NotImplemented
literal, yang berguna ketika Anda ingin fungsi tidak lengkap Anda mengembalikan sesuatu yang bermakna (bukanNone
seperti dalam contoh Anda). (Penggunaan kata lain: Melaksanakan operasi aritmatika )NotImplemented = 'something_else'
adalah python yang valid, tetapi... = 'something_else'
merupakan kesalahan sintaksis.NotImplemented
tidak dimaksudkan sebagai alternatifNone
. Penggunaannya agak sempit. Lihat dokumentasi di siniPada Python 3.5 dan PEP484 , elipsis literal digunakan untuk menunjukkan tipe tertentu ke pemeriksa tipe statis saat menggunakan modul mengetik .
Contoh 1:
Contoh 2:
sumber
Anda juga dapat menggunakan Ellipsis ketika menentukan output dokumen yang diharapkan :
sumber
...
sintaksis, dan bukanuse
objek Ellipsis yang sebenarnya. Bukankah itu benar-benar tidak lebih dari nama yang berguna untuk konsep yang mudah beradaptasi?Dari dokumentasi Python :
sumber
Meringkas apa yang dikatakan orang lain, pada Python 3, Ellipsis pada dasarnya adalah konstanta singleton lain yang serupa
None
, tetapi tanpa tujuan penggunaan khusus. Penggunaan yang ada meliputi:Callable[..., int]
atauTuple[str, ...]
)Kemungkinan penggunaan dapat meliputi:
None
merupakan opsi yang validsumber
__getitem__
...
contoh minimal di kelas khususKetika sintaks sihir
...
dilewatkan ke[]
dalam kelas khusus,__getitem__()
menerimaEllipsis
objek kelas.Kelas kemudian dapat melakukan apa pun yang diinginkan dengan objek Singleton ini.
Contoh:
Python bawaan
list
memilih untuk memberikan semantik suatu range, dan setiap penggunaan warasnya tentu saja juga.Secara pribadi, saya tinggal menjauhinya di API saya, dan membuat metode terpisah yang lebih eksplisit.
Diuji dalam Python 3.5.2 dan 2.7.12.
sumber
Anda dapat menggunakan Ellipsis sendiri, dalam situasi pemotongan kustom seperti yang dilakukan numpy, tetapi tidak ada gunanya di kelas builtin.
Saya tidak tahu apakah itu ditambahkan khusus untuk digunakan dalam numpy, tapi saya pasti belum melihatnya digunakan di tempat lain.
Lihat juga: Bagaimana Anda menggunakan sintaks slicing ellipsis di Python?
sumber
Seperti disebutkan oleh @ noɥʇʎԀʎzɐɹƆ dan @ phoenix - Anda memang dapat menggunakannya dalam file rintisan. misalnya
Informasi lebih lanjut dan contoh cara menggunakan elipsis ini dapat ditemukan di sini https://www.python.org/dev/peps/pep-0484/#stub-files
sumber
Penggunaan yang dimaksudkan seharusnya tidak hanya untuk modul pihak ke-3 ini. Itu tidak disebutkan dengan benar dalam dokumentasi Python (atau mungkin saya tidak bisa menemukannya) tetapi ellipsis
...
sebenarnya digunakan dalam CPython di setidaknya satu tempat.Ini digunakan untuk mewakili struktur data tak terbatas dalam Python. Saya menemukan notasi ini sambil bermain-main dengan daftar.
Lihat pertanyaan ini untuk info lebih lanjut.
sumber
ellipsis
tipe danEllipsis
objek bawaan. Mewakili struktur data tanpa batas dengan elips murni untuk tampilan, tidak ada hubungannya denganellipsis
jenis atauEllipsis
objek.__repr__
string Python bertujuan untuk menjadi ekspresi Python yang valid - jika bukan karena ellipsis yang ada dalam bahasa seperti itu, representasi tidak akan menjadi ekspresi yang valid.eval(repr(a))
bertujuan untuk menjadi sama dengana
. Sayangnya itu salah dari waktu ke waktu dalam praktik, bahkan untuk tipe bawaan. Mencoba ini:a=[]; a.append(a); eval(repr(a))
.repr(a)
adalah[[...]]
, ekspresi tidak valid dalam Python 2. (Dalam Python 3 itu valid, tetapi hasil eval adalah sesuatu yang berbeda, masih bertentangan dengan niat asli.)Ini setara.
...
adalah konstanta yang didefinisikan di dalambuilt-in constants
.sumber