एलिप्सिस ऑब्जेक्ट क्या करता है?


539

नाम-रूप में सर्फिंग करते समय मैंने एक अजीब सी दिखने वाली वस्तु को देखा Ellipsis, जिसे यह प्रतीत नहीं होता है कि यह कुछ खास है या नहीं, लेकिन यह विश्व स्तर पर उपलब्ध बिलिन है।

एक खोज के बाद मैंने पाया कि इसका उपयोग नम्पी और स्कैपी द्वारा स्लाइसिंग सिंटैक्स के कुछ अस्पष्ट रूप में किया जाता है ... लेकिन लगभग कुछ नहीं।

क्या इस ऑब्जेक्ट को विशेष रूप से 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

उत्तर देने के लिए देखें stackoverflow.com/questions/752602/...
पैट्रिक McElhaney

19
मैंने इसे इस तरह पाया: मैंने प्रवेश किया x=[];x.append(x);print(x), यह देखने के लिए कि यह चक्रीय वस्तुओं को कैसे नियंत्रित करता है। यह लौट आया [[...]]। मैंने सोचा "मुझे आश्चर्य है कि अगर मैं टाइप करता हूं तो क्या होगा [[...]]? मेरा अनुमान था कि यह एक सिंटैक्स त्रुटि को फेंक देगा। इसके बजाय, यह वापस आ गया [[Ellipsis]]। पायथन बहुत अजीब है। Google खोज जिसने मुझे इस पृष्ठ पर लाया है
साइओस

22
ध्यान दें कि ...एक पुनरावर्ती repr में सिर्फ एक प्लेसहोल्डर है और इसका कोई संबंध नहीं हैEllipsis
Eevee

16
पूरी तरह से साइड नोट पर, आयात में ट्रिपल डॉट का अर्थ है "दो पैकेज ऊपर से आयात करें"।
मैड फिजिसिस्ट

1
@croq stackoverflow.com/q/32395926/2988730stackoverflow.com/q/1054271/2988730 । उन दोनों को हर बात की व्याख्या करनी चाहिए, जवाब में डॉक्स और पीईपी के उचित लिंक के साथ।
मैड फिजिसिस्ट

जवाबों:


557

यह हाल ही में एक अन्य प्रश्न में सामने आया । मैं वहां से अपने उत्तर पर विस्तार से बताऊंगा:

एलिप्सिस एक ऐसी वस्तु है जो स्लाइस अंकन में दिखाई दे सकती है। उदाहरण के लिए:

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

विभिन्न संख्यात्मक प्रकारों के अलावा, नहीं, मुझे नहीं लगता कि इसका उपयोग किया जाता है। जहां तक ​​मुझे पता है, यह विशुद्ध रूप से संख्यात्मक उपयोग के लिए जोड़ा गया था और इसमें वस्तु और संगत सिंटैक्स प्रदान करने के अलावा कोई कोर समर्थन नहीं है। वहाँ की जा रही वस्तु को इसकी आवश्यकता नहीं थी, लेकिन स्लाइस के लिए "..." का समर्थन था।


22
इसका उपयोग PEP484 प्रकार की स्टब फ़ाइलों में हिंटिंग में भी किया जाता है
no inz

24
किसी के जिज्ञासु होने की स्थिति में: इसका उपयोग मानक-पुस्तकालय typingमॉड्यूल में भी किया जाता है : उदाहरण के Callable[..., int]लिए एक कॉल करने योग्य को इंगित intकरने के लिए, जो हस्ताक्षर को निर्दिष्ट किए बिना लौटाता है , या Tuple[str, ...]तारों की एक लंबी-लंबी सजातीय टुकड़ी को इंगित करता है।
Anakhand

6
FYI करें, FastAPI फ्रेमवर्क (जो कि अजगर 3.6+ के लिए है) भी (अब) इसका उपयोग करता है। fastapi.tiangolo.com/tutorial/query-params-str-validations
एंड्रयू Allaire

2
@ArtOfWarfare आप बिलकुल सही कह रहे हैं, और यह किसी ऐसे व्यक्ति से आ रहा है जो मौखिक रूप से वाक्य के बीच से पीछे हटने के बजाय "दीर्घवृत्त" कहता है।
प्राइमरीबिएडियल

मुझे मिला। ऐसा प्रतीत होता है जब आप किसी सूची में एक स्व-संदर्भ (परिपत्र संदर्भ) बनाते हैं: a = [1, 2]; a[0] = a; print(a)देता है [[...], 2]। क्या यह एक ही चीज है या एक अलग उपयोग है?
बिल

219

पायथन 3 में, आप एलिप्सिस शाब्दिक ...को कोड के लिए "एनओपी" प्लेसहोल्डर के रूप में उपयोग कर सकते हैं :

def will_do_something():
    ...

यह जादू नहीं है; इसके बजाय किसी भी अभिव्यक्ति का उपयोग किया जा सकता है ...:

