es
Feedback
Python Hints

Python Hints

Ir al canal en Telegram

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

Mostrar más
9 613
Suscriptores
+924 horas
+647 días
+22130 días
Archivo de publicaciones
تیم‌های مختلف از ابزارهای مختلفی برای بررسی و خوندن لاگ استفاده می‌کنند؛ حتی ممکنه توی یک شرکت توی بخش‌های مختلف از ابزارهای
+1
تیم‌های مختلف از ابزارهای مختلفی برای بررسی و خوندن لاگ استفاده می‌کنند؛ حتی ممکنه توی یک شرکت توی بخش‌های مختلف از ابزارهای مختلف استفاده بشه (اتفاقی که برای ما وجود داره) برای همین یک استاندارد مشترک باید وجود داشته باشه؛ لاگ‌های تیم من بخش‌های بیشتری رو لازم داره و کانفیگ می‌کنه اما لاگ های تجهیزات iot ممکنه اینطور نباشه یا لاگ‌های سرور. پس زبان مشترک همه ما میشه jsonl هر خط لاگ یک json کامل هست اینطوری حداقل کلیدهای لازم رو باید داشته باشیم و هر تیم کلیدهای ابزار مانیتورینگ خودش رو هم می‌تونه اضافه کنه و هیچ ابزاری توی خوندنش به مشکل نمی‌خوره. برای اینکار توی پایتون یک پکیج از قبل نوشته شده پس ابتدا : pip install python-json-logger توی کد بالا توی بخش formatters یک کلید جدید استفاده شده من اسمش رو گذاشتم file ولی فعلا برای نمایش دارم اون رو به console handler میفرستم. به عمد اینکارو کردم که ببینید به اسم نیست؛ به عکلکرد و چیدمان هست. ی درخواست لاگ وقتی توی کد ارسال میشه؛ اول از همه میرسه به loggers گه اگر از داخل پوشه پروژه pyhints باشه این بخش مسئول هندل کردنش هست. بعد بررسی سطح لاگ

آپدیت شد

از formatter استفاده کنیم؛ همیشه خوبه که class رو تعریف کنیم واجب نیست اما ا
+1
از formatter استفاده کنیم؛ همیشه خوبه که class رو تعریف کنیم واجب نیست اما ا

نکته بعدی تنظیم formatters هست؛ همیشه سعی می‌کنیم ساده شروع کنیم. برای مثال توی این کد (ادامه کد قبلی) من یک فرمتر استاندارید
نکته بعدی تنظیم formatters هست؛ همیشه سعی می‌کنیم ساده شروع کنیم. برای مثال توی این کد (ادامه کد قبلی) من یک فرمتر استاندارید اضافه کردم. همیشه سعی می‌کنم توی فرمترهایی که می‌نویسم چندتا فیلد رو داشته باشم : 1- asctime اون 10s بغلش برای اینه که میخوام حتما اندازه ۱۰ کاراکتر فضا داشته باشه حداقل توی levelname بهتر خودشو نشون میده 2- levelname باید بدونیم وضعیت لاگ چطوری هست؛ لاگ debug, info چیزی نیست که روزانه بخواید چشمتون بهش باشه 3- name برای اینه که بدونیم لاگ از کدوم اسکریپت اومده؛ راحتی خودمون هست. 4- lineno این مورد رو توی کدهای نیروهام نبینم؛ merge نمیشه داستان اینه که ترکیب این مورد و اسم فایل من رو دقیقا میبرم روی تابع / متد یا ... ایی که باعث خطا شده. 5- message اصل جنس هم اینجاس پیامی که باید ارسال بشه باقی موارد هم برای قشنگیش هست. اما چرا دروغ؛ شمارو نمیدونم من چشمام اینطوری اذیت میشه یک سری لاگ سفید روی پس زمینه سیاه خوندنش برام سخت هست.

#Quick #موقت اگر خودتون تست نمی‌نویسید، تورو اعتقاداتتون حداقل یک جوری کد بزنید که کدهاتون به ما رسید بتونیم تست براش بنویسیم.

