آبجکت Ellipsis یا سه نقطه (...) در پایتون

شاید توی بعضی سورس‌کدهای پایتونی، مخصوصاً کتابخونه‌های مطرح، سه نقطه(...) رو دیده باشید و کنجکاو باشید که کارش چیه و چرا اونجا استفاده شده، شاید هم باهاش آشنا نباشید و از وجودش خبر نداشته باشید. توی این پست، میبینیم که این ... اصلا چی هست و کجاها استفاده میشه.

به گفته داکیومنت پایتون، Ellipsis یک مقدار ویژه‌اس که بیشتر در سینتکس slicing برای دیتا تایپ‌های تعریفیِ کاربر به کار میره.

چیز زیادی نمیشه ازش فهمید، نه؟ خب بریم ببینیم کجاها استفاده میشه تا درکش برامون راحت تر بشه.

۱. به عنوان place holder

از ... میتونیم به جای pass، درون تابع، یا کلاسی که هنوز نوشته نشده استفاده کنیم:

درواقع به جای pass میتونیم هر expression‌ای، مثلا یک عدد استفاده کنیم:

۲. ... در numpy

شاید بیشترین استفاده از ... توی کتابخونه ‌numpy و برای slice کردن آرایه‌های چند بعدی(ماتریس) باشه.

به فرض مثال اگه توی پایتون، یه آرایه دو بعدی داشته باشیم، و بخوایم به عنصر دوم از لیست دوم دسترسی پیدا کنیم، باید به شکل زیر عمل کنیم:

که مقدار 5 در c قرار میگیره
که مقدار 5 در c قرار میگیره

در numpy نیازی نیست از دو براکت استفاده کنیم و میتونیم مقدار مربوط به هر براکت رو با کاما از هم جدا کنیم:

که باز هم 5 رو برای ما میگیره
که باز هم 5 رو برای ما میگیره

حالا اگه بخوایم تمام اعضای آرایه دوم رو بگیریم:

که [4,5,6] رو برای ما میگیره
که [4,5,6] رو برای ما میگیره

حالا کار جالبی که میتونیم انجام بدیم اینه که مثلا عنصر دوم، از تمام آرایه‌ها رو بگیریم:

که [2,5] رو برامون میگیره
که [2,5] رو برامون میگیره


۳. در Circular Refrenceها

ویرایش:‌ (توضیحات کامل تر در مورد این بخش رو از اینجا بخونید)

اول با یه مثال بگیم که Circualr Refrence ها چی هستن:

ارجاع چرخشی وقتی اتفاق میوفته که متغیر درون آبجکت A به آبجکت B اشاره میکنه، و متغیر درون آبجکت B به آبجکت A اشاره میکنه.

اینجا عنصر دوم لیست a، داره به خود لیست اشاره میکنه، و پایتون بجای اینکه بیاد تا ابد دوباره همون لیست رو قرار بده و صفحه رو پُر کنه، یا توی یه حلقه بی‌نهایت گیر کنه، میاد اونجا رو با [...] پر میکنه.

۴. در فریموورک FastAPI

یه استفاده جالب از ... رو در فریموورک FastAPI دیدم:

در لینک‌های وب، مثلا لینک زیر

google.com/?q=test

به اون q کوئری پارامتر میگیم.

توی این فریموورک میتونیم کوئری پارامتر ها رو به این شکل تعریف کنیم:

یک کوئری پارامتر اجباری در FastAPI
یک کوئری پارامتر اجباری در FastAPI

حالا اگه بخوایم به فریموورک بفهمونیم که این کوئری پارامتر اجباری نیست، باید یک مقدار پیشفرض براش مشخص کنیم که اگر کاربر چیزی وارد نکرد، اون مقدار پیشفرض رو به جاش قرار بده:

کد قبل رو به q: str = None تغییر دادیم، و ‌None مقدار پیشفرضمونه
کد قبل رو به q: str = None تغییر دادیم، و ‌None مقدار پیشفرضمونه

این فریموورک بهمون اجازه میده که ولیدیشن‌های بیشتری هم روی اون کوئری پارامتر انجام بدیم، مثلا مشخص کنیم که حداقل چند کاراکتر داشته باشه:

اینجا مشخص کردیم که طول q باید بیشتر از ۳ کاراکتر باشه
اینجا مشخص کردیم که طول q باید بیشتر از ۳ کاراکتر باشه

اگه دقت کنید، چون q رو مساوی با چیزی قرار دادیم، به اون یه مقدار پیشفرض None دادیم که توی آرگومان اول تعریف شده!

حالا اگه بخوایم بگیم که این پارامتر اجباری هست باید چیکار کنیم؟

میتونیم این کارو انجام بدیم:

read_items(q: str):

ولی در این حالت دیگه نمیتونیم از ولیدیشن‌های اضافی استفاده کنیم.

اینجاست که ... به کارمون میاد:

با قرار دادن ... در اولین آرگومان Query میتونیم مشخص کنیم که q اجباری هست و حتما باید فراهم بشه.


منابع:

What is Python's Ellipsis Object?

Python Ellipsis (triple dots): What is it, How to Use

What does the Ellipsis object do?

"Slicing" in Python Expressions documentation

Ellipsis