ru
Feedback
Python Hints

Python Hints

Открыть в Telegram

Python tips and tricks The Good, Bad and the Ugly توی این کانال فقط قرار هست در مورد core python صحبت کنیم. این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار) Admin: @Abbasi_ai

Больше
9 607
Подписчики
+1224 часа
+707 дней
+21530 день
Архив постов
توی پست قبلی زیر sample.env خروجی دستور tree رو هم گذاشتم (نباید اینجا باشه) فقط گفتم شاید توی مثال‌های بعدی لازم شد. اما مهم
توی پست قبلی زیر sample.env خروجی دستور tree رو هم گذاشتم (نباید اینجا باشه) فقط گفتم شاید توی مثال‌های بعدی لازم شد. اما مهمترین فایل این مثال config.py هست. راجب lru_cache قبلا صحبت کردیم؛ اما بطور خلاصه بخوام یادآوری کنم. اگر یک تابع در طول پروژه مقدار هربار که صدا زده میشه مقدار ثابتی رو بر میگردونه اون رو با lru_cache دکوریت می‌کنیم تا هربار سربار برای فراخونی و پردازش ندیم و بعد از یکبار پردازش خروجی ذخیره بشه و برگرده ( سرعت بیشتر؛ سربار کمتر) خط ۶ تا ۱۱ : من از Config بجای Setting استفاده می‌کنم که با کلاسای Pydantic اشتباه نشه؛ وظیفه BaseConfig رو معمولا برای پیدا کردن .env و تنظیم ENV_STATE تعریف میکنم. تنها نکته مهم اینه که extra="ignore"r رو میذارم که اگر کلید اضافی هم توی .env داشتم pydantic اونارو ignore کنه و ارور نده. ازینجا به بعد همه تنظیماتم رو بر اساس BaseConfig انجام خواهم داد؛ چون کد من کوچیک هست دیگه بخش دیتابیس و ردیس و ... رو جدا نکردم و همه چیز رو میخوام در نهایت داخل settings تحویل یوزر بدم. from config import settings

یکی از پروژه‌های شرکت دستم رسیده؛ پروژه بزرگی هم هست که با FastAPI توسعه داده شده و نیاز به code review , ... داره. توی کدها
+1
یکی از پروژه‌های شرکت دستم رسیده؛ پروژه بزرگی هم هست که با FastAPI توسعه داده شده و نیاز به code review , ... داره. توی کدها که داشتم بررسی میکردم تیم توسعه یک پوشه درست کرده (مثل چیزی که توی Django حا افتاده و چقدرم من بدم میاد ازش) و همه چیز رو شکونده توی ۱۲ تا اسکریپت پایتون بعد توی بخش‌های مختلف test, dev, prod اومده این‌هارو patch کرده و ... ندید باید بگید که کثیف هست؛ من پروژه‌های django رو هم نمیذارم تیمم این کار رو بکنه که خب جاش اینجا نیست. هرکسی هم که با من کار کرده می‌دونه برای چیزهای کوچیک اصلا دوست ندارم از پکیج‌های آماده استفاده کنم اما توی پروژه FastAPI و هر پروژه‌ای که pydantic رو دارید استفاده می‌کنید بد نیست که بجای اینکه همه چیز رو دستی کد بزنید از pydantic-settings استفاده کنید. توی تصویر دوتا فایل رو داریم؛ sample.env نقش راهنما رو داره و .env (من همه حالاتش رو روی سیستمم میذارم ولی در واقعیت شما فقط برای ENV_STATE مورد نظر خودتون تنظیمات رو قرار میدید)

