এলিপসিস অবজেক্টটি কী করে?


539

নেমস্পেসটি অবিচ্ছিন্নভাবে সার্ফ করার সময় আমি দেখতে পেলাম একটি অদ্ভুত Ellipsisলাগছে এমন বস্তু যা এটি বিশেষ কিছু বলে মনে হয় না বা করে না তবে এটি বিশ্বব্যাপী উপলব্ধ বিল্টিন।

একটি অনুসন্ধানের পরে আমি দেখতে পেলাম যে এটি নম্পি এবং স্কিপি দ্বারা স্লাইসিং সিনট্যাক্সের কিছু অস্পষ্ট রূপগুলিতে ব্যবহৃত হয় ... তবে প্রায় কিছুই নয়।

এই বস্তুটি বিশেষত নম্পি + স্কিপি সমর্থন করার জন্য ভাষায় যুক্ত হয়েছিল? এলিপসিসের কি আদৌ কোনও জেনেরিক অর্থ বা ব্যবহার রয়েছে?

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 সন্ধান যা আমাকে এই পৃষ্ঠার আনা ensued পাইথন তাই অদ্ভুত।।।
Cyoce

22
মনে রাখবেন যে ...একটি পুনরাবৃত্তিকারী রেটারে কেবল একটি স্থানধারক এবং এর সাথে কোনও সম্পর্ক নেইEllipsis
Eevee

16
সম্পূর্ণ দিকের নোটে, আমদানিতে ট্রিপল ডট অর্থ "দুটি প্যাকেজ আপ থেকে আমদানি"।
ম্যাড পদার্থবিজ্ঞানী

1
@croq stackoverflow.com/q/32395926/2988730stackoverflow.com/q/1054271/2988730 । এই দু'জনের উত্তরগুলিতে ডক্স এবং পিইপি-র সঠিক লিঙ্কগুলি সহ সমস্ত কিছু বোঝানো উচিত।
ম্যাড পদার্থবিজ্ঞানী

উত্তর:


557

এটি সম্প্রতি আরেকটি প্রশ্নে উঠে এসেছে । আমি সেখান থেকে আমার উত্তরটি বিস্তারিতভাবে বর্ণনা করব :

এলিপসিস এমন একটি বস্তু যা স্লাইস নোটেশনে প্রদর্শিত হতে পারে। উদাহরণ স্বরূপ:

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

এর ব্যাখ্যাটি কার্যত যা কিছু প্রয়োগ করে __getitem__এবং Ellipsisসেখানে বস্তুগুলি দেখে তা সম্পূর্ণরূপে নির্ভর করে তবে এর প্রধান (এবং উদ্দেশ্যযুক্ত) ব্যবহারটি স্তন্যপায়ী তৃতীয় পক্ষের লাইব্রেরিতে রয়েছে যা একটি বহুমাত্রিক অ্যারে প্রকার যুক্ত করে। যেহেতু একাধিক মাত্রা রয়েছে তাই স্লাইসিং কেবল একটি শুরু এবং স্টপ সূচকের চেয়ে জটিল হয়ে ওঠে; পাশাপাশি একাধিক মাত্রায় টুকরো টুকরো করতে সক্ষম useful উদাহরণস্বরূপ, একটি 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]])

এটি আরও প্রসারিত করে, এলিপসিসটি এখানে নির্দিষ্ট করা হয়নি এমন অ্যারের মাত্রাগুলির জন্য স্থানধারককে নির্দেশ করতে ব্যবহৃত হয় is পূর্ণ ফালি ইঙ্গিত হিসাবে মনে করে [:]ফাঁক সমস্ত মাত্রা এটা স্থাপন করা হয়, তাই একটি 3D অ্যারের জন্য, a[...,0]একই হিসাবে a[:,:,0]এবং 4D জন্য, a[:,:,:,0], একইভাবে, a[0,...,0]হয় a[0,:,:,0]পূর্ণ সংখ্যাকে মধ্যম করতে মধ্যে যদিও বহু কোলন সঙ্গে ( অ্যারে মাত্রা)।

মজার বিষয় হল, পাইথন 3-এ এলিসপিস আক্ষরিক ( ...) স্লাইস সিনট্যাক্সের বাইরে ব্যবহারযোগ্য, সুতরাং আপনি আসলে লিখতে পারেন:

>>> ...
Ellipsis

