اگر یک برنامه نویس پایتون هستید احتمالا زیاد شنیدید که پایتون بدرد ساخت نرم افزار های گرافیکی نمیخوره و بهتره که از زبان های دیگه مثل ++C و یا #C استفاده بشه!
در بین IDE هایی که روزانه ازشون استفاده میکنیم احتمالا اسم Spyder به گوشتون خورده. افرادی که در حوزه ی هوش مصنوعی و یا Data Science مشغول هستند اسم این نرم افزار محبوب رو زیاد شنیدن و یا حتما ازش زیاد استفاده کردن و یا استفاده میکنن. بطور کلی این نرم افزار یک IDE قدرتمند و Cross-Platform عه که برای حوزه های هوش مصنوعی و Data science طراحی شده است.
💢 از قابلیت های این نرم افزار میشه به :
• پشتیبانی از چندین IPython Console
• دارا بودن یک Profiler برای گرفتن benchmark از کد
• دارا بودن یک history از هر دستوری که در هر Console زده میشه
• قابلیت نصب پلاگین
و ... اشاره کرد
📣 نکته ای که وجود داره اینه که این نرم افزار با استفاده از PyQt و PySide طراحی و ساخته شده یعنی یک نرم افزار که با پایتون برای پایتون ایجاد شده 8)
Website : https://www.spyder-ide.org/
Spyder in github : https://github.com/spyder-ide/spyder
در بین IDE هایی که روزانه ازشون استفاده میکنیم احتمالا اسم Spyder به گوشتون خورده. افرادی که در حوزه ی هوش مصنوعی و یا Data Science مشغول هستند اسم این نرم افزار محبوب رو زیاد شنیدن و یا حتما ازش زیاد استفاده کردن و یا استفاده میکنن. بطور کلی این نرم افزار یک IDE قدرتمند و Cross-Platform عه که برای حوزه های هوش مصنوعی و Data science طراحی شده است.
💢 از قابلیت های این نرم افزار میشه به :
• پشتیبانی از چندین IPython Console
• دارا بودن یک Profiler برای گرفتن benchmark از کد
• دارا بودن یک history از هر دستوری که در هر Console زده میشه
• قابلیت نصب پلاگین
و ... اشاره کرد
📣 نکته ای که وجود داره اینه که این نرم افزار با استفاده از PyQt و PySide طراحی و ساخته شده یعنی یک نرم افزار که با پایتون برای پایتون ایجاد شده 8)
Website : https://www.spyder-ide.org/
Spyder in github : https://github.com/spyder-ide/spyder
This media is not supported in your browser
VIEW IN TELEGRAM
☁️ دامنه ابری
دامنه ابری ایده ایست برای شکستن انحصار دامنه های سنتی که توسط آیکان ثبت می شود و رایگان نیست.
اما در پای ابر شما می توانید دامنه ابری ثبت نمایید به صورت کاملا رایگان؛ فقط کافیست لینک یک دامنه قبلی یا آی پی اون هاست مورد نظر را روی آن تنظیم نمایید
🖥 فعلا این فناوری در پای ابر موجود است و امنیت فوق العاده بالایی دارد
✒️ در ضمن این دامنه ها در پای ابر هر کس برای آن شخص قابل تغییر است و انحصار طلبی را بسیار پایین می آورد
به طور مثال:
🔗 abr://pyabr.ir
دامنه پای ابر است که به آی پی سرور پای ابر تبدیل می شود.
🔰 @PSFarsi
🔰 @PyFarsi
دامنه ابری ایده ایست برای شکستن انحصار دامنه های سنتی که توسط آیکان ثبت می شود و رایگان نیست.
اما در پای ابر شما می توانید دامنه ابری ثبت نمایید به صورت کاملا رایگان؛ فقط کافیست لینک یک دامنه قبلی یا آی پی اون هاست مورد نظر را روی آن تنظیم نمایید
🖥 فعلا این فناوری در پای ابر موجود است و امنیت فوق العاده بالایی دارد
✒️ در ضمن این دامنه ها در پای ابر هر کس برای آن شخص قابل تغییر است و انحصار طلبی را بسیار پایین می آورد
به طور مثال:
🔗 abr://pyabr.ir
دامنه پای ابر است که به آی پی سرور پای ابر تبدیل می شود.
🔰 @PSFarsi
🔰 @PyFarsi
✔️دوره آموزش FastAPI به زبان فارسی
7️⃣2️⃣ قسمت بیست و هفتم
https://youtu.be/uTtPbQa4bxk
#fastapi #آموزش
🆔 @PyFarsi
7️⃣2️⃣ قسمت بیست و هفتم
https://youtu.be/uTtPbQa4bxk
#fastapi #آموزش
🆔 @PyFarsi
YouTube
آموزش Api نویس با FastApi Python ( Instagram قسمت اول پروژه )
سلام به کانال یوتیوبی پرشین پایتون خوش آمدید
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
آیا کلمه کلیدی del آبجکت رو پاک میکند ؟
متاسفانه با یه سرچ سریع میشه دید که خیلی از وبسایت ها یا مقالات نوشتن که del باعث پاک شدن آبجکت میشه. ولی در حقیقت اصلا اینطور نیست. پاک شدن آبجکت کار del نیست. توی پایتون دوتا mechanism هست برای از بین بردن آبجکت هایی که دیگه نیازشون نداریم:
1- Reference counting
2- Garbage collector
اولی میگه اگر تعداد رفرنس هایی که به یک آبجکت هستن به صفر برسه اون آبجکت پاک میشه.
دومی وقتی وارد عمل میشه که ما circular reference یا self reference داشته باشیم که اولی میگه دوتا آبجکت به هم دیگه reference داشته باشن دومی میگه یه آبجکت که نقش container و بازی میکنه یه رفرنس به خودش داشته باشه. تو این حالت هیچوقت reference به صفر نمیرسه در نتیجه آبجکت با reference counting پاک نمیشه. اینجا garbage collector میاد وسط.
حالا del چیکار میکنه ؟ فقط میاد اون اسم رو پاک میکنه! گفته بودیم متغیر ها اسم ها یا سیمبل هایی هستن که اشاره میکنن به یه آبجکتی توی مموری. یک رفرنس هستن!
برای تستش بریم درباره داندر del صحبت کنیم. این متد هیچ ربطی به کلمه کلیدی del نداره. این متد زمانی call میشه که آبجکت داره از بین میره! بهش finalizer میگن(destructor خیلی واژه صحیحی نیست). این رو پیاده سازی میکنیم تا بفهمیم کی آبجکت از بین رفت.
همونطور که تو عکس میبینید:
http://www.upsara.com/images/j708789_.png
- تو cell شماره ۲ تنها رفرنس به آبجکت ساخته شده obj هست پس با del کردنش آبجکت هم پاک میشه.
- تو cell شماره ۴ ولی نشد چرا ؟ چون علاوه بر خودش یه رفرنس هم داخل لیست داشت.
- شما برای کم کردن رفرنس یه آبجکت میتونید متغیرش رو به یه آبجکت دیگه assign کنید. الان اگه cell شماره ۷ رو ببینید، دقیقا همون کاری و کرده که del داشته میکرده. تنها فرقش اینکه با زدن del دیگه اون name عه obj موجود نیست.
- خارج شدن از scope یه فاکشن هم یه رفرنس کم میکنه ازش. توی cell شماره ۸ چون آبجکت اون تو ساخته شده بوده و تنها رفرنس بوده بعد از اتمام فانکشن آبجکت delete میشه.
با متد getrefcount از ماژول sys میتونید تعداد رفرنس های به یه آبجکت رو ببینید.
متاسفانه با یه سرچ سریع میشه دید که خیلی از وبسایت ها یا مقالات نوشتن که del باعث پاک شدن آبجکت میشه. ولی در حقیقت اصلا اینطور نیست. پاک شدن آبجکت کار del نیست. توی پایتون دوتا mechanism هست برای از بین بردن آبجکت هایی که دیگه نیازشون نداریم:
1- Reference counting
2- Garbage collector
اولی میگه اگر تعداد رفرنس هایی که به یک آبجکت هستن به صفر برسه اون آبجکت پاک میشه.
دومی وقتی وارد عمل میشه که ما circular reference یا self reference داشته باشیم که اولی میگه دوتا آبجکت به هم دیگه reference داشته باشن دومی میگه یه آبجکت که نقش container و بازی میکنه یه رفرنس به خودش داشته باشه. تو این حالت هیچوقت reference به صفر نمیرسه در نتیجه آبجکت با reference counting پاک نمیشه. اینجا garbage collector میاد وسط.
حالا del چیکار میکنه ؟ فقط میاد اون اسم رو پاک میکنه! گفته بودیم متغیر ها اسم ها یا سیمبل هایی هستن که اشاره میکنن به یه آبجکتی توی مموری. یک رفرنس هستن!
برای تستش بریم درباره داندر del صحبت کنیم. این متد هیچ ربطی به کلمه کلیدی del نداره. این متد زمانی call میشه که آبجکت داره از بین میره! بهش finalizer میگن(destructor خیلی واژه صحیحی نیست). این رو پیاده سازی میکنیم تا بفهمیم کی آبجکت از بین رفت.
همونطور که تو عکس میبینید:
http://www.upsara.com/images/j708789_.png
- تو cell شماره ۲ تنها رفرنس به آبجکت ساخته شده obj هست پس با del کردنش آبجکت هم پاک میشه.
- تو cell شماره ۴ ولی نشد چرا ؟ چون علاوه بر خودش یه رفرنس هم داخل لیست داشت.
- شما برای کم کردن رفرنس یه آبجکت میتونید متغیرش رو به یه آبجکت دیگه assign کنید. الان اگه cell شماره ۷ رو ببینید، دقیقا همون کاری و کرده که del داشته میکرده. تنها فرقش اینکه با زدن del دیگه اون name عه obj موجود نیست.
- خارج شدن از scope یه فاکشن هم یه رفرنس کم میکنه ازش. توی cell شماره ۸ چون آبجکت اون تو ساخته شده بوده و تنها رفرنس بوده بعد از اتمام فانکشن آبجکت delete میشه.
با متد getrefcount از ماژول sys میتونید تعداد رفرنس های به یه آبجکت رو ببینید.
This media is not supported in your browser
VIEW IN TELEGRAM
دوستان عزیزی که مایل هستند استک دومی را شروع کنند بعد یا در کنار پایتون می توانند از زبان گولنگ شروع کنند که خیلی زبان ساده و کاربردی و دارای بازار درآمدی خوب میباشد.
برای پیوستن به گروه زیر مراجعه کنید :
https://www.tg-me.com/GolangEngineer
برای پیوستن به گروه زیر مراجعه کنید :
https://www.tg-me.com/GolangEngineer
✔️ تا حالا حتما عباراتی همچون
- call by reference
- call by value
و ... چنین عباراتی که نحوه و انواع پاس داده شدن متغیرها و ... توی زبانهای برنامه نویسی رو بیان میکنن، شنیدید؛ و ممکنه براتون سوال شده باشه که آیا چنین چیزایی توی پایتون هم داریم؟ اگه داریم عملکردشون چیه؟
پاسخ کوتاه: خیر اینارو نداریم :)
پاسخ بلند:
📺 https://youtu.be/_AEJHKGk9ns
آقای ند بچلدر (Ned Batchelder) از بزرگای پایتون.
Twitter: @nedbat
نویسنده و maintainer عه: لایبرری بسیار حقِ coverage.py
Twitter: @coveragepy
〰〰〰〰〰〰〰
©@PyFarsi
- call by reference
- call by value
و ... چنین عباراتی که نحوه و انواع پاس داده شدن متغیرها و ... توی زبانهای برنامه نویسی رو بیان میکنن، شنیدید؛ و ممکنه براتون سوال شده باشه که آیا چنین چیزایی توی پایتون هم داریم؟ اگه داریم عملکردشون چیه؟
پاسخ کوتاه: خیر اینارو نداریم :)
پاسخ بلند:
📺 https://youtu.be/_AEJHKGk9ns
آقای ند بچلدر (Ned Batchelder) از بزرگای پایتون.
Twitter: @nedbat
نویسنده و maintainer عه: لایبرری بسیار حقِ coverage.py
Twitter: @coveragepy
〰〰〰〰〰〰〰
©@PyFarsi
YouTube
Ned Batchelder - Facts and Myths about Python names and values - PyCon 2015
"Speaker: Ned Batchelder
The behavior of names and values in Python can be confusing. Like many parts of Python, it has an underlying simplicity that can be hard to discern, especially if you are used to other programming languages. Here I'll explain how…
The behavior of names and values in Python can be confusing. Like many parts of Python, it has an underlying simplicity that can be hard to discern, especially if you are used to other programming languages. Here I'll explain how…
✔️ در پایتون 3.11 چه میگذرد؟
آنتونی شاو سخنرانی عمیقی در مورد چیزهای جدید در پایتون ۳.۱۱ ارائه کرده و تغییرات مهمش رو برشمرده؛ همچنین پیشنهادات حرفهای هم در مورد optimization داده 😁
https://www.youtube.com/watch?v=kJMyomV0S50&t=60s
〰〰〰〰〰
©@PyFarsi
آنتونی شاو سخنرانی عمیقی در مورد چیزهای جدید در پایتون ۳.۱۱ ارائه کرده و تغییرات مهمش رو برشمرده؛ همچنین پیشنهادات حرفهای هم در مورد optimization داده 😁
https://www.youtube.com/watch?v=kJMyomV0S50&t=60s
〰〰〰〰〰
©@PyFarsi
YouTube
What’s New in Python 3.11
Anthony Shaw – Microsoft’s own Senior Open Source Advocate specializing in Python and Cloud solutions gives an exhaustive speech on what’s new in Python 3.11 at NIX MultiConf #5.
Having years of field experience under his belt, Anthony sheds the light on…
Having years of field experience under his belt, Anthony sheds the light on…
✔️دوره آموزش FastAPI به زبان فارسی
8⃣2️⃣ قسمت بیست و هشتم
https://youtu.be/Ni1oyaD8CZw
#fastapi #آموزش
🆔 @PyFarsi
8⃣2️⃣ قسمت بیست و هشتم
https://youtu.be/Ni1oyaD8CZw
#fastapi #آموزش
🆔 @PyFarsi
YouTube
آموزش Api نویس با FastApi Python ( Instagram قسمت دوم پروژه )
سلام به کانال یوتیوبی پرشین پایتون خوش آمدید
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
FAST API
یک وب میکرو فریمورک پایتون هست که با شعار عملکرد بالا
(high performance)
، یادگیری آسان ، کد زنی سریع و آماده برای تولید توسط آقای سباستین رامیرز تولید شده
ویژگی های اصلی این فریمورک :
سرعت : عملکرد…
خروجی کد بالا چیست؟
Anonymous Quiz
12%
IndexError
20%
[True, True, True, True, True, True]
46%
[4, 5, 6]
23%
[None, None, None, None, None, None]
بنیاد پایتون کاران فارسی
خروجی کد بالا چیست؟
سلام دوستان وقتتون بخیر بریم سراغ جواب اصلی این سوال
خب ما یه تابع داریم که سه تا پارامتر داره یکیش یک آرایه یا همون لیست عه و دوتای دیگه max و min ان که به صورت پیش فرض None هستن
داخل این تابع ما دوتا lambda function تعریف کردیم به نام های min_check و max_check
این تابع در نهایت بر اساس اون دوتا lambda function یسری چیزارو بررسی میکنه و بعد یک لیست رو return میکنه
حالا بریم سراغ اون بخشی که ما اومدیم و تابع رو call کردیم و یک لیست و یک مقدار بهش دادیم
خب اون لیست میاد جای array قرار میگیره
اون مقدار 4 ام میاد جای پارامتر min قرار میگیره
تابع ما اول میره سراغ اون قسمتی که داره یک لیست return میشه
ما تو این لیست که به صورت comprehension ام نوشته شده گفتیم بیا داخل اون پارامتر array پیمایش کن و تمام آیتماش رو به لیست مون اضافه کن حالا بر چه اساسی اضافه کن؟
بر اساس اون دوتا lambda function ها
خب اون دوتا lambda function ها چی میگن؟
داخل list comprehension ای که داره داخل تابع return میشه ما گفتیم که
————
*. نکته .*
تو پایتون داشتیم که برای بررسی True بودن یک شرط و یا یک result یا ... ما میتونیم به این صورت ام بنویسیم :
خب داخل اون قسمتی که ما تابع رو call کردیم بعد از لیست، اون عدد 4 میاد به جای min قرار میگیره و از اینجا دیگه اون min ما، None نیست!
و چون max هیچ آرگومانی نگرفته None باقی میمونه و چیزی که بر میگردونه True هست (طبق شرطی که براش داخل تابع max_check تعریف شده) پس ما باید بریم سراغ min_check
تابع min_check میاد بررسی میکنه و میگه حالا که پارامتر min دیگه None نیست بیا چک کن (تو قسمت else) که چه آیتمایی از اون array ما بزرگتر یا مساوی min هستن (اون min در واقع به عنوان یک عدد پایه در نظر گرفته میشه و باید اعداد بزرگتر از min به لیست اضافه بشه همینطور برعکسش اگه max مقدار داشت، باید آیتمای کوچیکتر ازش به لیست اضافه بشه)
هر کدوم که بزرگتر یا مساوی بودن به لیست ما اضافه کن و در نهایت چیزی که return میشه اینه :
[4, 5, 6]
خب ما یه تابع داریم که سه تا پارامتر داره یکیش یک آرایه یا همون لیست عه و دوتای دیگه max و min ان که به صورت پیش فرض None هستن
داخل این تابع ما دوتا lambda function تعریف کردیم به نام های min_check و max_check
این تابع در نهایت بر اساس اون دوتا lambda function یسری چیزارو بررسی میکنه و بعد یک لیست رو return میکنه
حالا بریم سراغ اون بخشی که ما اومدیم و تابع رو call کردیم و یک لیست و یک مقدار بهش دادیم
خب اون لیست میاد جای array قرار میگیره
اون مقدار 4 ام میاد جای پارامتر min قرار میگیره
تابع ما اول میره سراغ اون قسمتی که داره یک لیست return میشه
ما تو این لیست که به صورت comprehension ام نوشته شده گفتیم بیا داخل اون پارامتر array پیمایش کن و تمام آیتماش رو به لیست مون اضافه کن حالا بر چه اساسی اضافه کن؟
بر اساس اون دوتا lambda function ها
خب اون دوتا lambda function ها چی میگن؟
داخل list comprehension ای که داره داخل تابع return میشه ما گفتیم که
if min_check(value) and max_check(value)
یعنی اگه چیزی که هر دوی این توابع return میکنن True بود بیا اون value ای که داخل array پیمایش شده رو به لیست اضافه کن ————
*. نکته .*
تو پایتون داشتیم که برای بررسی True بودن یک شرط و یا یک result یا ... ما میتونیم به این صورت ام بنویسیم :
if True:————
# do something
# or
n = True
if n:
# do something
خب داخل اون قسمتی که ما تابع رو call کردیم بعد از لیست، اون عدد 4 میاد به جای min قرار میگیره و از اینجا دیگه اون min ما، None نیست!
و چون max هیچ آرگومانی نگرفته None باقی میمونه و چیزی که بر میگردونه True هست (طبق شرطی که براش داخل تابع max_check تعریف شده) پس ما باید بریم سراغ min_check
تابع min_check میاد بررسی میکنه و میگه حالا که پارامتر min دیگه None نیست بیا چک کن (تو قسمت else) که چه آیتمایی از اون array ما بزرگتر یا مساوی min هستن (اون min در واقع به عنوان یک عدد پایه در نظر گرفته میشه و باید اعداد بزرگتر از min به لیست اضافه بشه همینطور برعکسش اگه max مقدار داشت، باید آیتمای کوچیکتر ازش به لیست اضافه بشه)
هر کدوم که بزرگتر یا مساوی بودن به لیست ما اضافه کن و در نهایت چیزی که return میشه اینه :
[4, 5, 6]
>>> array = [1, 2, 3, 4, 5, 6]
>>> min = 4
>>> min_check = lambda value: True if min is None else (value >= min)
# 1 >= 4 => False
# 2 >= 4 => False
# 3 >= 4 => False
# 4 >= 4 => True
# 5 >= 4 => True
# 6 >= 4 => True
This media is not supported in your browser
VIEW IN TELEGRAM
☄️ وصل شدن از طریق SSH به سرور لینوکسی
🔥 خوب همونطور که تونستیم به سرور لینوکسی خودمون با استفاده از ssh متصل بشیم و دستورات مورد نظر رو توی سرور وارد کنیم و خروجی دستورات رو مشاهده کنیم.
🔥 اگر بخوایم به یک سرور وصل بشیم از متد connect راحت استفاده میکنیم و اگر بخوایم مثلا صدتا سرور بدیم که ابزار چک کنه و هرکدوم تونست وصل بشه یک سری دستورات توی سرور به طور خودکار انجام بده، از متد auto_checker استفاده میکنیم.
♨️ یوزر و پسورد و سرور بهش بدین کرک کنه 😁 میتونید به سلیقه خودتون پیشرفته ترش کنید.
آدرس گپ :
🔰 www.tg-me.com/PyFarsi
آدرس کانال :
🔰 @PSFarsi
🔥 خوب همونطور که تونستیم به سرور لینوکسی خودمون با استفاده از ssh متصل بشیم و دستورات مورد نظر رو توی سرور وارد کنیم و خروجی دستورات رو مشاهده کنیم.
🔥 اگر بخوایم به یک سرور وصل بشیم از متد connect راحت استفاده میکنیم و اگر بخوایم مثلا صدتا سرور بدیم که ابزار چک کنه و هرکدوم تونست وصل بشه یک سری دستورات توی سرور به طور خودکار انجام بده، از متد auto_checker استفاده میکنیم.
♨️ یوزر و پسورد و سرور بهش بدین کرک کنه 😁 میتونید به سلیقه خودتون پیشرفته ترش کنید.
آدرس گپ :
🔰 www.tg-me.com/PyFarsi
آدرس کانال :
🔰 @PSFarsi
Organize Python code like a PRO 🐍📦
پروژهتون رو مثل یک حرفهای ساختاربندی و مرتب کنید.
از اونجایی که پایتون یک زبان خیلی منعطف هست (مثل جاوا نیست که وقتی یه فایل جاوا درست میکنید باید یه کلاسِ پابلیک به همون اسم داخلش باشه) شما این اجازه رو دارید که کل کد یک پروژه رو توی یک فایل، و یا هر تابع رو توی یک فایل جدا بنویسید 😑🥴
با این مقاله یاد بگیرید که چگونه پروژهتون رو درست ساختار بندی کنید.
https://guicommits.com/organize-python-code-like-a-pro/
〰〰〰〰〰〰
©@PyFarsi
پروژهتون رو مثل یک حرفهای ساختاربندی و مرتب کنید.
از اونجایی که پایتون یک زبان خیلی منعطف هست (مثل جاوا نیست که وقتی یه فایل جاوا درست میکنید باید یه کلاسِ پابلیک به همون اسم داخلش باشه) شما این اجازه رو دارید که کل کد یک پروژه رو توی یک فایل، و یا هر تابع رو توی یک فایل جدا بنویسید 😑🥴
با این مقاله یاد بگیرید که چگونه پروژهتون رو درست ساختار بندی کنید.
https://guicommits.com/organize-python-code-like-a-pro/
〰〰〰〰〰〰
©@PyFarsi
✔️ سوال.
بهترین راه برای فهمیدن اینکه یه آبجکت hashable هست، چیه؟!
جوابتون رو کامنت کنید.
پاسخش رو فردا میگذارم.
〰〰〰〰〰〰
©@PyFarsi
بهترین راه برای فهمیدن اینکه یه آبجکت hashable هست، چیه؟!
جوابتون رو کامنت کنید.
پاسخش رو فردا میگذارم.
〰〰〰〰〰〰
©@PyFarsi
خب شاید پیش خودتون بگید، آبجکتی که داندر hash داشته باشه حتما hashable عه دیگه، این داندر رو داره و جوابتون این باشه:
اول یه چیز پایهای بگیم.
کلاس آبجکت object پایهای ترین base class در پایتونه و اینکه میگن همهچیز در پایتون آبجکته، یکی از دلیلاش اینه. هر چیزی که فکرش رو بکنید از object ارث میبره.
این کلاس کلی داندر متد داره و از قضا دو تا داندر که در این مطلب برای ما مهم هستن رو هم با هم داره
داندر eq -> برای چک کردن تساوی دو تا آبجکت
نکتهی داندر eq
رفتار پیشفرض داندر eq به این صورته که میان آیدیهای دو آبجکت رو باهم مقایسه میکنه. یعنی اگه اون رو override نکرده باشید و بخواید آبجکتهاتون رو با هم مقایسه کنید، وقتی جواب True میگیرید که دو تا آبجکت در واقع یک آبجکت باشن. دقیقا همون کاری که
خب میاید داندر eq رو جوری که میخواید اورراید میکنید
اما 😁
وقتی این کار رو کردید، اتفاقی که میوفته اینه که مقدار داندر hash شما None میشه و آبجکت شما دیگه hashable نیست
این یعنی دیگه نمیتونید توی دیکشنری و ست بذاریدش و ....
این در حالیه که آبجکت شما همچنان داندر hash داره ولی hashable نیست.
این توضیحات میشن دلیل اینکه چرا اون شرط باگ داره.
اما راهحل چیه؟
خب شاید بیاید بگید بجای اینکه چک کنیم هست، چک میکنیم که None نباشه
It is easier to ask forgiveness than permission
بالاتر گفتیم اگه داندر eq رو اورراید کنیم آبجکت ما دیگه hashable نیست و توی ست و دیکشنری نمیتونیم استفاده کنیم. من میخوام اون ور اورراید کنم و بازم hashable باشه 😒😒
خب جوابش سادهست
شما باید داندر hash رو هم اورراید کنید و یه مقدار int برگردونید
نکتهای که هست و باید بهش توجه داشته باشید اینه که باید بتونید یه عددی تولید کنید که تکراری شدنش سخت باشه (اگه تکراری بشه اشکالی نداره) و به ویژگیهای آبجکت شما وابسته هم باشه (حتما قرار نیست به ویژگیهاش وابسته باشه، اما اگه باشه، اون نکتهی قبلی راحتتر بدست میاد)
برای مثال
اما اگه اسم یکسان هم بدید، مشکلی نیست یه قانونی هست توی بحث hash که میگه:
اگر دو آبجکت دقیقا یکسان باشن، (یعنی دو تا رفرنس از یک آبجکت رو داشته باشیم) باید hash یکسانی داشته باشن
اما اگر ما دو تا hash یکسان از دو تا آبجکت داشتیم، الزاما اون دو آبجکت یکی نیستن.
به این حالت که هش یکسانه ولی آبجکتا یکی نیستن، میگن hash collision. که پایتون خودش این رو هندل میکنه
و بحثش در این مقال "دیگر 😮💨" نمیگنجد.
موفق باشید 😁✌️
o = objاما خیر 😁
if hasattr(o, '__hash__'):
print(f"{o} is hashable")
اول یه چیز پایهای بگیم.
کلاس آبجکت object پایهای ترین base class در پایتونه و اینکه میگن همهچیز در پایتون آبجکته، یکی از دلیلاش اینه. هر چیزی که فکرش رو بکنید از object ارث میبره.
این کلاس کلی داندر متد داره و از قضا دو تا داندر که در این مطلب برای ما مهم هستن رو هم با هم داره
داندر eq -> برای چک کردن تساوی دو تا آبجکت
obj1 == obj2داندر hash -> برای برگرداندن مقدار hash آبجکت که از تابع hash میگیریم
hash(obj)وقتی یک کلاسی شما مینویسید:
class Spam:این کلاس به طور خودکار از کلاس آبجکت ارث میبره که تبعا داندر متدها براش resolve میشن، که یعنی، ارثشون میبره، یا اینکه میگرده توی کلاس object پیدا شون میکنه.
pass
نکتهی داندر eq
رفتار پیشفرض داندر eq به این صورته که میان آیدیهای دو آبجکت رو باهم مقایسه میکنه. یعنی اگه اون رو override نکرده باشید و بخواید آبجکتهاتون رو با هم مقایسه کنید، وقتی جواب True میگیرید که دو تا آبجکت در واقع یک آبجکت باشن. دقیقا همون کاری که
is
انجام میده. s1 = s2 = Spam()اما شاید چنین رفتاری رو نخواید و جور دیگهای بخوایید که آبجکتهای شما تساویشون چک بشه
s1 == s2 -> True
خب میاید داندر eq رو جوری که میخواید اورراید میکنید
اما 😁
وقتی این کار رو کردید، اتفاقی که میوفته اینه که مقدار داندر hash شما None میشه و آبجکت شما دیگه hashable نیست
این یعنی دیگه نمیتونید توی دیکشنری و ست بذاریدش و ....
این در حالیه که آبجکت شما همچنان داندر hash داره ولی hashable نیست.
این توضیحات میشن دلیل اینکه چرا اون شرط باگ داره.
اما راهحل چیه؟
خب شاید بیاید بگید بجای اینکه چک کنیم هست، چک میکنیم که None نباشه
if o.__hash__ is not None:این تا حدی مشکل رو حل میکنه اما از اونجایی که پایتون یه زبان به شدت داینامیک عه:
...
class Spam:پس بهترین راهحل چیه؟
def __eq__ ...
Spam.hash = "Gotcha, Im neither hashable nor None =)"
It is easier to ask forgiveness than permission
try:اما یه سوال بی جواب میمونه!
hash(o)
except TypeError:
print("unhashable")
else:
print("hashable")
بالاتر گفتیم اگه داندر eq رو اورراید کنیم آبجکت ما دیگه hashable نیست و توی ست و دیکشنری نمیتونیم استفاده کنیم. من میخوام اون ور اورراید کنم و بازم hashable باشه 😒😒
خب جوابش سادهست
شما باید داندر hash رو هم اورراید کنید و یه مقدار int برگردونید
نکتهای که هست و باید بهش توجه داشته باشید اینه که باید بتونید یه عددی تولید کنید که تکراری شدنش سخت باشه (اگه تکراری بشه اشکالی نداره) و به ویژگیهای آبجکت شما وابسته هم باشه (حتما قرار نیست به ویژگیهاش وابسته باشه، اما اگه باشه، اون نکتهی قبلی راحتتر بدست میاد)
برای مثال
class Spam:
def __init__(self, name):
self.name = name
def __eq__(self):
....
def __hash__(self):
return hash(self.name)
تبعا شما اسامی مختلفی قراره به هر آبجکت که از Spam درست میکنید بدید، و این باعث میشه که hash هر بار فرق کنهاما اگه اسم یکسان هم بدید، مشکلی نیست یه قانونی هست توی بحث hash که میگه:
اگر دو آبجکت دقیقا یکسان باشن، (یعنی دو تا رفرنس از یک آبجکت رو داشته باشیم) باید hash یکسانی داشته باشن
اما اگر ما دو تا hash یکسان از دو تا آبجکت داشتیم، الزاما اون دو آبجکت یکی نیستن.
به این حالت که هش یکسانه ولی آبجکتا یکی نیستن، میگن hash collision. که پایتون خودش این رو هندل میکنه
و بحثش در این مقال "دیگر 😮💨" نمیگنجد.
موفق باشید 😁✌️