کاربرد _ در پایتون + ویدیو

شاید خیلی از توسعه‌دهنده‌های پایتون خبری از وجود _ به عنوان یک ابزار مهم نداشته باشند. در واقع خودم یکی از اون‌ها بودم. خب باید بگم که این علامت ( _ ) که به انگلیسی میشه Undrescore در جاهای مختلفی از برنامه کاربرد داره. بیایید به کاربردهاش یه نگاهی بندازیم.

https://www.aparat.com/v/3KdmG

کاربرد اول: استفاده در مفسر پایتون

آخرین دستوری که منجر به یه خروجی شده چیه؟ حالا اون خروجی دقیقا چیه؟ اگه می‌خواید به اون مقدار دسترسی داشته باشید کافیه که توی خود مفسر تعاملی پایتون عملگر _ رو وارد بکنید. مثلا:

>>> a = 20
>>> a
20
>>> _
20
>>> _ - 10
10

کاربرد دوم: نادیده گرفتن مقادیر

زمانی که بخواید یه مقداری یا مقادیری رو در برای انتساب‌های جمعی نادیده بگیرید می‌تونید از ـ استفاده کنید. برای روشن شدن قضیه به کد زیر نگاه کنید:

a, _, b = (1, 2, 3) # a = 1, b = 3
print(a, b)

مقدار ۲ در هیچ متغیری ذخیره نمیشه. اگر هم از یک علامت ستاره قبل از آندرسکور استفاده کنید یک بازه از مقادیر رو بیخیال میشه:

a, *_, b = (7, 6, 5, 4, 3, 2, 1)
print(a, b)

کاربرد سوم: استفاده در حلقه‌ها

می‌تونید بجای استفاده از متغیر در یک حلقه for از یک آندرسکور استفاده کنید:

for _ in 'Arastoo':
    print( _ )

کاربرد چهارم: جدا کردن ارقام

وقتی می‌خواید یه مقدار عددی بزرگ رو در یک متغیر قرار بدید، اگه نمی‌تونید که درست از تعداد ارقام متوجه بشید می‌تونید با _ اون‌ها رو از هم جدا بکنید. البته این تنها یک موضوع ظاهریه و چیزی رو توی متغیر غیر از عدد واقعی ذخیره نمیکنه:

million = 1_000_000
binary = 0b_0010
octa = 0o_64
hexa = 0x_23_ab

کاربرد پنجم: مهمترین مورد: نام گذاری

چهار حالت برای نام‌گذاری متغیر با استفاده از _ وجود دارد:

  • استفاده از _ قبل از نام متغیر
  • استفاده از _ بعد از نام متغیر
  • استفاده از دو _ قبل از نام متغیر
  • استفاده از دو _ قبل و بعد از نام متغیر

استفاده از _ قبل از نام متغیر

class Test:

    def __init__(self):
        self.name = &quotdatacamp&quot
        self._num = 7

obj = Test()
print(obj.name)
print(obj._num)

در قواعد پایتون ذکر شده که برای خصوصیاتی که می‌خواهید Private باشند از یک _ قبل از نام آن‌ها استفاده کنید. البته این موضوع در روند اجرا کاری انجام نمی‌دهد اما اگر بخواهید اصولی کد بنویسید باید این موضوع را در نظر داشته باشید.

البته برای توابع می‌شود از چنین قابلیتی حتی در روند اجرا نیز استفاده کرد. به تکه کد زیر نگاه کنید:

def func():
    return &quotdatacamp&quot

def _private_func():
    return 7

حالا اگه بخوام که تابع رو توی یه ماژول دیگه import بکنم با تابع func مشکلی نخواهد داشت ولی تابع _private_func رو نمیتونم import بکنم:

>>> from my_functions import *
>>> func()
'datacamp'
>>> _private_func()
Traceback (most recent call last):
  File &quot<stdin>&quot, line 1, in <module>
NameError: name '_private_func' is not defined

البته اگه شیوه import کردن رو تغییر بدم و مستقیم از نام تابع همراه با ماژول استفاده بکنم همچین قابلیتی غیرفعال میشه:

>>> import my_functions
>>> my_functions.func()
'datacamp'
>>> my_functions._private_func()
7

ظاهرا تنها زمانی که بخواید به صورت غیر مستقیما (تکنیکالی اینم اشتباهه) از تابع استفاده کنید به شما خطا میده.

استفاده از _ بعد از نام متغیر

زمانی که مجبور باشید از یک نام برای متغیر استفاده بکنید که همزمان اون نام کلمه کلیدی پایتون هستش می‌تونید یک _ به آخرش اضافه کنید:

>>> def function(class):
  File &quot<stdin>&quot, line 1
    def function(class):
                 ^
SyntaxError: invalid syntax
>>> def function(class_):
...     pass

استفاده از دو _ قبل از نام متغیر

تصور کنید که شما دو کلاس دارید که هر دو یک خصوصیت با یک اسم دارند. حالا شما یک کلاس سوم هم دارید که از هر دو کلاس قبلی میخواد ارث‌بری بکنه، زمانی که بخواد به هر دو خصوصیت دسترسی داشته باشه به مشکل بر می‌خوره چرا که نمی‌تونه همزمان از دو خصوصیت با یک نام استفاده بکنه. پایتون برای حل این مشکل با تکنیک name mangling از ما پذیرایی میکنه.

مثال:

class Sample():

    def __init__(self):
        self.a = 1
        self._b = 2
        self.__c = 3
obj1 = Sample()

برای دسترسی داشتن به خصوصیات a و b و c چه کاری انجام می‌دهید:

print(obj1.a)
print(obj1._b)
print(obj1.__c)

حالا اگر برنامه رو اجرا بکنید با مشکل روبرو می‌شید. چرا که ما عضوی به اسم __c رو نداریم. بجاش پایتون می‌آد اون عضور رو _Sample__c معرفی میکنه. یعنی ترکیبی از نام کلاس و خود خصوصیت. اینطوری دیگه مشکلی پیش نمیاد.

برای درک بهتر قضیه پیشنهاد میکنم ویدیو اول این مطلب رو ببینید.

استفاده از دو _ قبل و بعد از نام متغیر

توی پایتون به متدهایی که به شکل زیر هستند میگیم متدهای جادویی یا داندر متد. این دستورات ابزارهای پیشفرض پایتونی هستند.

class Sample():

    def __init__(self):
        self.__num__ = 7

obj = Sample()
obj.__num__

بهتره هیچوقت برای اسم گذاری‌هامون از این سبک استفاده نکنیم چرا که ممکنه با دستورات اصلی پایتون اشتباه گرفته بشن.

منبع
https://www.datacamp.com/community/tutorials/role-underscore-python<br/>