def will_do_something():
    1

("स्वीकृत" शब्द का उपयोग नहीं किया जा सकता है, लेकिन मैं कह सकता हूं कि यह प्रयोग गुइदो द्वारा स्पष्ट रूप से अस्वीकार नहीं किया गया था )।


180
आधे-अधिवेशन में, मैं अक्सर देखा ...जाता है कि लोग जहां कुछ इंगित करना चाहते हैं, उसे बाद में भरने का इरादा रखते हैं ('todo' खाली ब्लॉक) और passइसका मतलब है कि एक ऐसा कोड जिसका कोई कोड नहीं है।
गैरेथ लेटी

26
पायथन में भी NotImplementedशाब्दिक है, जो तब उपयोगी होता है जब आप अपने अधूरे कार्य को कुछ सार्थक ( Noneउदाहरण के रूप में) के बजाय वापस करना चाहते हैं । (एक और usecase: अंकगणितीय संचालन को लागू करना )
zvyn

13
@zvyn यह शाब्दिक नहीं है। यह सिर्फ एक नाम है। उदाहरण के लिए NotImplemented = 'something_else'वैध अजगर है, लेकिन ... = 'something_else'एक वाक्यविन्यास त्रुटि है।
विम

4
@zvyn यदि उस मॉड्यूल को आयात करते समय कोई अपवाद हुआ तो क्या होगा? :)
pizzapants184

7
@zvyn के NotImplementedलिए एक विकल्प होने का इरादा नहीं है None। इसका उपयोग बल्कि संकीर्ण है। दस्तावेज़ देखें यहाँ
हंस

68

पायथन 3.5 और PEP484 के रूप में , टाइपिंग मॉड्यूल का उपयोग करते समय कुछ प्रकारों को स्थैतिक प्रकार चेकर को निरूपित करने के लिए शाब्दिक दीर्घवृत्त का उपयोग किया जाता है ।

उदाहरण 1:

उदाहरण के लिए, एक प्रकार और दीर्घवृत्त का उपयोग करके मनमानी लंबाई के सजातीय टुपल्स को व्यक्त किया जा सकता है Tuple[int, ...]

उदाहरण 2:

तर्कों की सूची के लिए शाब्दिक दीर्घवृत्त (तीन डॉट्स) को प्रतिस्थापित करके कॉल सिग्नेचर को निर्दिष्ट किए बिना कॉल करने योग्य वापसी प्रकार घोषित करना संभव है:

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

46

अपेक्षित सिद्धांत आउटपुट को निर्दिष्ट करते समय आप एलिप्सिस का भी उपयोग कर सकते हैं :

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
लेकिन क्या यह वास्तव में एलिप्सिस वस्तु को शामिल करता है? क्या यह केवल सिद्धांतवादी पार्सर / मिलानकर्ता की विशेषता नहीं है?
एकैहोला

1
@akaihola मैं कहूँगा कि यह करता है, जैसा कि doctest.ELLIPSIS में वर्णित है । मुझे उम्मीद है कि सबसे अधिक अगर सभी का उपयोग नहीं ...कर रहे हैं वाक्यविन्यास, और useवास्तविक एलिप्सिस वस्तु नहीं है। यह वास्तव में एक अनुकूली अवधारणा के लिए एक आसान नाम से ज्यादा कुछ नहीं है?
nealmcb

34

से अजगर प्रलेखन :

इस वस्तु आमतौर पर टुकड़ा करने की क्रिया (देखें द्वारा किया जाता है Slicings )। यह बिना किसी विशेष ऑपरेशन का समर्थन करता है। एलिप्सिस (बिल्ट-इन नाम) नाम की एक यक्षिणी वस्तु है। type(Ellipsis)()एलिप्सिस सिंगलटन का उत्पादन करता है।

यह के रूप में Ellipsisया लिखा है ...


25

पायथन 3 के रूप में दूसरों ने जो कुछ भी कहा है, उसे सारांशित करते हुए, एलिप्सिस अनिवार्य रूप से एक और सिंगलटन के समान है None, लेकिन एक विशेष उद्देश्य के बिना। मौजूदा उपयोगों में शामिल हैं:

  • शेष आयामों में पूर्ण स्लाइस का प्रतिनिधित्व करने के लिए स्लाइस सिंटैक्स में
  • टाइप के केवल भाग को इंगित करने के लिए टाइपिंग में ( Callable[..., int]या Tuple[str, ...])
  • टाइप स्टब फ़ाइलों में यह इंगित करने के लिए कि इसे निर्दिष्ट किए बिना एक डिफ़ॉल्ट मान है

संभव उपयोग में शामिल हो सकते हैं:

  • उन स्थानों के लिए डिफ़ॉल्ट मान के रूप में जहां Noneएक वैध विकल्प है
  • एक फ़ंक्शन के लिए सामग्री के रूप में आपने अभी तक लागू नहीं किया है