یکسال از زمانی که اولین پست کانال رو گذاشتم گذشت ( پیام‌های پین شده؛ معرفی خودم و هدف کانال ) به لطف خیلی از شما عزیزان و با به اشتراک گذاری پست‌ها کانال بدون هیچ تبلیغاتی حالا به بیش از 4k عضو رسیده. توی کانال از اساتید ایرانی دانشگاهای بین‌المللی؛ مدیران ایرانی شرکت‌های داخلی و خارجی؛ توسعه دهنده‌های senior پایتون بسیار باسواد تا حتی نیروهای تازه کار همه مدل افرادی رو داریم. چیزی که من رو شدیدا جذب ادامه نوشتن مطالب می‌کنه همین موضوع هست؛ توی این ۱ سال با آدم‌های زیادی آشنا شدم؛ شاید هیچ سود و منفعت مالی برای هم نداشتیم اما صحبت با شما برای من بسیار ارزشمند و بسیار جذاب بوده راجب موضوعات لذت بخشی صحبت کردیم و بسیار بسیار مطالب و دید جدید گرفتم از شما عزیزان. حالا چرا این مطلب رو دارم می‌نویسم ؟ هم انگیزه هم ترس. روز اولی که کانال رو راه اندازی کردم؛ با خودم فکر میکردم فقط و فقط مطالب سطح advance و بدون توضیحات مقدمات طوری که هر پست کمتر از ۱ ساعت وقت بگیره. اما الان که داشتم پست جدیدی رو آماده می‌کردم؛ دیدم نمی‌تونم بدون توضیح بخش‌های دیگر (ابزار دیگری) کد رو بذارم و آموزش به ۷ آموزش دیگه تقصیم شد. (این شد ترس؛ دیگه آماده سازی هیچ پستی ۱ ساعته نخواهد بود.) اما بسیار هم خوشحالم؛ با چندتا از شما عزیزان توی این تعطیلات صحبت داشتم و وقتی به چت‌های روزهای اول نگاه می‌کنم تغییرات بسیاری رو می‌بینم؛ پیشرفت و انتخاب مسیر درست و این من رو بسیار خوشحال می‌کنه چون هدفم از روز اول همین موضوع بود. همین پیشرفت شما باعث شد موضوعاتی رو بحث کنیم که شاید قبل از این ۱ در ۱۰۰۰ فرصتش برام پیش میومد تا بحث کنم راجبش و بعضی صحبت‌ها و سوالات باعث شد شخصا بسیار بسیار یاد بگیرم. برای سال جدید مسیر کانال شاید کمی متفاوت باشه؛ کمی وارد جزئیات میشم توی پست‌ها. خوانش گروهی کتاب رو بجای محدود کردن به ۱۰۰-۲۰۰ عضو و بر اساس فایل‌هایی که گروه اول درست کردند پیش خواهم برد. سعی می‌کنم ارائه‌ها با خودم باشه؛ و بعد از هر جلسه گوگل میت؛ ویدئو ارائه روی یوتیوب قرار بگیره و بصورت همزمان بعد از اتمام کتاب توسط گروه اول با بعضی از اعضا سراغ کتاب‌های موضوعی بریم: Django, Pytorch, Deep learning, ... و به همین ترتیب ادامه بدیم. امیدوارم سال جدید هم؛ موضوعات و کانال و روش ارائه به اندازه سال قبل و حتی بیشتر مفید باشه. درنهایت؛ مرسی از همگی.

@DevChaiChat برای دوستانی که تازه وارد هستند. هر مدل بحث و صحبتی توی این گروه آزاد هست. گروه مربوط به کانال فقط و فقط مخصوص Core Python هست.

#خارج_از_بحث توی این مدت تعطیلی ( فقط ۴ ساعت در روز, تسک داشتم ) ۲ تا پروژه جالب رو دنبال کردم که نتایجش برام جذابتر بود ؛ 1- Rust روی rust-lang خودم رو آپدیت کردم، یک سری از موارد که خوب درک نکرده بودم برام خیلی خیلی بهتر جا افتاد و دلیلش رو متوجه شدم، همین بحث رو دارم ادامه میدم و برای آخر فروردین یک مصاحبه هم برای خودم رزرو کردم. البته این وسطا ۱۵ فروردین یک مصاحبه هم دارم ولی هدف گذاریم مصاحبه آخر فروردین هست. اگر علاقه داشتید، این کانال من هست درحال یادگیری هستم و خیلی خوبه همین اول کار یک کامیونیتی خوب کنار خودم داشته باشم : https://t.me/pyrust خوندن بخش‌هایی از کرنل لینوکس (نسخه جدید) و بخش‌هایی از سورس کد گیت (نسخه‌ای که با Rust داره بازنویسی می‌شه, غیر رسمی) جزو اهداف بعدیم هستند. 2-droidian خیلی وقته گوشی فعلیم رو دارم (۵-۶ سال)، دروغ چرا فوق‌العاده ازش رضایت دارم ولی software update براش تموم شده و چند وقت دیگه security هم تموم میشه. خودم چندتا Distribution مختلف رو روش تست کردم، اما دیگه مراقبت ازش وقت زیادی میگیره. تصمیم گرفتم اگر امسال Nothing phone 3 با مشخصات flagship معرفی شد عوضش کنم (اگر نشد ۱ سال دیگه صبر کنم). و توی تعطیلات داشتم به این فکر میکردم که این دستگاه همه‌ی قابلیت‌های خوب رو داره و حیف هست که همینطوری بذارمش توی کمد (همه‌ی دیوایس‌هام رو نگه میدارم) برای همین به ذهنم رسید روش لینوکس نصب کنم و service های ساده‌ای که دارم برای اتوماسیون کدها و ... رو روی این دستگاه بیارم (خیلی از raspberry pi ایی که دارم قویتر هست، ۱۲ گیگ رم، ۵۱۲ گیگ حافظه و ...) روی یک گوشی قدیمی‌تر (برای یکی از دوستان) بررسی کردیم و نتایج عالی بود. https://droidian.org/ گفتم اگر شما هم مثل من گوشی قدیمی دارید، بد نیست به این پروژه سر بزنید‌. مخصوصاً اگر کلی پروژه و سرویس برای مانیتور کردن دارید (مثلاً مدل هوش مصنوعی) یا میخواید، از راه دور سیستم رو روشن کنید یا ...