پست‌های معرفی کتاب تا فعال شدن دوباره قابلیت استوری گذاشتن (توی پیام‌های pin شده لینک boost هست) روی پلتفرم X و اکانت کانال قرار خواهد گرفت. پست قبلی هم موقت خواهد بود.

از صبح نشستم و دارم از خوندن این کتاب لذت میبرم؛ چندین فصل رو خوندم و بنظرم کتاب جذابی هست. نکات ریز و جالبی داره (بعضی وقتا در حد چند خط) که بسیار بسیار مهم هست برای مصاحبه و خیلی وقتا خودم شاهدش بودم یا توی مصاحبه شونده دنبالش میگشتم. قابلیت استوری (boost) کانال چون بازم اعضا بیشتر شده از کانال گرفته شده؛ برای همین روی پلتفرم X پست گذاشتم. System design interview

دولت کانادا برای ایرانیان عزیز تا آخر فوریه ۲۰۲۵ این پالیسی رو تمدید کرده خلاصه شرایط : ویزا توریستی درخواست و دریافت می‌کنید (دوستانی که گرفتند نهایتاً ۳ هفته بوده) مهاجرت می‌کنید، مصاحبه کاری و ... و اونجا درخواست تغییر ویزا به ویزای کاری می‌دید ۲-۳ تا از دوستان اینکار رو کردند، بسیار بسیار ساده هست اگر فرصت خالی داشته باشند حتماً باهاشون یک جلسه آنلاین میذارم Ottawa, February 29, 2024— Due to Iran’s crackdown on protestors following the killing of Mahsa Amini, the Government of Canada introduced special measures to support Iranian temporary residents in Canada as well as Canadian citizens and permanent residents living in Iran. These special measures are now being extended until February 28, 2025. https://www.canada.ca/en/immigration-refugees-citizenship/news/notices/extension-special-measures-iranian-nationals-canada-temporary-residents.html

ساعت ۵ تا ۷ محدوده ولیعصر تهران ساعت آزادسازی حرامزاده‌ها هست اگر خواستید حرومزاده ببینید پیشنهاد می‌کنم این ساعت چهارراه ولیعصر باشید.

