Python Hints
8.63K subscribers
172 photos
11 videos
9 files
141 links
Python tips and tricks
The Good, Bad and the Ugly

توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)

Admin: @Abbasi_ai
Download Telegram
توی این مثال (قطعا غیر واقعی)
هر ۲ تا روش رو بررسی کردیم و البته قانون
exception
هم رعایت شده.
تفاوت سرعت رو خودتون می‌بینید دلیلش هم اینه که اسم تابع رو وقتی کاربر می‌بینه توی ۹۹٪ موارد قطعا متوجه هست که ۲ تا عدد باید بده و ...
توی
LBYL
حتی اگر همه چیز درست باشه کد باید شرط‌ها رو چک کنه و این زمان رو کند می‌کنه تا خروجی بده
EAFP
سعی می‌کنه خروجی رو سریعا محاسبه کنه ۱٪ اگر به exception بخوره handler مربوط به اون نوع exception رو اجرا می‌کنه و این یعنی سربار کمتر

تمیزی کد هم که قطعا EAFP بسیار بسیار پایتونی تر هست.

@PyHints
👍262👏1
Python Hints
توی این مثال (قطعا غیر واقعی) هر ۲ تا روش رو بررسی کردیم و البته قانون exception هم رعایت شده. تفاوت سرعت رو خودتون می‌بینید دلیلش هم اینه که اسم تابع رو وقتی کاربر می‌بینه توی ۹۹٪ موارد قطعا متوجه هست که ۲ تا عدد باید بده و ... توی LBYL حتی اگر همه چیز…
راجب کدهم کمی توضیح بدم
return NotImplemented
بیشتر توی کلاس‌ها و متدهای مقایسه‌ای استفاده می‌شه مثلا :
__lt__ , __gt__, ...
به ترتیب برای علامت‌های :
<, >

اینجوری هست که شما میزنید
10 < 5
به فرض 10 توی این مسئله یک نوع داده‌ای خاص هست از کلاس
CustomInt
که من نوشتم و فراموش کردم براش __lt__ با کلاس Int خود پایتون رو پیاده سازی کنم اینجا اگر
return NotImplemented
رو برگردونم پایتون همینجا بهم خروجی نمیده بلکه شعورش انقدر بالاس که میره و
5 > 10
رو حساب می‌کنه ینی تو کلاس Int داخلی خودش متد __gt__ رو صدا میزنه تا ببینه می‌تونه شرط بالا رو ارزیابی کنه یا نه
اگر جواب داد که جواب رو برمیگردونه برای
10 < 5
اگر اینم پیاده سازی نشده بود NotImplemented در اون حالت ارور میده.


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


@PyHints
👌16👍6👏1
این سوالات احمقانه‌اس
که خب متأسفانه توی لینکدین و توییتر و اینستاگرام پر شده
و فقط وقتتون رو داره میگیره

بنظرم این موارد توهم زا هم هست، تازه‌کار فکر می‌کنه اینکه می‌تونه این سوالات رو جواب بده یعنی خیلی بلد هست.

ولی آیا واقعاً اهمیتی داره دونستن این موارد ! حتی اگر اینجوری کد بزنید.

تهش اینه ی print توی سورس کد می‌ذارید و خروجیش رو می‌بینید.

عمرتون رو صرف سوالات احمقانه نکنید، این اکانت‌ها رو هم معروف نکنید

شخصاً
Connection
رو روی لینکدین حذف می‌کنم وقتی می‌بینم کسی با این پست‌ها یا لایک کردن این پست‌ها باعث حواس پرتیم می‌شه.
دقیقاً این موارد حواشی برنامه‌نویسی هست
خیلی خیلی مراقب باشید.
👍98🙏6👌2👎1😁1🌚1
همونجوری که توی کامنت و گروه صحبت شد؛ و قبلا هم بسیار اشاره کردم توی موارد مختلف
EAFP (Easier to Ask Forgiveness than Permission)
مدل کد زدنی هست که توی core python هم دیده میشه حتی توی سورس کد اصلی که با C نوشته شده؛ این تغییر رو من توی یکی از سخنرانی های Guido van Rossum خالق پایتون شنیدم و توی لایو یکی از افراد مشهور ایرانی (اسم نمیبرم دیگه) که داشت میگفت سرعت پایتون 3.11 از 3.8 - 60% بیشتر نیست و دروغ هست هم بهش اشاره کردم.

داستان ازین قرار هست؛ توی پایتون 3.11 برای مثلا عملگر + اگر شما تا اینجای اجرای کد ۴-۵ بار فقط اعداد int رو باهم جمع زدید از این به بعد پایتون دیگه نوع داده رو چک نمی‌کنه بلکه از
EAFP
استفاده می‌کنه ینی فرض می‌کنه type ها int هست و سعی می‌کنه هر ۲ مورد رو باهم جمع بزنه ولی اگر exception بخوره در اون حالت تازه میره نوع داده هر دو argument رو چک می‌کنه و add رو مناسب اون type اجرا می‌کنه.