یکی از دوستان لپ‌تاپش رو می‌خواد بفروشه (مهاجرت) و این لپ‌تاپ رو هم خودشون وارد کردند، همینجا توضیح بدم که کارشون هوش مصنوعی نیست (gpu ها خیال راحت) چون خودشون وارد کردند جعبه نداره اما همه چیز کامل هست. Lenovo Legion 7 (Custom, asia only) CPU: 1) Ryzen9 5900HX Ram: 1) 64GB DDR4 - 3200Htz GPU: 1) Onboard AMD Vega-8 | 4GB 2) Nvidia RTX 3080 | 16GB Series Hard: 1T Samsung Nvme (SSD) کمترین قیمت مدل ۳۲ گیگ (سفارش آسیا) توی ایران ۱۴۰ تا ۱۴۵ میلیون تومان هست. ایشون لپ‌تاپ خودش رو ۱۲۰ میلیون گذاشته. به من گفتند اطلاع بدم گفتم شاید بدرد کسی بخوره، اگر کسی خواست اطلاع بده که باهاشون هماهنگ کنم.

logging : https://t.me/pyHints/446 https://t.me/pyHints/81 https://t.me/pyHints/127 Dunder methods https://t.me/pyHints/12 https://t.me/pyHints/14 https://t.me/pyHints/20 https://t.me/pyHints/29 https://t.me/pyHints/43 https://t.me/pyHints/320 Cache https://t.me/pyHints/30 https://t.me/pyHints/33 https://t.me/pyHints/107 Linux: https://t.me/pyHints/401 https://t.me/pyHints/258 https://t.me/pyHints/271 https://t.me/pyHints/273 https://t.me/pyHints/347 https://t.me/pyHints/401 Data structer in python: https://t.me/pyHints/15 https://t.me/pyHints/64 https://t.me/pyHints/115 https://t.me/pyHints/283 https://t.me/pyHints/294 https://t.me/pyHints/373 https://t.me/pyHints/408 Exception : https://t.me/pyHints/56 https://t.me/pyHints/57 https://t.me/pyHints/58 https://t.me/pyHints/60 https://t.me/pyHints/77 https://t.me/pyHints/367 Dis-Disassembler for Python bytecode: https://t.me/pyHints/96 https://t.me/pyHints/99 Async: https://t.me/pyHints/117 https://t.me/pyHints/137 https://t.me/pyHints/150 Profiling: https://t.me/pyHints/148 https://t.me/pyHints/109 https://t.me/pyHints/146 https://t.me/pyHints/277 https://t.me/pyHints/279 https://t.me/pyHints/280 https://t.me/pyHints/288 decorator: https://t.me/pyHints/37 https://t.me/pyHints/41 https://t.me/pyHints/47 Duck tpye & dynamic protocl: https://t.me/pyHints/328 https://t.me/pyHints/331 https://t.me/pyHints/336 https://t.me/pyHints/338 Book &roadmap &video : https://t.me/pyHints/16 https://t.me/pyHints/101 https://t.me/pyHints/123 https://t.me/pyHints/168 https://t.me/pyHints/194 https://t.me/pyHints/196 https://t.me/pyHints/210 https://t.me/pyHints/223 https://t.me/pyHints/231 Income: https://t.me/pyHints/50 https://t.me/pyHints/87 https://t.me/pyHints/394 Package management: https://t.me/pyHints/73 https://t.me/pyHints/402 Experiments: https://t.me/pyHints/85 https://t.me/pyHints/93 https://t.me/pyHints/108 Standard file for software and backend developers: https://t.me/pyHints/178 https://t.me/pyHints/180 https://t.me/pyHints/181 https://t.me/pyHints/186 https://t.me/pyHints/190 Other important post: https://t.me/pyHints/111 https://t.me/pyHints/27

