🧑‍💻PythonDev🧑‍💻
365 subscribers
86 photos
3 videos
15 files
78 links
Python tips and tricks
The Good, Bad and the Ugly

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

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


@Mtio975
Download Telegram
اگه تو صفحه‌های وب نیاز داشتید یک قسمت کد برنامه‌نویسی نمایش بدید (مثل مطلب آموزشی در وبلاگ، مستندات فنی مرتبط با برنامه‌نویسی و...)، با استفاده از Prism می‌تونید نمایش بلاک کد رو زیباتر و کاربردی‌تر کنید.

https://prismjs.com
از سینتکس زبان‌های مختلفی هم پشتیبانی می‌کنه و چندتا تم و کلی پلاگین داره که براساس انتخاب اون‌ها css و js نهایی رو برای استفاده در اختیار شما قرار می‌ده.
https://prismjs.com/#plugins
ازین مدل کد توی سورس کد پکیج‌ها زیاد دیدید همون استاندارد
EAFP
امروز یکی از نیروهای junior که باهاشون کار می‌کنم روی یکی از کدها به اروری میخورد و کار پیش نمی‌رفت.
ارور فریمورک هم واقعا نامشخص نبود و چیزی ازش دستمون رو نمی‌گرفت (زمانی که tensorflow 0.7 اومده بود قشنگ یادم هست ازین چالش‌ها زیاد داشتیم)

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

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

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

دیدم نیروی خودم بلد نبود گفتم شاید بهتر باشه اینجا هم بذارم بدرد کسی بخوره.
برگه تقلب (خلاصه دستورات) پایتون.pdf
17.3 MB
• کتاب برگه تقلب پایتون (خلاصه دستورات)
فارسی

#Book #Python
تو این دو روز زیاد پست اموزشی نگذاشتم و برنامه دارم که برای دوستان عزیز که با زبان برنامه نویسی پایتون کار می کنند و میخوان یه درجه ای از مهارت های بالا در برنامه نویسی برسن سعی بر این دارم که یه منبع کامل از کتاب خانه ها و رفرنس های زبان پایتون به طور کامل و جامع ارائه بدم که سطح عملی خودتون رو بالا ببرید .💻
دستاورد جدید آنلاک کردم
پروژه دارم
اوبنتو آپدیت شده (میزان لگ سیستم به خدا رسیده)
ممکنه مشکل از انویدیا هم باشه (ولی درست کار میکنه)
دمو هم دارم
گوگل هم 403 بهم میده (بدون وی‌پی‌ان)

مشکل ۴۰۳ پا برجا نیست (۲۰۰-۳۰۰ تا وی‌پی‌ان داره برنامه‌نویس ایرانی) بطور کلی گفتم
🧑‍💻PythonDev🧑‍💻
دستاورد جدید آنلاک کردم پروژه دارم اوبنتو آپدیت شده (میزان لگ سیستم به خدا رسیده) ممکنه مشکل از انویدیا هم باشه (ولی درست کار میکنه) دمو هم دارم گوگل هم 403 بهم میده (بدون وی‌پی‌ان) مشکل ۴۰۳ پا برجا نیست (۲۰۰-۳۰۰ تا وی‌پی‌ان داره برنامه‌نویس ایرانی) بطور…
قبل اینکه
Kernel
تغییر بدید، یا درایور‌ها رو دستکاری کنید و ...
Bios Update
بزنید، مخصوصاً اگر سخت‌افزار جدید اضافه کردید.

۹۰٪ مشکل حل شد، هنوز بعضی مشکلات وجود داره
و روی نرم‌افزارها هم فعلاً جدی‌ترین مشکل خودم
smplayer
هست که lag بسیار داره.


پ.ن : توی بررسی لاگ‌های nvidia متوجه شدم بخشی از مشکلات از نصب cuda میاد. بعضی تنظیمات رو خودش کنترل می‌کنه که نمیشه سخت‌افزار رو مناسب کارهای روزانه optimize کرد (ولی این مورد هم اون ۱۰٪ مشکل من رو حل نمی‌کنه چون ازینجا نیست)