14

__getitem__...एक कस्टम वर्ग में न्यूनतम उदाहरण

जब मैजिक सिंटैक्स कस्टम क्लास में ...पास हो जाता है [], तो क्लास ऑब्जेक्ट __getitem__()प्राप्त करता है Ellipsis

वर्ग तब जो कुछ भी करना चाहता है वह इस सिंगलटन ऑब्जेक्ट के साथ कर सकता है।

उदाहरण:

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क्लास इसे एक श्रेणी का शब्दार्थ देने का विकल्प चुनती है, और इसका कोई भी उपयोग निश्चित रूप से होना चाहिए।

व्यक्तिगत रूप से, मैं अभी अपने एपीआई में इससे दूर रहूंगा, और इसके बजाय एक अलग, अधिक स्पष्ट विधि बनाऊंगा।

पायथन 3.5.2 और 2.7.12 में परीक्षण किया गया।


इसे -O तर्क के साथ चलाएं और आपका कोड हमेशा चलेगा; डी
मोशवी

12

आप स्वयं एलिप्सिस का उपयोग कर सकते हैं, कस्टम स्लाइसिंग स्थितियों में जैसे कि खसखस ​​ने किया है, लेकिन इसका किसी भी निर्मित वर्ग में कोई उपयोग नहीं है।

मुझे नहीं पता कि यह विशेष रूप से सुन्न में उपयोग के लिए जोड़ा गया था, लेकिन मैंने निश्चित रूप से इसे कहीं और इस्तेमाल नहीं किया है।

इसे भी देखें: आप पायथन में स्लीपिंग सिलेन्क्स का उपयोग कैसे करते हैं?


7

जैसा कि @ no mentionedzɐɹƆ और @ फीनिक्स द्वारा उल्लेख किया गया है - आप वास्तव में इसे स्टब फ़ाइलों में उपयोग कर सकते हैं। जैसे

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

इस दीर्घवृत्त का उपयोग करने के बारे में अधिक जानकारी और उदाहरण https://www.python.org/dev/peps/pep-0484/#stub-files पर देखे जा सकते हैं।


2

इसका इच्छित उपयोग केवल इन 3 पार्टी मॉड्यूल के लिए नहीं होना चाहिए। यह पायथन प्रलेखन में ठीक से उल्लेख नहीं किया गया है (या हो सकता है कि मैं अभी तक पता नहीं लगा सका) लेकिन एलिप्स ...को वास्तव में कम से कम एक स्थान पर सीपीथॉन में उपयोग किया जाता है।

इसका उपयोग पायथन में अनंत डेटा संरचनाओं का प्रतिनिधित्व करने के लिए किया जाता है। मैं सूचियों के साथ खेलने के दौरान इस अंकन पर आया था।

अधिक जानकारी के लिए यह प्रश्न देखें ।


8
अलग-अलग चीजें। यह सवाल ellipsisबिल्ट-इन टाइप और Ellipsisऑब्जेक्ट के बारे में पूछता है । दीर्घवृत्त के साथ अनंत डेटा संरचनाओं का प्रतिनिधित्व करना विशुद्ध रूप से प्रदर्शन के लिए है, जिसका ellipsisप्रकार या Ellipsisवस्तु से कोई लेना-देना नहीं है ।
chys

3
@chys वास्तव में, यह एक छोटे तरीके से करता है - पायथन __repr__स्ट्रिंग्स का उद्देश्य वैध पायथन एक्सप्रेशन होना है - यदि यह भाषा में मौजूद इलिप्सिस के लिए नहीं था जैसा कि यह है, प्रतिनिधित्व एक वैध अभिव्यक्ति नहीं होगा।
गारेथ लैट्टी

3
@ लिट्टीवेयर खैर, यह मूल डिजाइन सही है इसलिए इरादा रखता है। यह भी eval(repr(a))लक्ष्य के बराबर होने का इरादा रखता है a। दुर्भाग्य से यह व्यवहार में समय-समय पर गलत है, यहां तक ​​कि अंतर्निहित प्रकारों के लिए भी। इसे आज़माएँ a=[]; a.append(a); eval(repr(a)):। repr(a)है [[...]], पायथन 2 में अमान्य अभिव्यक्ति। (पायथन 3 में यह मान्य है, लेकिन इसका स्पष्ट परिणाम कुछ अलग है, फिर भी मूल इरादे के विपरीत है।)
5

1

यह बराबर है।

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

...एक निरंतर अंदर है built-in constants

अंडाकार

एलिप्सिस शाब्दिक "..." के समान है। उपयोगकर्ता-परिभाषित कंटेनर डेटा प्रकारों के लिए विस्तारित स्लाइसिंग सिंटैक्स के साथ संयोजन में ज्यादातर विशेष मूल्य का उपयोग किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.