اگر کسی فرصت داشت، لینک‌ پست‌ها رو دسته بندی کنه و کنار هم بذاره ممنون میشم. پیشتر یکی از دوستان ذکر کرده بودند ولی متأسفانه آیدی ایشون رو فراموش کردم شروع سال همه چیز رو دسته بندی کنیم و یک پیام پین شده طولانی داشته باشیم خیلی عالی میشه. با هم هماهنگ کنیم اگر کسی وقتش رو داشت‌. سپاس 🌹

اولین کامیت کاری 1403 ارسال شد. (پر انرژی)

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

فایل نهایی کدهایی که صحبت شد فقط جهت تمرین.

در نهایت باید اشاره به یک موضوع دیگه هم بکنم (یادم نیست قبلا گفتم یا نه) خط ۷۲ یک اشتباه؛ یا bad practice هست من برای اینکه بتونم دمو بدم اینکار رو کردم logging.getLogger("pyhints.log_config") هیچوقت توی getLogger اسم رو بصورت دستی نمی‌دیم راهکار درست: logging.getLogger(__name__) اینجوری وقتی دارید از پرو

بنابراین بجای کلید class از () استفاده میشه. و همونطور که قبلا هم گفتم هر چیزی که بعد از این بیاد ورودی‌هایی هست که اون کلاس
بنابراین بجای کلید class از () استفاده میشه. و همونطور که قبلا هم گفتم هر چیزی که بعد از این بیاد ورودی‌هایی هست که اون کلاس قبول می‌کنه؛ من اینجا گفتم اگر توی dev نبودم فقط ۴ کاراکتر آخر شماره تلفن رو نشون بده ولی اگر روی dev بودم ۱۰ تاش رو نشون بده. حالا فقط کافیه filter ایی که تعریف کردم رو به هرکدوم از handler هایی که لازم هست پاس بدم که توی خط 57 دارم اینکار رو برای file handler انجام میدم. سوال : چطوری phone رو به logRecord اضافه کنیم ؟ خط ۷۵ رو ببینید؛ وقتی یک کلیدی داریم که بصورت دیفالت روی logger تعریف نشده؛ راه قشنگش اینه که اون رو توی extra برای logger های مورد نظر ارسال کنیم: logger.critical("Call meeeeeeee", extra={"phone": "09121212122"}) خروجی میشه چیزی که توی تصویر می‌بینید.

اینم یک مثال (شروع سطح سنیور کار با logging) مثال آخر. اولین نکته؛ environment = "production" خط ۷ تا ۱۸ من یک کلاس فلیتر تعر
اینم یک مثال (شروع سطح سنیور کار با logging) مثال آخر. اولین نکته؛ environment = "production" خط ۷ تا ۱۸ من یک کلاس فلیتر تعریف کردم که قرار اگر توی لاگ رکورد چیزی به اسم phone وجود داشت بخش اول اون رو با * بپوشونه و بصورت دیفالت فقط ۴ رقم آخر رو نشون بده. اگر لاگ رو برای دیتاساینس و .. میخواید بفرستید و شماره همراه مهم هست می‌تونید اونو با hash یا ... که unique باشه برای هر شماره موبایل جایگزین کنید. اینطوری تیم دیتا می‌تونه کارهاش رو انجام بده و می‌دونه که یوزر چیکار داره می‌کنه اما هیچوقت نمی‌دونه اون یوزر کی هست duckduckgo و شرکت‌های vpn و ... که تاییدیه عدم افشای هویت دارند هم از تکنیک مشابه برای recommendation , ... استفاده می‌کنند؛ برگردیم سراغ کار خودمون. توجه کنید این کلاس فقط ی متغییر مهم داده display_digits لازم نبود ولی گذاشتم که یاد پست اول این موضوع بیوفتید که گفتم هرچیزی بعد از کلاس argument های اون کلاس هست. اگر متوجه نشدید بریم روی خط 26 جایی که برای اولین بار دارید filters رو می‌بینید اولین مورد که اسمش هست hide_phone چون کلاسی که استفاده کردم کاستوم و داخل پروژه و همین فایل هست.

بخش آخر خودش ی چایی دیگه لازم داره تازه متوجه شدم : زیاد که تایپ میکنم هم تشنم می‌شه سوال نشه براتون؛ با دهن بسته تایپ می‌کنم