احتمال ۹۹٪ دوستانی که هوش مصنوعی کار نمی‌کنند، به این مشکلات نخواهند خورد
🧑‍💻PythonDev🧑‍💻
قبل اینکه Kernel تغییر بدید، یا درایور‌ها رو دستکاری کنید و ... Bios Update بزنید، مخصوصاً اگر سخت‌افزار جدید اضافه کردید. ۹۰٪ مشکل حل شد، هنوز بعضی مشکلات وجود داره و روی نرم‌افزارها هم فعلاً جدی‌ترین مشکل خودم smplayer هست که lag بسیار داره. پ.ن…
۱۰٪ آخر هم یافت شد؛ nvidia یک موردی رو معرفی کرد به اسم
Nvidia GPU stats tool
توی status bar وضعیت دما و ... GPU هارو بهتون میگه، روی سیستم با ۱ کارت گرافیک احتمالاً مشکلات کمتری داره.

اما وقتی داشتم آنالیز میکردم، دیدم GPU اصلی سیستم، سریعا پاسخ میده و GPU دوم که تقریباً ideal و ضعیف‌تر هست latency بالاتری داره و همین باعث lag روی سیستم می‌شده
بخصوص موقع پخش video با smplayer چون من hardware decode رو فعال داشتم.

اوضاع بدتر هم میشد، چون من فاصله بین گرفتن وضعیت gpu هارو هم خیلی کم گذاشته بودم.

خلاصه، اینکه حال نداشتم بزنم
watch -n 1 nvidia-smi

باعث بدتر شدن اوضاع شده بود؛ اینکه Bios کمک کرد هم احتمال میدم بخاطر این بود که progress bar و کم کردن بافر و ... بود (ولی چون قبل از آپدیت بایوس این اطلاعات رو نگرفته بودم نمی‌تونم مطمئن بگم)

پ.ن : قبلاً این مشکل رو با
System Monitor
داشتم که یک gnome extension بود (متأسفانه خیلی دیر یادم افتاد که می‌تونه ازین موضوع باشه)
#سوال
خروجی این کد چیست؟
اینم اولین چالش برای دوستان بالا خروجی کد بالا ؟؟
Anonymous Quiz
38%
True,false
8%
True,True
46%
False,True
8%
False,False
سوال: best practice‌ها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرم‌افزار پایتونی چیه؟

ابزارهای زیادی واسه این‌کارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:


Dependency Management System

برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از Poetry استفاده کنید، چون ابزار بسیار قدرتمندی هست، کار باهاش بسیار راحته (خیلی شبیه به Cargo در زبان Rust هست)، کامیونیتی بزرگی داره، به راحتی محیط dev و prod رو میتونید مدیریت کنید، مستندات بسیار خوب و روانی داره، در سریع ترین زمان ممکن میتونید پروژه رو در PyPI منتشر کنید و همچنین پروژه⁧های معروفی از جمله Rich (کتابخونه⁧ای که خود pip هم ازش برای رنگی کردن progress barها استفاده میکنه) از اون استفاده میکنن، که همین نشون میده چقدر کاربردی هست.
همچنین build و run هم توسط Poetry انجام میشه

- منابع آموزشی:

1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/

2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs

3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/


Linting & Type Checking

برای Linting ابزارهای flake8 و pylint از معروف ترین⁧ها هستن، هر یک رو میتونید شدت سخت گیریشون رو تنظیم کنید، به راحتی همراه با Poetry تنظیماتشون در یک فایل قرار میگیره و نیاز به نگه داشتن فایل⁧های متفاوت برای هر کدوم ندارید. به نظرم خود flake8 به تنهایی نیازتون رو برطرف میکنه. اگر از PyCharm استفاده کنید یک Linter به صورت Built-in در اختیارتون میذاره که خوبه و کارتون رو راه میندازه.