برای همین داشتن یک لیست از نوع داده‌ای
[int, float, str, int, float, str, ....]
توی پایتون ۳.۱۱ خیلی چیز بدی هست و باعث کند شدن اجرا میشه (بدتر از پایتون ۳.۸ چون چندین سربار به سیستم میدید؛ یک تلاش برای انجام و exception و بعد تازه type check درحالی که پایتون‌های قبل از ۳.۱۱ همون اول type check میکردند)

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

اگر فکر می‌کنید چقدر بد هست این ویژگی: مجدد فکر کنید (داری اشتباه میزنی)
ثابت شده بیش از ۹۶٪ موارد و مخصوصا توی کدهای اصولی این حالت درست هست و نوع داده‌ای ثابت می‌مونه زبان‌های برنامه‌نویسی دیگری هم هستند که ازین ویژگی استفاده می‌کنند. (روی static type ها فکر نکنید)


خلاصه که پایتون 3.11 هم EAFP استفاده می‌کنه و اینکه آپدیت شدن روی نسخه‌های پایتون فقط به نصب کردن نسخه جدیدتر نیست.


@PyHints
👌25👍71🍾1
همونطوری که گفتم توی پایتون
list, array 
۲ تا موضوع متفاوت از هم هست.
کار با لیست بخاطر خاصیت داینامیک بودن (هم از نظر سایز و حافظه و هم نوع داده‌ای) راحت تر هست اما همین دو ویژگی توی لیست باعث سرباز زیادی میشه

تصویر بالا مربوط به میزان مصرف حافظه
Array - List - Numpy
هست (داده مربوط به کار هوش مصنوعی)

اولین قدم توی optimization استفاده از نوع داده درست هست :
list —-> numpy array
3.8GB —-> 125MB
حساب کنید میزان بهبود در مصرف رم را


@PyHints
26👍19❤‍🔥51🎉1🍾1
حتما شما هم با with open توی پایتون کار کردید فوق‌العاده کمک کننده و مفید هست
همین که دیگه لازم نیست یادتون بمونه فایل رو ببیند یا اینکه کد درست رو بزنید
بستن فایل باید توی بخش finally باشه و ...
try:
excpet:
finally:

همین شرایط برای connection به دیتابیس هم هست.

with open

از یک راه حل تمیز و زیبا استفاده می‌کنه که بهش
Context Manager Protocol
گفته می‌شه
یک کلاس داخل تعریف پروتوکل
context manager 
قرار می‌گیره اگر ۲ تا متد رو داشته باشه

__enter__, __exit__

__enter__
دقیقا وقتی وارد بلوک
with .... :
pass

می‌شیه اجرا می‌شه و __exit__ وقتی از with خارج می‌شه
پس توی این بین میشه کارهای زیادی انجام داد

کد بالا مربوط به یکی از پروژه‌های بزرگ هست که توضیح میدم بدها
ی hot-fix که زدم و از print رو بجای logger استفاده کردم
توجه کنید خارج از with خروجی print مثل قبل چاپ میشه و دیگه توی فایلی نوشته نمیشه چون توی __exit__
sys.stdout
به مقدار قبلی برمیگرده.

@PyHints
👍21🔥71
Evenin
Jimmy Witherspoon
Evenin'
Artist: Jimmy Witherspoon
Album : Evenin' Blues
Released: 1964
Produce: 1963
Genres: Blues / Jazz

@PytensMusic
👍122👎1
Python Hints
Jimmy Witherspoon – Evenin
موسیقی تقدیم شما بابت 1k شدن کانال توی کمتر از ۱ ماه

مرسی از همگی، امیدوارم لذت ببرید.🌹



بازم تاکید می‌کنم
share , reference
دادن به کانال رو هستم، ولی اگر میخواید مطالب رو کپی هم‌ کنید

کپی کاملاً آزاد.

مطالب رو ویدئو youtube کردن، کاملاً آزاد.

کلا هر روشی که باعث بشه استفاده از مطالب کمک به پیشرفت جامعه پایتون کنه آزاد هست.

اینارو گفتم چون به دفعات سوال شده (البته قبلاً هم گفته بودم)
43👍18❤‍🔥6
فونت vscode من وقتی کسی نباید بفهمه چی کد میزنم (چون افرادی که بخشی از کار بهشون سپرده شده توی تیم رقیب رفقای صمیمی دارند)

این جنگ تیمی هست 😂😂😂

شماهم ازین جنگ‌ها دارید ؟