آقا من دنبال کار نمی‌گردم، بعد از این پیام، یکسری از دوستان لطف داشتند پیام دادند که باهاشون همکاری داشته باشم (البته مشخص بود بعضی‌هاشون در جریان وضعیت پروژه نبودند) نکات مشترک این دعوت ها : ۱- دستمزد رو هیچ چونه‌‌ای نزدند. ۲- دورکاری براشون مهم نبود. ۳- رفتار همگی عالی بود. ۴- وضعیت پروژه از دید خودشون خوب بود (واقعیت افتضاح) ۵- همگی نهایتاً ۲ ماه وقت داشتند تا دپلوی 🤦 من به این مورد آخر عادت دارم، بدون تعارف اکثر درآمدم هم از همین وضعیت هست انتهای پروژه یا بعد از چندسال تحقیق و توسعه وارد میشم و روی کد و دپلوی و ... کار می‌کنم فقط ولی وضعیتی رو وارد میشم که قابل حل باشه. مثال : یک تیمی اومده، ۱ سال هست روی یک مسئله هوش مصنوعی دارند کار می‌کنند مدیر قبلی تیم ۱ ماه هست از تیم رفته و دنبال یک فرد جایگزین میگردند که وضعیت تیم هوش مصنوعی رو درست کنه و با بکند و .... تعامل داشته باشه برای دپلوی شدن پروژه زمان پروژه تا دپلوی : ۲ ماه (۱۴ روز هم تعطیلات هست) به طرف میگم خب چندتا درخواست در روز حدوداً قرار داشته باشید اگر توی ساعات خاص بیشتر هست، توی دقایق شلوغ چندتا درخواست دارید و ... که اصلاً نشسته بودند با مشتری روی این موضوع از جنبه سرویس هوش مصنوعی صحبت کنند ( هد تیم بکند اومد توضیح داد و رفت ) میگم خب مدل هوش مصنوعی شما چقدر پارامتر داره (جزئیات معماری و ... مهمه برای optimization, deploy اما نمی‌تونم تا قرار نبستم و nda امضا نکردم بپرسم) که نمی‌دونستند (پس چطوری system design انجام شده ؟ منم نفهمیدم) یکی از دولوپرهای تیم هوش مصنوعی اومد، که شاید باور نکنید اونم نمی‌دونست. یعنی خودشون نمی‌دونستن مدلی که روش کار کردن این مدل و خودشون توسعه دادند (براساس ادعا خودشون) چندتا پارامتر داره بعد از چک کردن و ... ۷ میلیارد کل پارامتر‌های مدل‌ها بود (چندتا مدل باید اجرا میشد) و با توجه به دیتای ورودی و زمان پردازش و ... برای هر دیتا ۳ دقیقه اینکار طول می‌کشید، برای بهینه سازی سرعت پایتون هم هرکاری کرده بودند. توقع این بود، این زمان به نهایتاً ۳۰ ثانیه برسه و البته حداقل ۴ درخواست همزمان رو هم جواب بده. زمانبندی پروژه رو هم که براتون گفتم، تهش با لبخند و خوشحال طرف بهم نگاه می‌کنه می‌گه ۱ هفته هم ازون زمان رو بذاریم برای تست، من نهایتاً بهشون گفتم این چیزی که می‌خوان نشدنی هست، نه اینکه سخت‌افزار و ... مشکل داشته باشه طراحی و پیاده سازی سیستم و مدل هوش مصنوعی اشتباه هست طوری که بسیاری از اجزا منتظر خروجی یک بخش دیگه باید بمونه و حتی اگر همه اجزا هم توی ۲ ثانیه خروجی بدهند این زمان منتظر بودن processing, ... توی بهترین حالت روی دپلوی به ۱ دقیقه میرسه. ولی طرف ۱ سال و چندین ماه به گفته خودشون داره از کارفرما پول‌ میگیره که بهش کار تحویل بده برای اینکار چیزی که من توی صحبت متوجه شدم ۱۰ تا نیرو از دانشگاه وارد شرکت کرده (یعنی حتی نکرده ۱ نفر که تجربه داره رو وارد کنه) که قطعاً بخاطر دستمزد کمتر بوده. حالا که کارفرما فهمیده سرش کلاه رفته دنبال اینه هرجوری شده یک چیزی تحویل بده و خودش رو خلاص کنه اگر پروژه اینطوری دارید، من هیچ علاقه‌ای به همکاری با شما ندارم. پروژه AI کار ۱ هفته و ۱ ماه نیست، صنعت هم دانشگاه و پایان‌نامه و مقاله نیست. گوگل با اون عظمت، ایده و مقاله و کدهای اولیه Transformer هارو خودش تحویل داد، ولی بعد از این همه سال هنوز نتونسته مدلی بهتر از chatGpt تحویل بده. بیزینس با مقاله فرق داره.