اگر عادت دارید کدهای خودتون رو Annotate کنید و زیاد از Type Hint ها استفاده میکنید، استفاده از MyPy به عنوان یک static type checker به شما کمک میکنه ایرادات موجود در کلاس ها، توابع و ... رو پیدا کنید و بتونید typeهای دقیق تری استفاده کنید. همچنین ابزار Pyright که توسط مایکروسافت توسعه داده میشه، در VSCode به صورت integrated با افزونه Pylance کار میکنه و اگر از VSCode استفاده میکنید پیشنهاد میکنم حتما افزونه Pylance رو نصب کنید. PyCharm هم یک Type Checker داره ولی هنوز توانمندی Pylance و MyPy رو نداره.


- منابع آموزشی:

1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html

2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html


Code Formatting

برای مرتب و organize کردن importها از isort استفاده کنید، هم به صورت CLI در دسترس هست و هم یک API داره که میتونید در کد پایتون استفاده کنید. یک code formatter بسیار معروف که در اکثر پروژه⁧ها استفاده میشه Black هست، زیر نظر PSF (یا Python Software Foundation) و برنامه نویسای با تجربه و کار کشته ای همچون آقای Łukasz Langa (ریلیس منیجر پایتون 3.9) توسعه داده میشه، با دیگر ابزار ها مثل isort سازگار هست، با PEP8 سازگاره و کلی قابلیت مزیت دیگه داره که حقیقتا اینجا جا نمیشن :)

- منابع آموزشی:

1. داکیومنت isort
https://pycqa.github.io/isort/

2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html

3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y

* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنت⁧هاشون هست.


Testing

دو کتابخونه Pytest و unittest (در stdlib موجود هست) در تست نویسی پروژه ها استفاده میشن، برای تست کردن پروژه در environmentهای متفاوت از ابزار tox استفاده میشه و باهاش میتونید در نسخه های متفاوتی از پایتون کدتون رو تست کنید.


- منابع آموزشی:

1. یک مقاله جامع درباره تست نویسی، انواع آن و روش⁧های مورد استفاده در پایتون
https://realpython.com/python-testing/

2. ویدیو درباره unittest در پایتون
- آقای ned batchelder:
https://m.youtube.com/watch?v=FxSsnHeWQBY
- آقای Corey Schafer:
https://www.youtube.com/watch?v=6tNS--WetLI


* همچنین اگر از Git در پروژه خودتون استفاده میکنید، پیشنهاد میکنم از pre-commit حتما استفاده کنید و تمام این ابزارهای گفته شده رو automate کنید تا در هربار commit کردن، قبل از اینکه commit انجام بشه، این ابزارها روی کدتون اجرا بشن و اگر اشکالی در کدتون وجود داره پیدا بشه و اون رو برطرف کنید و دوباره commit کنید.

وبسایت pre commit:
https://pre-commit.com/
🧑‍💻PythonDev🧑‍💻 pinned «سوال: best practice‌ها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرم‌افزار پایتونی چیه؟ ابزارهای زیادی واسه این‌کارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم: Dependency Management…»
✔️ سوال.

بهترین راه برای فهمیدن اینکه یه آبجکت hashable هست، چیه؟!

جوابتون رو کامنت کنید.
پاسخش رو فردا میگذارم.
کی و چرا از Jupyter Notebook استفاده کنیم؟

به نظر من یکی از شاهکارهای تولید شده همین Jupyter Notebook (که برپایه ی Ipython هست) هست. خیلی خلاصه سعی میکنم به ویژگی هایی که داره اشاره کنم:

