از استفادههای ساده تا تکنیکهای پیشرفته، underscore در پایتون میتواند به شما کمک کند تا کدهای خود را به شکلی بهینه و سازماندهی شده بنویسید. با ما همراه باشید تا در این سفر جذاب، با پنج حالت مختلف underscore آشنا شویم و یاد بگیریم چگونه میتوانیم از این ابزار قدرتمند در برنامهنویسی خود بهرهبرداری کنیم. امیدواریم با مطالعه این مقاله، درک بهتری از underscore پیدا کنید و بتوانید از آن به شیوهای مؤثر در پروژههای خود استفاده کنید.
underscore در واقع همان underline است، پس نگران نباشید!
- حالت اول: استفاده خالی از underscore. به عنوان مثال:
_ = 'hello' # or for _ in range(1, 10): print(_)
اگر در کدی با چنین مواردی مواجه شدید، باید بدانید که پایتون معمولاً آخرین مقداری که به مفسر داده شده را در متغیر _ ذخیره میکند (به عنوان آخرین متغیر). همچنین، برنامهنویسی که از underscore خالی استفاده میکند، معمولاً به دنبال یک متغیر موقت است که در سایر بخشهای کد استفاده نخواهد شد (برای مثال، در حلقهها منطقی است). به طور کلی، زمانی از underscore خالی استفاده میشود که متغیر فقط در همان جا کاربرد داشته و نیاز به استفاده در سایر نقاط کد نباشد.
بنابراین، هر زمان که با استفاده از underscore به تنهایی به عنوان نام یک متغیر مواجه شدیم، میتوانیم به سرعت نتیجه بگیریم که این متغیر برای برنامهنویس اهمیت خاصی نداشته و به عنوان یک متغیر موقت به کار رفته است.
- حالت دوم: استفاده از یک underscore قبل از نام متغیر یا تابع. به عنوان مثال:
_name = 'xxx' def _fun(): print(1)
این نوع نامگذاری به معنای آن است که متغیر یا تابع مورد نظر به عنوان خصوصی در نظر گرفته میشود و نباید خارج از کلاس استفاده شود. توجه داشته باشید که پایتون به صورت پیشفرض به این نامگذاریها توجه نمیکند و شما همچنان میتوانید به این متغیرها از طریق import دسترسی پیدا کنید. این نوع نامگذاری بیشتر برای مشخص کردن محدوده استفاده برای خودتان و تیمتان است، نه اینکه پایتون به صورت واقعی دسترسی را محدود کند.
مثال:
# Class C1 name = 'amir' _age = 21
اگر این فایل را import کنیم:
# Class C2 from C1 import name, _age
کد بالا بدون مشکل اجرا میشود. همچنین:
import C1 C1._age
باز هم بدون ارور اجرا میشود. با این حال، در صورتی که از import * استفاده کنیم:
from C1 import * print(_age)
در این حالت با ارور مواجه خواهیم شد. پایتون فقط زمانی underscore را وارد نمیکند که از علامت ستاره استفاده شود، در غیر این صورت به صورت معمولی رفتار میکند.
- حالت سوم: قرار دادن underscore بعد از نام (در موارد خاص). این تکنیک به ویژه زمانی مفید است که بخواهید از نامهایی که به طور پیشفرض کلمات کلیدی هستند استفاده کنید. به عنوان مثال:
class = 'class one' # این کد خطا میدهد class_ = 'class two' # این کد بدون خطا اجرا میشود
این روش به شما اجازه میدهد که نامهای خاصی را که در پایتون کلمات کلیدی هستند، با اضافه کردن underscore به انتهای آنها، استفاده کنید.
- حالت چهارم: در این حالت وارد مبحث شیگرایی میشویم و از دو آندرلاین (underscore) قبل از نام متغیر استفاده میکنیم که به آن “double underscore” یا در اصطلاح برنامهنویسان “dunder” گفته میشود. برای مثال، متغیر
__name
به صورت “داندر نیم” خوانده میشود. اما این نوع نامگذاری چه کاربردی دارد؟ فرض کنید دو کلاس داریم که یکی از دیگری ارثبری میکند:
class Human(): def __init__(self): self.sex = 'male' self.name = 'karim' class Teacher(Human): def __init__(self): super().__init__() self.count = 2 self.name = 'math'
اگر به کلاسها دقت کنید، هر دو شامل یک فیلد name
هستند. از آنجا که کلاس Teacher
از Human
ارثبری میکند، فیلدهای name
در این دو کلاس با یکدیگر تداخل پیدا میکنند. در اینجا است که استفاده از dunder به کمک ما میآید.
حال بیایید مثال را تغییر دهیم:
class Human(): def __init__(self): self.sex = 'male' self.__name = 'karim' class Teacher(Human): def __init__(self): super().__init__() self.count = 2 self.__name = 'math'
شاید به نظر برسد که نامها همچنان مشابه هستند، اما تفاوت اینجاست که با استفاده از dunder، پایتون بهطور خودکار نامهای متغیرها را تغییر میدهد و نام کلاس را به آن اضافه میکند.
بهعنوان مثال، اگر یک شیء بسازیم:
t1 = Teacher() dir(t1)
نتیجه به این صورت خواهد بود:
['_Human__name', '_Teacher__name', 'sex', 'count']
میبینید که پایتون بهطور خودکار نام پراپرتیها را تغییر داده و کلاس مربوطه را به ابتدای آنها اضافه کرده است، که باعث میشود تداخلی بین فیلدها ایجاد نشود.😁
- حالت پنجم: این حالت زمانی است که شما از دو آندرلاین در ابتدای نام و دو آندرلاین در انتهای آن استفاده میکنید. به عنوان مثال:
__init__
که به آن “متدهای جادویی” (magic methods) گفته میشود. این نوع نامگذاری توسط مفسر پایتون نادیده گرفته نمیشود و بیشتر برای خوانایی کد است. این نوع متدها برای کارهای خاصی رزرو میشوند و معمولاً خارج از آن کار خاص استفاده نمیشوند. - برای مثال، وقتی در یک کلاس از متد
__init__
استفاده میکنید، این متد به عنوان سازنده کلاس عمل میکند و خارج از کلاس به کار نمیآید.
نکته: در بین توسعهدهندگان پایتون، تلفظ مرسومی برای نامهایی مانند full_name__
اینگونه است که دو آندرلاین (_
) به صورت “داندر” خوانده میشود (به دلیل ترکیب Double Underscore = Dunder). بنابراین، به جای گفتن “فول نیم با دابل آندرلاین”، اصطلاحاً میگوییم «داندر فول نیم». به همین ترتیب، اگر با چیزی مانند __init__
مواجه شدیم، آن را به صورت «داندر اینیت» تلفظ میکنیم و نیازی نیست که «داندر اینیت داندر» گفته شود. برای سادگی، فقط تنها بخش اول تلفظ میشود.
- در نهایت، باید تأکید کنم که یادگیری و استفاده از این تکنیکها نهتنها برای درک بهتر کد خودتان مفید است، بلکه برای سایر برنامهنویسانی که کد شما را مرور میکنند نیز بسیار سودمند خواهد بود. ✨
نتیجهگیری:
در دنیای پایتون، مفاهیمی مانند “underscore” یا آندرلاین نقش مهمی در بهینهسازی و سازماندهی کد دارند. این مفهوم که ممکن است برای تازهکاران کمی مبهم به نظر برسد، از تکنیکهای ساده تا پیشرفتهای را شامل میشود که به نوشتن کدی خواناتر و کارآمدتر کمک میکند. در این مقاله، با پنج حالت مختلف استفاده از underscore آشنا شدیم و دیدیم چگونه میتوانیم از آن در پروژههای خود بهره بگیریم. امیدواریم این توضیحات به درک بهتر این ابزار قدرتمند و استفاده مؤثرتر از آن در کدنویسیتان کمک کند. اگه شما هم نکتهای میدانستید، حتما تو کامنتها مطرح کنید.
6 پاسخ
خیلی خوب توضیح دادین و خیلی راحت تونستم مطلب رو متوجه بشم
مرسی از حمایتتون.
خوشحالم از اینکه مفید بوده براتون
خیلی مقاله کاملی بود.
دمتون گرم
ارادت
لطف دارید
خوشحالم مفید بوده براتون
با سلام و عرض ادب خدمت ادمین های عزیز
*این کامنت را پخش نکنید با تشکر
در متنی که نوشتید ۱۷ غلط املایی که بجای underscore شما کلمه ی underscope را نوشتید که غلط هست و حتی در خود کانال کد اکسپلور در قسمت متن بولد شده باز هم این اشتباه تایپی وجود دارد
با تشکر از شما و مقالات خوبتون
درود. وقت بخیر.
اصلاحات انجام شد.
با تشکر از گزارش شما.