ترفند پایتونی 4 – Underscores
خط زیر، یا بهتره بگیم Underscore ها چه از یکی (single) و چه از نوع دابل (double) در پایتون معنای متفاوتی دارند و حتی جای قرار گیریشون هم معنی متفاوتی ایجاد میکنه. هر چند برخی از این معانی بیشتر حالت قراردادی داره تا یک الزام باشه. 5 حالت underscore که قراره در ادامه بررسی شوند به این صورت هستن:
- Single Leading Underscore : _var
- _Single Trailing Underscore : var
- Double Leading Underscore : __var
- __Double Leading and Trailing Underscore : __var
- _ : Single Underscore
1- Single Leading Underscore یا “var_”
پایتون برخلاف زبان های برنامه نویسی مثل java الزامی برای تعیین private یا public بودن متغیرها نداره ولی به صورت قراردادی و بین برنامه نویسان پایتون مرسومه که در صورت استفاده از یک underscore قبل از متغیر اون متغیر private هستش. یعنی اینه که “برنامه نویس عزیز، رفیق، دوست من؛ این متغیر برای استفاده عمومی نیست ازش لطفا استفاده نکن”. به عبارت دیگه یعنی ” این متغیر private هستش خواهشا استفاده نفرمایید حتی شما دوست عزیز”. هر چند که شما دسترسی دارید می تونید تغییر بدید متغیر رو یا استفاده کنید. به طور مثال:
1 2 3 4 |
class Test: def __init__(self): self.foo = 11 self._bar = 23 |
2- Single Trailing Underscore یا “_var”
گاهی پیش میاد که می خواهیم از نام هایی که قبلا در پایتون استفاده شده، استفاده کنیم. ولی در صورت استفاده با خطای invalid syntax مواجه می شویم. اگر اصرار به استفاده از اون عبارت داریم یک راهکار اینه که از underscore پس از نام عبارت مورد نظرمون استفاده کنیم. به طور مثال:
1 2 3 4 |
def make_object(name, class): //SyntaxError: "invalid syntax" pass def make_object(name, class_): pass |
داستان underscore ها در حالت دابل کمی متفاوت تره!
به دو underscore پشت سر هم dunder هم میگن!
به طور مثال به __init__ میگن dunder init و البته به var__ هم میگن dunder var
3- Double Leading Underscore یا “var__”
مفسر پایتون در صورت استفاده از دو underscore به صورت پیشوند؛ اون عبارت رو چه متغیر باشه و چه متود (method) برای جلوگیری از تداخل نام ها (در subclass) تغییر نام میده. به این عمل name mangling می گویند. به طور مثال:
1 2 3 4 5 6 7 8 |
class Test: def __init__(self): self.foo = 11 self._bar = 23 self.__baz = 23 t = Test() print(dir(t)) |
در خروجی اگه کمی دقت کنید baz__ رو پیدا نمی کنید! چون پایتون نام رو به Test__baz_ تغییر داده.
مثال دیگر که نشون میده برای برنامه نویس این متغیر که با dunder شروع شده قابل استفاده و در اجرا تغییر نام خواهد داشت و نام مورد نظر در دسترس نیست مثال زیره:
1 2 3 4 5 |
class ManglingTest: def __init__(self): self.__mangled = 'hello' def get_mangled(self): return self.__mangled |
در صورتی که mangled__ به صورت مستقیم فراخوانی کنیم با خطا AttributeError رو به رو میشیم.
1 2 |
ManglingTest().get_mangled() #'hello' ManglingTest().__mangled #AttributeError: "'ManglingTest' object has no attribute '__mangled'" |
یه موضوع جالب این که شما می تونید با تغییر نام متغیر با توجه به خروجی پایتون به مقدار مورد نظر دسترسی پیدا کنید. به طور مثال در کد زیر MangledGlobal__mangled_ که به صورت global تعریف شده در خروجی mangled__ تغییر نام به MangledGlobal__mangled_ خواهیم داشت و در نتیجه خروجی متغیر بدون خطا خواهیم داشت.
1 2 3 4 5 6 |
_MangledGlobal__mangled = 23 class MangledGlobal: def test(self): return __mangled m = MangledGlobal().test() #23 print(m) |
4- Double Leading and Trailing Underscore یا “__var__”
متود ها (method) با دو underscore در پیش و دو underscore در پس، به dunder methods یا magic methods معروفن! هر چند که زیاد جادویی هم نیستن و اسم چندان جالبی نیست 😉
این متود ها رزرو شده هستن و از پیش ساخته البته شما میتونید متودهای خودتون رو با همین شرایط بنویسید. به طور مثال:
1 2 3 4 5 6 |
class PrefixPostfixTest: def __init__(self): self.__bam__ = 42 p = PrefixPostfixTest().__bam__ print(p) #42 |
5- Single Underscore یا “_”
اگه اسم متغیری مهم نباشه یا موقتی باشه از _ استفاده میشه. به طور مثال:
1 2 |
for _ in range(5): print('Welcome to datasense {}'.format(_)) |
یک کاربرد دیگه _ برای unpack کردن هستش. وقتی که براتون مقدار یه لیست مهم نیست و و لازمه فقط مقدار رو به یه متغیری پاس بدید میتونید از _ استفاده کنید. به طور مثال:
1 2 |
car = ('red', 'auto', 12, 3812.4) color, _, _, mileage = car |
مطالب جدید
دستهها
- Books (۱۲)
- Excel (۲)
- اکسل به زبان مثال …! (۹)
- ترفند های پایتونی (۶)
- هوش تجاری (۴۸)
- Power BI (۳۶)
- DAX (۱۳)
- Power Query (۹)
- SQL (۸)
- SSIS (۲)
- Power BI (۳۶)
- یادگیری ماشین (۸)
- ML Algorithm (۲)
- kNN (۲)
- pandas (۵)
- ML Algorithm (۲)
بایگانی
آمار بازدید
- ۰
- ۵
- ۵۲
- ۴۳,۶۲۶
- ۲۷ اردیبهشت, ۱۴۰۳