۱- مناسبترین گزینه برای زمانی که میخواید report ای به کسی یا جایی بفرستید یا جزوه نویسی کنید:
چون میتونید بین کد های پایتونیتون توضیحات بنویسید. اونم نه فقط تکست معمولی بلکه mardown و LaTeX و html و css و حتی چند کلاس آماده ی bootsrtap. چی بهتر از اینکه یه سری کد های پایتونی قابل اجرا همراه با توضیحات زیبا و رنگی در یک داکیومنت.

۲- از مهمترین ویژگی هاش اینکه cell cell ران میکنه کد هارو ولی به چه درد میخوره؟ فرض کنید شما یه کدی دارید مینویسید که درخواست میدید به URL ای و وقتی جوابش اومد یه کاری روش میکنید. اگه توی ماژول پایتونی بنویسید و توی کد هاتون ارور داشته باشید چی میشه؟ درستش میکنید و باید دوباره ران کنید اونوقت باید دوباره درخواست بزنید به اونجا. "وقت گیره"! یه مثال خیلی پرکاربرد تر دیگه، شما نیاز دارید تا یه محاسبات زمانبری و انجام بدید تا یه آرایه نامپای مثلا تشکیل بشه و حالا ازش یه استفاده کنید... دوباره همین داستان اگه ارور داشته باشید باز باید صبر کنید... به جاش میاید اون بخش setup قضیه رو توی یه cell انجام میدید دیگه همیشه داریدش توی رم. جلوتر فقط کد خودتونو ران میکنید.

۳- خب مثل باقی ادیتور ها سینتکس highlighting داره،‌ با تب code completion داره. ارور هارو زیباتر نمایش میده.

۴- قابلیت نمایش plot های مختلف و dataframe های pandas رو به صورت جدولی داخل خودش داره.

۵- وقتی یه document ای نوشتید به کلی فرمت از جمله PDF, HTML, RST, و خود PY خروجی بگیرید مناسب برای ارائه یا به اشتراک گذاری. گزینه آخر یعنی حتی میتونید اونو به ماژول پایتونی خروجی بگیرید و همه چیزایی که نوشتید به عنوان توضیحات میشه comment داخل اون ماژول.

۶- میتونید از magic command های موجود تو ipython استفاده کنید که بعضیاش خیلی مفیدن. (همونا که با % یا %% شروع میشه) از اینجا چک کنید چیزای باحالی داره.

۷- میتونید توش دستورات شل رو هم وارد کنیدو خروجیشو کنار خروجی های پایتونی خودتون هم ببینید حتی اونارو تو کدتون استفاده کنید!!
files = !ls
الان files عه شما یه لیستی از تمام فایل های داخل دایرکتوریتون هست.

۸- میتونید امکاناتش رو با نصب nbextension ها گسترش هم بدید. مثلا code formatter و یا box عه suggestion و یا linter و ... این لینک یا این لینک رو برای نمونه ببینید.

________________________________________
اگه ویژگی خوب دیگه ای رو نگفتم بگید همچنین ضعف هاش رو هم بگید مثلا جاهایی که مناسب نیست استفاده شه. اولین جایی که مناسب نیست اینکه پروژه توش بزنید...چون برای اینکار نیست اصلا. مثلا برای اینکه از یه ipynb توی یه ipynb دیگه چیزی import کنید نمیتونید مستقیم بزنید
from A import B
باید کار اضافه تری انجام بدید.

ولی درکل تو جایی که میشه ازش استفاده کرد فوق العادس 👍🏻
✔️ سوال‌ها:

چرا CPython رو با assembly نمینویسن؟

چرا CPython رو مثل PyPy نمیکنن؟ یا چرا از PyPy بجای CPython استفاده نمیکنیم؟

پاسخ سوال اول:
سوال اول: کد سی سریع‌تره یا کد اسمبلی؟

همه به من بگید ببینم، کامپایلرهای زبان سی از سورس‌کد C، چی تولید میکنن؟ خب حالت خییییلی پایه‌ اینه‌که از سورس C، کد اسمبلی تولید میکنن بعد با یه اسمبلر کد ماشین‌شون رو تحویل میدن.