বিভিন্ন সংখ্যার ধরণের ব্যতীত, না, আমি মনে করি এটি ব্যবহৃত হয়েছে used যতদূর আমি সচেতন, এটি নিখুঁতভাবে ব্যবহারের জন্য যুক্ত করা হয়েছিল এবং অবজেক্টটি সরবরাহ এবং এটির সাথে সম্পর্কিত সিনট্যাক্স ব্যতীত কোনও মূল সমর্থন নেই। বস্তুটি সেখানে থাকার জন্য এটির প্রয়োজন ছিল না, তবে টুকরো জন্য আক্ষরিক "..." সমর্থন করেছে।


22
এটি স্টপ ফাইলগুলিতে ইঙ্গিত করা PEP484 টাইপ-এও ব্যবহৃত হয়
নভেম্বর

24
কারও কৌতূহলের ক্ষেত্রে এটি স্ট্যান্ডার্ড-লাইব্রেরি typingমডিউলটিতেও ব্যবহৃত হয় : উদাহরণস্বরূপ Callable[..., int]একটি কলযোগ্য যা intস্বাক্ষর নির্দিষ্ট করে না দিয়ে একটি ফেরত Tuple[str, ...]দেয় , বা স্ট্রিংগুলির একটি পরিবর্তনশীল দৈর্ঘ্যের সমজাতীয় টুপল নির্দেশ করতে।
আনখন্দ

6
এফওয়াইআই, ফাস্টাপি ফ্রেমওয়ার্ক (যা পাইথন ৩.+++ এর জন্য) এটিও ব্যবহার করে (এখন)। fastapi.tiangolo.com
অ্যান্ড্রু

2
@ আর্টঅফ ওয়ারফেয়ার আপনি সম্পূর্ণরূপে সঠিক, এবং এটি এমন কারও কাছ থেকে এসেছেন যিনি বাক্যটির মধ্যবর্তী স্থানে পাঠের পরিবর্তে মৌখিকভাবে "উপবৃত্তাকার" বলে থাকেন।
প্রাইমরিবিডিল

আমি এটি খুঁজে পেয়েছি। আপনি যখন একটি তালিকায় একটি স্ব-রেফারেন্স (বিজ্ঞপ্তি রেফারেন্স) করেন তখন মনে হয় এটি a = [1, 2]; a[0] = a; print(a)দেয় : দেয় [[...], 2]। এটি কি একই জিনিস বা অন্যরকম ব্যবহার?
বিল

219

পাইথন 3 এ, আপনি ...কোডের জন্য "নাড়" স্থানধারক হিসাবে এলিপসিস আক্ষরিক ব্যবহার করতে পারেন :

def will_do_something():
    ...

এটি যাদু নয় ; এর পরিবর্তে যে কোনও অভিব্যক্তি ব্যবহার করা যেতে পারে ..., যেমন:

def will_do_something():
    1

("অনুমোদিত" শব্দটি ব্যবহার করতে পারবেন না, তবে আমি বলতে পারি যে এই ব্যবহারটি স্পষ্টভাবে গুয়েডো প্রত্যাখ্যান করেননি ।)


180
অর্ধ-কনভেনশনে, আমি প্রায়শই ...ব্যবহৃত দেখতে পাই যেখানে লোকেরা কিছু পরে যা পূরণ করতে চায় তার একটি ইঙ্গিত দিতে চায় (একটি 'টুডো' খালি ব্লক) এবং passকোনও কোড না থাকার উদ্দেশ্যে একটি ব্লককে বোঝায়।
গ্যারেথ লেটি

26
পাইথনেরও NotImplementedআক্ষরিক রয়েছে যা আপনি যখন আপনার অসম্পূর্ণ ফাংশনটি অর্থবহ কিছু ফিরিয়ে দিতে চান (তখন Noneআপনার উদাহরণের পরিবর্তে )) (আর একটি ইউজকেস: গাণিতিক ক্রিয়াকলাপ বাস্তবায়ন করছে )
zvyn

13
@zvyn এটি আক্ষরিক নয়। এটি কেবল একটি নাম। উদাহরণস্বরূপ NotImplemented = 'something_else'বৈধ পাইথন, তবে ... = 'something_else'এটি একটি সিনট্যাক্স ত্রুটি।
wim

4
@zvyn সেই মডিউলটি আমদানির সময় যদি কোনও ব্যতিক্রম ঘটে? :)
pizzapants 184

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

থেকে পাইথন ডকুমেন্টেশন :

এই বস্তুটি সাধারণত কাটা ( টুকরো দেখুন ) দ্বারা ব্যবহৃত হয় । এটি কোনও বিশেষ ক্রিয়াকলাপ সমর্থন করে না। এলিপিসিস (একটি অন্তর্নির্মিত নাম) নামে ঠিক একটি উপবৃত্তাকার অবজেক্ট রয়েছে। 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.0 এবং 2.7.12 এ পরীক্ষিত 2