پ.ن :
اومدم ی مثال واقعی از پست قبلی بزنم font اینطوری بود گفتم از شما هم بپرسم. (البته اینجا زوم هم زیاد شده راحت‌تره خوندنش)
🤪12😐7😁5👍2😈1
همه‌ی فونت‌های vscode من اینطوری هست
اعتماد موج میزنه 😂😂

فونت رو تغییر میخوام بدم که مثال خوانا باشه دوستان
😐14😁12🔥1
Python Hints
حتما شما هم با with open توی پایتون کار کردید فوق‌العاده کمک کننده و مفید هست همین که دیگه لازم نیست یادتون بمونه فایل رو ببیند یا اینکه کد درست رو بزنید بستن فایل باید توی بخش finally باشه و ... try: excpet: finally: همین شرایط برای connection به دیتابیس…
image_2023-04-16_17-55-10.png
389.6 KB
خلاصه بگم شرایط اینطوری هست که ۱۰۰ تا اسکریپت shit code داشتیم توی شرکت که هرکدوم رو ی نفر زده موقتی هم بوده

حالا بیزینس می‌خواد همه اینا باهم ادغام بشه و ازش پول در بیاره (چون فهمیده بدرد خیلی‌های دیگه میخوره؛ مخصوصا تیم‌های بخش‌های دیگه)

نیروهای فنی تیم ما زیر بار نمیرن؛ بیزینس هم مدیریتی هستند و پول براشون مهم هست مدیر بنده هم از گردنش خودش باز کرده و من باید هر ۲ طرف رو آشتی بدم.

تنها چیزی که به ذهنم رسید این بود که
Exception
هارو لاگ بندازیم پروژه دپلوی بشه تیم‌های خودمون باهاش کارکنند (چون با اون اسکریپت یبار مصرف‌ها داشتن کار میکردن)

ماهم ارورها رو لاگ داشته باشیم؛ که توی ۲ ماه وقتی که داریم بتونیم کدهارو مناسب سازی کنیم.

اینجا بود که
context manager protocol

به کمک ما اومد و بدون Exception handler پروژه اسکریپت‌های یکبار مصرف (این کد دسکریپشن پروژه‌ هست بین اعضای تیم) رفت برای دپلوی
👍141
توی لینکدین یک پستی دیدم راجب همین مشکل
pip
و عدم دانلود و ...

اول اینکه تنها راهکار مطمئن همون استفاده از

--proxy
هست

pip install --proxy <proxy-url> packagename


بعد دیدم کلی آدم زدن که از رپو‌‌های چین استفاده کن
یکی دیگه زده، از این url استفاده کن و ....

نکنید اینکارارو

سایت‌های معروف زیادی هستند که سر اشتباه یک دولوپر به فنا رفتند

خود
pypi

دقیقاً توضیح داده که security check نداره، ینی شما الان یک ویروسی چیزی بنویسی بدی بره pypi تأیید می‌کنه اگر استانداردهاش رو رعایت کرده باشید.

بعد طرف می‌گه بریم از رپوهای دیگه استفاده کنیم ؟!

آقا/خانم چندسال پیش ی مورد بود یک هکر اومده بود کمک کرده بود روی یک سورس کد برای پرداخت بانکی (مستر، پی‌پال و ...)

بعدها فهمیدن کدهاش رو توش باگ گذاشته و خودش به سرورهای شرکت‌هایی که
pip install
زدند حمله می‌کنه.

خلاصه :

۱- هر پکیجی رو نصب نکنید (اگر سورس مطمئنی نداره برید بخونید سورس کد رو و کدهاش رو که براتون مهم هست کپی‌ کنید توی پروژه خودتون).

۲- از هر mirror یا سرویس دهنده‌ای پکیج نگیرید.


@PyHints
👍533🌚2
Python Hints
توی لینکدین یک پستی دیدم راجب همین مشکل pip و عدم دانلود و ... اول اینکه تنها راهکار مطمئن همون استفاده از --proxy هست pip install --proxy <proxy-url> packagename بعد دیدم کلی آدم زدن که از رپو‌‌های چین استفاده کن یکی دیگه زده، از این url استفاده…
https://github.com/freedomofdevelopers/fod


درباب صحبت‌هایی که داخل گروه و کامنت شد،
این مورد رو جایگزین شِکن کنید.

قطعاً رستگار می‌شید

متأسفانه بعد از اتفاقات اخیری که توی کشور افتاد، وضعیت برنامه‌نویس‌ها و بطور کلی حوزه IT به شدت خراب شد.

بسیاری مهاجرت کردند توی همین مدت و شرکت‌های نوپای زیادی هم یا سرمایه رو از ایران خارج کردند یا ورشکسته شدند.