اما حالت، هیچ‌وقت حالت پایه نیست 😁
کاری که یه کامپایلر سی انجام میده اینه که یه خروجی خیلی efficient و کد اسمبلی خیلی سریع‌ از اون سورس‌کد بیرون میکشه

این اصل ماجراست.
اینه که جواب سوال میشه کد سی در اکثر مواقع از کد اسمبلی hand written که دقیقا همون کار رو انجام میده سریع‌تره. این همه مغز و وقت صرف نوشتن کامپایلر کردن تا این بشه
تا این شده

این از این

سوال دوم: نوشتن کد سی آسون‌تره یا کد اسمبلی؟

سوال سوم: برای نوشتن یه برنامه خیلی ساده، کی سریع‌تر مینویسه یه C کار یا یه Assembly کار؟

سوال چهارم که جوابش هم میدونیم، کد کی سریع‌تره؟

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

به چند دلیل: سری دلایل اول -> همین دلایل بالا
سری دلایل دوم: بابا پایتون توی یه سری کارا کنده به هزار تا دلیل دیگه 😕 گیر ندید به سی یا اسمبلی

الان سورس PyPy که سرعت خیلی بیشتری از CPython توی خیلی جاها داره ببینید، پایتونه به ولله تقریبا بالای ۹۸ ۹۹ درصد پایتونه
پس مشکل جای دیگه‌ست.

پاسخ سوال دوم:

پیاده‌سازی CPython یک پیاده‌سازی general هست.
این خیلی معنی‌ها داره
مثال: ببینید یه چیزی وجود داره به اسم numba
(برای مطالعه در مورد نامبا این مقاله‌ام‌ رو بخونید)
این یه JIT Compiler هست برای کارای عددی و محاسباتی دارای حلقه‌های زیاد

یکی از کارای jit ها همینه، چنین کدهایی رو سریع کنن اما آیا همه چنین کدهایی دارن؟ خیر
آیا تحمل اورهد و سنگینی JIT رو دارن؟ قطعا خیر
میدونید چقدر رم مصرف میکنن؟
برای یه راه‌حل مشابه بین پایتون و NodeJS، اون نسخه‌ی NodeJS حدود ۴.۵ برابر بیشتر از پایتون رم مصرف کرده، صرفا بخاطر داشتن JIT.
جیت‌ها start up رو هم کندتر میکنن

از اون طرف پایتون بعضی جاها از pypy سریع‌تره
مثلا یکی‌ش وب
آقای Anthony shaw یه چند تا بنچ‌مارک گرفتن با FastAPI و Uviloop و این دم و دستگاه‌ها
توی همه‌شون pypy بسیار از CPython کند‌تر بوده و رم مصرفی خیلی بیشتری داشته

یه مشکل دیگه هم هست
پای‌پای به طور صد درصد با C extension moduleها اوکی نیست
فرض کن نتونی numpy استفاده کنی 🙂

پس هر چیزی رو بهرکاری ساختن

〰️〰️〰️〰️〰️〰️〰️〰️
🧑‍💻PythonDev🧑‍💻
GIF
👨🏻‍💻 اگه نمیخواین مدام کدهای تکراری بزنین یا کدنویسی بلد نیستین، ولی میخواین با داده‌ها کار کنین، این ابزار برای کار شما فوق العاده است!

این ابزار Visual Python هست که خودش کدنویسی رو براتون انجام میده. کافیه از منو و با چندتا کلیک، کاری که میخواین رو انتخاب کنین. هم با Google Colab و هم Jupyter Notebook کار می‌کنه.

◼️ دیتاست رو آپلود کنین،
◻️ کتابخونه رو import کنین،
◼️ و نمودار رو رسم کنین.

🔖 راهنمای آموزشی Visual Python:

🏷 Visual Python
📚
Visual Python
🗃 Visual Python
🎬 Visual Python


#️⃣ #علم_داده #DataScience