#موقت چون نمی‌خوام وسط پست‌های logging بمونه امروز رفتم یک جا مصاحبه (بالاخره آخر سال هست، گفتم شاید برای سال جدید یک کار چالشی بهمون بخوره لذت ببریم) خیلی مصاحبه خوب و تمیزی بود، نه سوالات و حرفای چرت و پرت زده شد، نه امتحان شفاهی مدرسه بود خیلی روتین صحبت‌های فنی شد و مسائل فنی مطرح شد. تقریباً داشتم متقاعد می‌شدم که اینجای جای بعدی هست که باهاش قرارداد می‌بندم (مصاحبه‌های اولیه رو ریموت داشتیم) که یکی از مدیرای شرکت شروع کرد بحث‌های جزئی، تا اینجا که کم مونده بود بهم بگه این راه‌حلی که صحبت کردیم رو میشه همینجا رایگان برامون کدش رو بزنی ما پروژه رو لانچ کنیم قبل از حضور شما توی شرکت. بخدا همه صحبتش قشنگ همین بود. اولش چیزی نگفتم و از یک جایی به بعد پیچیدم طرف رو در نهایت هم گفتم بعد از بستن قرارداد می‌تونم تجربیاتم رو در اختیارتون بذارم. جلسه تموم شد، متن قرارداد رو بهم دادند سر مبلغ و شرایط کار و تعطیلی و دورکاری و .... هم به توافق رسیده بودیم قبلتر یک دفعه ی چیزی تو وجودم گفت، حاجی سوال کن این طرف چیکاره هست که مدیر بالا‌سرت بابت این سوالات چیزی نگفت و همین کار رو کردم. ۲۰ دقیقه بحث کردیم و فهمیدم طرف جایگاه معاون طوری برای خودش داره و از حرف‌های جناب مدیر متوجه شدم اخلاقش هم همینطوری هست، یعنی ممکنه وسط کار بیاد تسک ی تیم دیگه رو بهت بده و بگه امروز بشین روی این موضوع کار کن. شرکت فوق‌العاده، شرایط و دستمزد فوق‌العاده همه چیز عالی فقط همین یک مشکل وجود داشت، یک نفر که مدیریت بلد نیست قرار بود بالاسر من باشه. قرارداد رو امضا نکردم، و خوشحالم که اون لحظه این سوال برام پیش اومد که بپرسم اون آدم دقیقاً چه جایگاهی توی شرکت داشت. خواستم بگم، توی مصاحبه ها حواستون به آدما و جایگاه و رفتار هاشون هم باشه.