اما خب شاید بگید چقدر از این فایل‌های 10mb درست می‌کنه ؟ یک کانفیگ اشتباه اینجا می‌تونه هارد سرور رو به راحتی پر کنه (این اتفاق هم میوفته) پس توی خط بعدی بهش backupCount میدم؛ و اینجا بهش گفتم 10 تا ازون فایل‌های 10mb رو می‌تونی نهایتا نگهداری کنی؛ سوال: بعد از ۱۰ تا چی میشه ؟ هیچی قدیمی ترین فایل لاگ حذف میشه تا لاگ جدید نوشته بشه؛ یعنی توی این مثال وقتی pyhinst.log.10 ساخته شد دفعه بعدی که قرار باشه فایل نوشته بشه pyhints.log.1 حذف میشه و بار بعدی pyhints.log.2 و این چرخه تا لازم باشه تکرار میشه. در نهایت هم encoding: utf8 خیلی‌ها میگن من حساس هستم و نیاز نیست و ... حق هم میدم بهشون. ولی وقتی کدها ممکنه دست افراد و تیم بین‌المللی و چندزبانی بیوفته شخصا ترجیخ میدم دیفالت رو بذارم؛ اینجوری مثلا اگر دست یک شرکت چینی هم بدم کدهام رو اون‌ها می‌دونند درصورت نیاز کجای کد رو باید تغییر بدهند و utf16 بذارند و ... پس این یعنی دردسر کمتر و چه بهتر که وجود داشته باشه این دیفالت.

ازینجا به بعدش رو دوس دارم (الان در سطح مدیور این پکیج رو میشناسید.) اولین حرکت؛ به pyhinst logger گفتم اگر درخواست log برات
ازینجا به بعدش رو دوس دارم (الان در سطح مدیور این پکیج رو میشناسید.) اولین حرکت؛ به pyhinst logger گفتم اگر درخواست log برات اومد. باید برای دوتا هندلر بفرستی؛ 1- console 2- file کنسول رو همیشه نگه میداریم برای داکر که راحت باشیم؛ فایل رو برای شرکت‌های قدیمی‌تر که بکاپ زمانی یا توی مثال بر اساس حجم نگه می‌دارند. تغییر بعدی که داره اضافه شدن file به handlers هست. اول از همه؛ گفتم کلاسش باید logging.handlers.RotatingFileHan dler باشه؛ جلوتر میگم معنی Rotate File چی هست (قبلا هم مثال زده بودم البته) توی خط بعدی بهش گفتم که فقط لاگ‌های سطح warning یا بالاتر رو توی فایل بنویسه و برای formatter هم همون jsonl رو استفاده کنه. اسم لاگ فایل رو گفتم pyhints.log بذاره (تبلیفات نداریم دیگه) و اما ۲ خط بعدی؛ وقتی از log rotate حرف میزنیم باید براش ی محدودیت بذاریم اینجا من گفتم بر اساس سایز باشه maxBytes روی 10mb یعنی اینکه اگر حجم فایل pyhints.log به 10mb رسید اسم فایل رو عوض کن (معمولا ی عدد به آخرش اضافه می‌کنه مثلا pyhinst.log.1) و این فایل رو کنار بذار و یک فایل جدید شروع کن دوباره به اسم pyhints.log.

Reaction, share پایین نیاد؛ چایی رو بزنیم و ادامه بدیم روی ۲ مثال آخر. کار واسه سال نو نمونه 😍❤️

تنها هندلر تعریف شده براش چون console هست درخواست به handlers و console ارسال میشه و اینجا کلاس تعریف شده براش rich هست (برای همین خروجی توی کنسول همچنان رنگی هست) و برای فرمت لاگ handlers درخواست رو باید برای formatters و بطور خاص file ارسال کنه. قشنگی داستان اینجاس که file از کلاس pythonjsonlogger.jsonlogger.JsonFormatter استفاده می‌کنه من بازم فرمت datetime رو استاندارد کردم و فرض کردم تعداد درخواست های به سرورم زیاد و در حد هزارم میلی‌ثانیه هست برای همین %(msecs)03d یعنی تا هزارم میلی ٍثانیه رو هم اضافه کردم. خط آخر یعنی format خیلی باشعور هست python-json-logger میگه تو فقط به من بگو چی رو لاگ بندازم فرمت معنی نداره من از اون مقدار بعنوان key استفاده خواهم کرد؛ و چیزی که برای اون میاد رو value در نظر میگیرم. لیست کامل این موارد رو روی داکیو.منت logging می‌تونید بخونید و حتی می‌تونید format خودتون رو هم تعریف کنید (مثلا شماره موبایل رو جدا بگیره) اما حواستون باشه حتما باید json serializable باشه.