এটি -O যুক্তি দিয়ে চালান এবং আপনার কোড সর্বদা চলবে; ডি
মোশেভি

12

আপনি আলেপিস নিজেই ব্যবহার করতে পারেন, কাস্টম টুকরো টুকরো টুকরো করা পরিস্থিতিতে যেমন নম্পি করেছে, তবে কোনও বিল্টিন ক্লাসে এর কোনও ব্যবহার নেই।

আমি জানি না এটি বিশেষত নাম্পায় ব্যবহারের জন্য যুক্ত হয়েছিল কিনা, তবে আমি অবশ্যই এটি অন্য কোথাও ব্যবহার করতে দেখিনি।

আরও দেখুন: পাইথনে আপনি কীভাবে উপবৃত্তাকার স্লাইসিং সিনট্যাক্স ব্যবহার করবেন?


7

@ নোজা এবং @ ফিনিক্স দ্বারা উল্লিখিত হিসাবে - আপনি এটি স্টাব ফাইলগুলিতে ব্যবহার করতে পারেন। যেমন

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

এই উপবৃত্তটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও তথ্য এবং উদাহরণগুলি এখানে https://www.python.org/dev/peps/pep-0484/#stub-files খুঁজে পাওয়া যাবে


2

এর উদ্দেশ্য ব্যবহার কেবল এই 3 য় পক্ষের মডিউলগুলির জন্যই হওয়া উচিত নয়। এটা তোলে পাইথন ডকুমেন্টেশনে সঠিকভাবে উল্লেখ নেই (অথবা হয়তো, আমি শুধু যে খুঁজে পাইনি) কিন্তু ঊহ্য শব্দ ...আসলে CPython ব্যবহার করা হয় অন্তত এক জায়গায়।

এটি পাইথনে অসীম ডেটা স্ট্রাকচার উপস্থাপনের জন্য ব্যবহৃত হয়। আমি তালিকা সহ চারপাশে খেলতে গিয়ে এই স্বরলিপিটির উপরে এসেছি।

আরও তথ্যের জন্য এই প্রশ্নটি দেখুন ।


8
বিভিন্ন জিনিস T এই প্রশ্নটি ellipsisবিল্ট-ইন টাইপ এবং Ellipsisঅবজেক্ট সম্পর্কে জিজ্ঞাসা করে । উপবৃত্তাকার সহ অসীম ডেটা স্ট্রাকচারের প্রতিনিধিত্ব করা বিশুদ্ধরূপে প্রদর্শনের জন্য, ellipsisটাইপ বা Ellipsisঅবজেক্টের সাথে কিছুই করার নেই ।
ছাই

3
@ চিয়েস আসলে, এটি একটি ছোট উপায়ে করে - পাইথন __repr__স্ট্রিংগুলি বৈধ পাইথন এক্সপ্রেশন হওয়ার লক্ষ্য করে - যদি এটি ভাষায় বিদ্যমান উপবৃত্ত যেমন না হয় তবে উপস্থাপনাটি বৈধ অভিব্যক্তি না হত।
গ্যারেথ লেটি

3
@ ল্যাটিওয়্যার ওয়েল, এটি আসল নকশাটি যার যার উদ্দেশ্য তাই সত্য। এটিও eval(repr(a))সমান হতে লক্ষ্য করে a। দুর্ভাগ্যক্রমে এটি সময়ে সময়ে বাস্তবে মিথ্যা, এমনকি অন্তর্নির্মিত ধরণের জন্যও। এই আউট চেষ্টা করুন: a=[]; a.append(a); eval(repr(a))repr(a)হয় [[...]], পাইথন 2. অবৈধ অভিব্যক্তি (পাইথন 3 এটা বৈধ, কিন্তু Eval ফলাফলের ভিন্ন কিছু, এখনও মূল উদ্দেশ্য বিপরীত।)
chys

1

এটি সমতুল্য।

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

...ভিতরে একটি ধ্রুবক সংজ্ঞায়িত হয় built-in constants

ঊহ্য শব্দ

এলিপিসিস আক্ষরিক "..." এর মতোই। ব্যবহারকারী-সংজ্ঞায়িত ধারক ডেটা ধরণের জন্য প্রসারিত স্লাইসিং সিনট্যাক্সের সাথে একত্রে ব্যবহৃত বিশেষ মান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.