برای همین گزینه بهتر استفاده از logging.config.dictConfig هست؛ این تابع تنظیمات رو بصورت dictionary از شما تحویل میگیره و logger رو برای شما میسازه. همینجا بگم؛ توی سورس کدهای مختلف ممکن هست که این کانفیگ‌ها (دیکشنری) رو توی فایل‌های json, yaml, ini نوشته باشند؛ اما شخصا موقع نوشتن کد سعی می‌کنم مستقیم اینکار رو انجام بدم (داخل py). دروغ چرا مغزم رو درگیر حفظ کردن کلیدهای دیکشنری نمی‌کنم و اینطوری خود vscode کلیدهای موجود رو بهم میده اما راجب config مثال بالا که خیلی خیلی ساده هم هست. اول از همه version فعلا فقط 1 وجود داره (ورژن دیگه اومد همدیگر رو خبر می‌کنیم)؛ disable_exisiting_logger اگر True بذارید هر لاگر دیگه‌ای که توی این کانفیگ نیست غیرفعال میشه ۹۹٪ موارد روی False بذارید. موارد بعدی یعنی filters, formatters رو برای این مثال کاری نداریم (ساده شروع کنیم و کم کم بهش برسیم). و اما handlers؛ اولین چیزی که براش لازم هست اسمش میشه (باید بدونیم چی صداش کنیم) که توی مثال بالا من اسمش رو گذاشتم console چون قراره لاگ هارو توی ترمینال نمایش بده؛ توی خط بعدی یک کلید داره به اسم 'class' اگر قرار بود از Handler‌هایی که خود ماژول logging یا ماژول‌های دیگه براتون فراهم می‌کنند استفاده کنید از کلیدواژه 'class' استفاده میشه و مقداری که بهش میدید کلاسی از اون ماژول هست و باید قابل import باشه توی این مثال من StreamHandler رو استفاده کردم یعنی شما می‌تونید ی جایی تست کنید :
from logging import StreamHandler
مورد بعدی stream این کلید ثابت نیست؛ دلیلش هم واضح هست (حداقل برای من) هر کلاس یک سری پارامتر ورودی مختص به خودش داره StreamHandler هم توی ورودی می‌تونه یک کلید به اسم stream دریافت کنه که البته optional هست؛ یعنی حتی اگه توی مثال بالا این خط کانفیگ رو پاک کنید بازم کار می‌کنه ولی بصورت دیفالت مقدارش روی sys.stderr تعریف شده که تحت شرایطی ممکنه نخواهید اینطوری باشه پس می‌تونید تغییرش بدید. که من گفتم از ماژول sys و stdout یا همون standard output استفاده کنه و خروجی اینجا نمایش بده ( اگر فرق stdout, stderr رو نمی‌دونید؛ ی ذره لینوکس بخونید ) ولی داستان
ext://
اولش چیه پس ؟ هیجی فقط بهش میگه که این مورد رو از یک ماژول external باید بگیری (لازم بود برو import کن). در نهایت logger؛ مثل مورد قبل اولین مورد اسم هست این اسم مثل handler دلبخواهی نیست؛ و بهتر اسم بالاترین سطح پوشه‌ای باشه که این لاگر براش تعریف می‌شه؛ من اسم پروژه‌ام رو گذاشتم pyhints و این پوشه رو تبدیل به یک ماژول / پکیج کردم و می‌خوام برای تمام py فایل‌های داخلش از این logger بتونم استفاده کنم. برای همین هم اسم logger ام رو pyhints گذاشتم. توی ساده ترین حالت شما نیاز به دوتا کلید دارید؛ اولیش level که من اینجا گفتم مثلا از یک فایل .env پروژه میخونم (پیاده‌سازیش تمرین برای شما) و اگر توی محیط develop نبودم نمی‌خوام لاگ‌های debug دیده بشه فقط از info به بالا رو قبول کن. کلید بعدی یعنی handlers لیستی از handler هارو میگیره و اگر یک لاگ مسیج هر دو شرایط رو داشت (هم از پکیج pyhints بود؛ هم level بالاتر از آنچه توی خط قبل تعریف شده داشت) اون موقع اون پیام رو برای handler ها می‌فرسته تا کار درست رو باهاش انجام بدند. حالا فقط کافیه توی کل پروژه یکبار این تابع صدا زده بشه تا logger ما تنظیمات اختصاصی خودش رو دریافت کنه؛ اتفاقی که توی مثال بالا توی خط 30 داره میوفته. خط 32 اما خیلی مهمه دارم میگم برو ی لاگر برام بیار اسمش رو بذار pyhints.log_config اینجا به عمد ی همچین اسمی دادم تا نشون بدم چقدر اسمی که برای logger انتخاب می‌کنید مهم هست؛ اما توی کدها و پروژه‌هاتون از __name__ استفاده می‌کنید ( درصورت import همین فرمت اسم رو می‌سازه که من بهش دستی دادم). اینجا logging نگاه می‌کنه که کانفیگ اختصاصی داریم که logger ایی به اسم pyhints داخلش تعریف شده و ماهم توی درخواست getLogger اسمی دادیم که اگر با . جداسازی بشه pyhints بخش بالاتر هست پس این دو مورد باهم مچ میشه و می‌تونه از این لاگر خاص برای اسکریپت فعلی استفاده کنه حالا متغییر logger از تنظیمات pyhints.logger استفاده خواهد کرد برای نمایش log messages داخل ترمینال. من سعی کردم خیلی ساده توضیح بدم؛ تا همه این موارد رو متوجه بشوند (این رو درک کنید و البته جایگاه هرکدوم رو) ۷۰٪ کار حله. امیدوارم مفید باشه. 🌹

source code

با یک مثال خیلی ساده شروع کنید تا مطلب جا بیوفته قشنگ؛ توجه کنید من توقع دارم کار با logging رو مقدماتش رو بلد باشید. اصلی تر
با یک مثال خیلی ساده شروع کنید تا مطلب جا بیوفته قشنگ؛ توجه کنید من توقع دارم کار با logging رو مقدماتش رو بلد باشید. اصلی ترین عنصر logger هست؛ اگر بخوام خیلی خلاصه بگم: وظیفه‌اش اینه که یک پیام از شما دریافت کنه و بر اساس level اون رو به handler درستش ارسال کنه. با این تعریف عنصر بعدی که راجبش صحبت می‌کنیم handler هست. وظیفه‌اش ارسال لاگ به مقصدی هست که براش تعریف شده. اما ۲ مورد دیگه هم وجود داره که استفاده ازش می‌تونه زندگی رو بعدا براتون شیرین کنه: formatter اینکه چه اطلاعاتی توی لاگ فایل (علاوه بر پیام شما) بصورت خودکار قرار بگیره و اینکه این اطلاعات چطور نمایش داده بشه همش وظیفه این عزیز دل هست. filters وظبفه فیلتر کردن لاگ‌ها رو داره؛ چه اینکه نوشته نشه یا تغییراتی روش انجام بشه و بعد نوشته بشه. استیج آماده شد؛ بریم سراغ مثال تصویر استفاده از logging.basicConfig چیزی نیست که برای پروژه‌های مهم و بزرگ بخواید داشتده باشید؛ چون معمولا بیش از ۳ مورد handler خواهید داشت که این یعنی تعداد زیادی logger که هرکدوم formatter, filter های خودشون رو خواهند داشت. ادامه پست بعدی ....