اینکه بعضی دوستان می‌پرسند بمونیم یا بریم :
قطعاً به رفتن فکر کنید، موندن جز پشیمانی دستاوردی نداره (ماها موندیم)


پروژه شکن هم همونطور که قبلاً درباره‌اش صحبت کردم ،
DNS leakage
های بسیاری این اواخر داره و چون از شما میخواد روی کل ترافیک سیستم تنظیم کنید

امنیت کمتری داره نسبت به FOD.


بهشت اونجایی هست که آدما حق انتخاب داشته باشند حتی به غلط 👌

خدا خودش قدرت انتخاب به آدم داده (حتی برای گناه) جمهوری اسلامی شده کاسه داغ‌تر از آش، میگه ما مواظب هستیم به زور کسی گناه نکنه، اینا خدارو هم به سخره گرفتن.
👍464👎4😭3😢1💔1
#Quick

PyScript

هم به نقطه‌ای رسیده که شرکت‌ها حداقل برای prototype دارند ازش استفاده می‌کنند؛ شاید عالی نباشه ولی برای تست ایده‌ها ؛ دموها ؛ حتی ارائه به استاد توی دانشگاه و ...

واقعا جالب هست و ارزش بررسی داره

PyScript GitHub

اینو میگم چون خودم برای تست ایده مجبور به یادگیری React شدم.
👍20
ازین مدل کد توی سورس کد پکیج‌ها زیاد دیدید همون استاندارد
EAFP
امروز یکی از نیروهای junior که باهاشون کار می‌کنم روی یکی از کدها به اروری میخورد و کار پیش نمی‌رفت.
ارور فریمورک هم واقعا نامشخص نبود و چیزی ازش دستمون رو نمی‌گرفت (زمانی که tensorflow 0.7 اومده بود قشنگ یادم هست ازین چالش‌ها زیاد داشتیم)

توی سورس اگر کدهارو بخونید یک ساختاری شبیه عکس وجود داره که باعث میشه در نهایت ارور خاص فریمورک برگرده؛ البته با یک تغییر کوچیک توی خط 10 :
raise CustomException('Finally we raise our custom error in framework.') from None

همین from None باعث میشه exception های قبلی چاپ نشه.

پاک کردن همین ۲ کلمه باعث شد توی ۵ دقیقه مشکل حل بشه‌.

دیدم نیروی خودم بلد نبود گفتم شاید بهتر باشه اینجا هم بذارم بدرد کسی بخوره.
👍214
Python Hints
نحوه تعریف decorator می‌تونه نشون بده دولوپر پروژه junior هست یا نه اگر توی یک پروژه حرفه‌ای مثل کد بالا decorator تعریف می‌کنید و بیش از ۳-۴ بار ازش استفاده میشه شما سیگنال junior developer بودن میدی به کسی که کد رو میخونه. همیشه گفتم بازم میگم : اگر…
از Bard گوگل خواستم برام کد review انجام بده روی این کد decorator بالا

نه تنها جزئیاتش درست و خوبه
مزیتش اینه که دسترسی بهش رایگان هست، مسخره بازی chatGpt رو نداره
و فقط کافیه ip ایران نداشته باشید


کاملاً هم رایگان هست
👍242👎1
کانفیگ logging برای من همیشه اذیت کننده هست.
بخش عمده‌ای از تسک‌های من مربوط میشه به
Deep learning, ML engineering

اما وجه دیگه کارم backend هست و software engineer برای همین خیلی کم پیش میاد نیاز داشته باشم ی لاگر با جزئیات بنویسم

از طرفی هم ۹۰٪ کدهایی که از بچه‌های بکند تحویل میگیرم ی logging نوشته شده که حافظه زیادی قرار هست بگیره (بخصوص روی سرور تست دارم صحبت میکنم که حجم لاگ بالا میره)

این کد رو قبلا برای Django نوشتم ؛ توضیح دادم تقریبا چند هفته بعد از شروع یادگیری یکی از بدترین پروژه‌های شرکت رو دست گذاشتم روش و شروع کردم به بازنویسی این لاگر رو برای اون نوشتم

هر لاگ فایل تا ۱۰ مگ حجم می‌تونه اشغال کنه و بعد از اون فایل ذخیره میشه به اسم backup تا ۱۰ تا ورژن ازین بکاپ‌ها نگه میدارم فقط و روی نسخه ۱۱
log rotate 
میخوره و قدیمی‌ترین فایل حذف میشه

البته این خیلی ساده‌اس ولی خب از اون کیلویی اضافه کردن logging فایل قطعا بهتره

پیشنهاد میدم شما هم ازین کد بعنوان base استفاده کنید و لاگ فایل‌های تمیز داشته باشید چون دیر یا زود خودتون مجبور به خوندنشون هستید.

@PyHints
👍194👎1