photo content

log_config.py0.01 KB

با یک مثال خیلی ساده شروع کنید تا مطلب جا بیوفته قشنگ؛ توجه کنید من توقع دارم کار با logging رو مقدماتش رو بلد باشید. اصلی ترین عنصر logger هست؛ اگر بخوام خیلی خلاصه بگم: وظیفه‌اش اینه که یک پیام از شما دریافت کنه و بر اساس level اون رو به handler درستش ارسال کنه. با این تعریف عنصر بعدی که راجبش صحبت می‌کنیم handler هست. وظیفه‌اش ارسال لاگ به مقصدی هست که براش تعریف شده. اما ۲ مورد دیگه هم وجود داره که استفاده ازش می‌تونه زندگی رو بعدا براتون شیرین کنه: formatter اینکه چه اطلاعاتی توی لاگ فایل (علاوه بر پیام شما) بصورت خودکار قرار بگیره و اینکه این اطلاعات چطور نمایش داده بشه همش وظیفه این عزیز دل هست. filters وظبفه فیلتر کردن لاگ‌ها رو داره؛ چه اینکه نوشته نشه یا تغییراتی روش انجام بشه و بعد نوشته بشه. استیج آماده شد؛ بریم سراغ مثال تصویر استفاده از logging.basicConfig چیزی نیست که برای پروژه‌های مهم و بزرگ بخواید داشتده باشید؛ چون معمولا بیش از ۳ مورد handler خواهید داشت که این یعنی تعداد زیادی logger که هرکدوم formatter, filter های خودشون رو خواهند داشت. ادامه پست بعدی ....

log_config.py0.01 KB

photo content

با یک مثال خیلی ساده شروع کنید تا مطلب جا بیوفته قشنگ؛ توجه کنید من توقع دارم کار با logging رو مقدماتش رو بلد باشید. اصلی ترین عنصر logger هست؛ اگر بخوام خیلی خلاصه بگم: وظیفه‌اش اینه که یک پیام از شما دریافت کنه و بر اساس level اون رو به handler درستش ارسال کنه. با این تعریف عنصر بعدی که راجبش صحبت می‌کنیم handler هست. وظیفه‌اش ارسال لاگ به مقصدی هست که براش تعریف شده. اما ۲ مورد دیگه هم وجود داره که استفاده ازش می‌تونه زندگی رو بعدا براتون شیرین کنه: formatter اینکه چه اطلاعاتی توی لاگ فایل (علاوه بر پیام شما) بصورت خودکار قرار بگیره و اینکه این اطلاعات چطور نمایش داده بشه همش وظیفه این عزیز دل هست. filters وظبفه فیلتر کردن لاگ‌ها رو داره؛ چه اینکه نوشته نشه یا تغییراتی روش انجام بشه و بعد نوشته بشه. استیج آماده شد؛ بریم سراغ مثال تصویر استفاده از logging.basicConfig چیزی نیست که برای پروژه‌های مهم و بزرگ بخواید داشتده باشید؛ چون معمولا بیش از ۳ مورد handler خواهید داشت که این یعنی تعداد زیادی logger که هرکدوم formatter, filter های خودشون رو خواهند داشت. ادامه پست بعدی ....