سلام دوستان 👋
اگه با پایتون API توسعه داده باشید، حتماً میدونید که پیادهسازی pagination هرچند سخت نیست، اما توی پروژههای مختلف ممکنه وقتگیر و تکراری بشه.
برای همین یه پکیج مینیمال و کاربردی به اسم Pagify نوشتم که مدیریت pagination رو برای شما راحتتر و منعطفتر میکنه.
چی داره براتون؟
پشتیبانی از روشهای مختلف Pagination:
مثل Offset، Cursor، و Page-based.
سادگی در استفاده:
فقط با چند خط کد میتونید نیازهای pagination پروژهتون رو برطرف کنید.
مستقل از فریمورک:
چه تو پروژههای ساده پایتونی، چه با فریمورکهایی مثل Flask و FastAPI، بهراحتی میتونید ازش استفاده کنید.
قابلیت شخصیسازی بالا:
تنظیمات و رفتارهاش قابل تغییر و تطبیق با پروژه شماست.
مستندات کامل و شفاف:
شروع کار با Pagify رو ساده و سریع میکنه.
پروژه اوپنسورسه!
خیلی خوشحال میشم اگه ایدهای دارید یا میخواید فیچر جدیدی اضافه کنید، توی توسعه این پکیج مشارکت کنید.
ـGitHub رو ببینید، تست کنید، و نظراتتون رو باهام درمیون بذارید:
مشاهده Pagify در GitHub
اگه به دردتون خورد، ستاره یادتون نره ⭐
منتظر بازخوردهای ارزشمند شما هستم. 😊
اگه با پایتون API توسعه داده باشید، حتماً میدونید که پیادهسازی pagination هرچند سخت نیست، اما توی پروژههای مختلف ممکنه وقتگیر و تکراری بشه.
برای همین یه پکیج مینیمال و کاربردی به اسم Pagify نوشتم که مدیریت pagination رو برای شما راحتتر و منعطفتر میکنه.
چی داره براتون؟
پشتیبانی از روشهای مختلف Pagination:
مثل Offset، Cursor، و Page-based.
سادگی در استفاده:
فقط با چند خط کد میتونید نیازهای pagination پروژهتون رو برطرف کنید.
مستقل از فریمورک:
چه تو پروژههای ساده پایتونی، چه با فریمورکهایی مثل Flask و FastAPI، بهراحتی میتونید ازش استفاده کنید.
قابلیت شخصیسازی بالا:
تنظیمات و رفتارهاش قابل تغییر و تطبیق با پروژه شماست.
مستندات کامل و شفاف:
شروع کار با Pagify رو ساده و سریع میکنه.
هدف این پکیج اینه که توی مدیریت pagination وقت کمتری بذارید و روی بخشهای اصلی پروژه تمرکز کنید.
پروژه اوپنسورسه!
خیلی خوشحال میشم اگه ایدهای دارید یا میخواید فیچر جدیدی اضافه کنید، توی توسعه این پکیج مشارکت کنید.
ـGitHub رو ببینید، تست کنید، و نظراتتون رو باهام درمیون بذارید:
مشاهده Pagify در GitHub
اگه به دردتون خورد، ستاره یادتون نره ⭐
منتظر بازخوردهای ارزشمند شما هستم. 😊
#package #python
🔆 CHANNEL | GROUP
GitHub
GitHub - Mohammad222PR/pagify: Pagify is a simple yet flexible Python package for implementing various pagination methods in any…
Pagify is a simple yet flexible Python package for implementing various pagination methods in any dataset or collection. With support for offset, cursor, and page number pagination, Pagify offers a...
1👍14❤3⚡2🔥1
💎 ـPartial Functions در پایتون 💎
تا حالا شده یه تابع بنویسی که پر از آرگومان باشه و همیشه بخوای یه سری از اون آرگومانها مقدار ثابتی داشته باشن؟ مثلا فرض کن توی یه پروژه مدام داری درخواست HTTP میفرستی و همیشه متد رو روی
🔎 ـPartial Functions چی هست؟
خیلی ساده، Partial Function بهت اجازه میده یه نسخه سفارشیشده از تابع اصلی بسازی که یه سری از آرگومانهاش از قبل مقداردهی شده. این کار با
🧠 چرا Partial Functions مفیدن؟
✅ سادگی و تمیزی کد: به
✅ کاهش خطا:
✅ ایجاد نسخههای شخصیسازیشده از توابع:
🛠️ چطور Partial Functions بسازیم؟
اینجا
🚀 کاربردهای Partial Functions
1⃣ سادهسازی توابع با آرگومانهای زیاد
وقتی توابع زیادی با پارامترهای تکراری داری، Partial Functions میتونه کمکت کنه:
2⃣ انعطاف بیشتر با توابع دیگر
ـPartial Functions میتونه با توابعی مثل
3⃣ بهبود خوانایی کد در سیستمهای بزرگ
وقتی پروژههات پیچیده میشن، Partial Functions بهت کمک میکنن توابعی بسازی که واضحترن:
⚖️ مقایسه با دیگر روشها
ـPartial Functions یه جایگزین سبکتر برای تعریف کلاسهای خاص یا توابع جدیده. اما وقتی منطق خیلی پیچیدهای داری یا نیاز به شرطهای مختلف هست، بهتره به جای Partial Functions از کلاسها یا Wrapper Functions استفاده کنی.
✍️ جمعبندی
فهمیدیم Partial Functions ابزاری ساده اما قدرتمند در پایتون هستن که میتونن کدهای تکراری رو حذف کنن و انعطاف بالایی بهت بدن.
امید وارم مفید بوده باشه :)
تا حالا شده یه تابع بنویسی که پر از آرگومان باشه و همیشه بخوای یه سری از اون آرگومانها مقدار ثابتی داشته باشن؟ مثلا فرض کن توی یه پروژه مدام داری درخواست HTTP میفرستی و همیشه متد رو روی
POST
میذاری. به جای تکرار این مقدار ثابت، Partial Functions به کمکت میان و کدتو خیلی حرفهایتر میکنن. 🔎 ـPartial Functions چی هست؟
خیلی ساده، Partial Function بهت اجازه میده یه نسخه سفارشیشده از تابع اصلی بسازی که یه سری از آرگومانهاش از قبل مقداردهی شده. این کار با
functools.partial
انجام میشه. 🧠 چرا Partial Functions مفیدن؟
✅ سادگی و تمیزی کد: به
جای تکرار، یه بار آرگومان ثابت رو تعریف میکنی.
✅ کاهش خطا:
آرگومانهای ثابت توی یه جای مشخص مقداردهی میشن.
✅ ایجاد نسخههای شخصیسازیشده از توابع:
بدون نیاز به تعریف تابع جدید.
🛠️ چطور Partial Functions بسازیم؟
from functools import partial
def multiply(x, y):
return x * y
double = partial(multiply, y=2)
print(double(5)) # خروجی: 10
اینجا
double
نسخهای از multiply
شده که مقدار y
همیشه 2
هست. فقط لازمه x
رو بهش بدی. 🚀 کاربردهای Partial Functions
1⃣ سادهسازی توابع با آرگومانهای زیاد
وقتی توابع زیادی با پارامترهای تکراری داری، Partial Functions میتونه کمکت کنه:
def send_request(method, url, headers, data):
# ارسال درخواست
pass
post_request = partial(send_request, method='POST')
post_request(url='/api/data', headers={}, data={})
2⃣ انعطاف بیشتر با توابع دیگر
ـPartial Functions میتونه با توابعی مثل
map
و filter
خیلی خوب کار کنه: from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
numbers = [1, 2, 3, 4]
squared_numbers = list(map(square, numbers))
print(squared_numbers) # خروجی: [1, 4, 9, 16]
3⃣ بهبود خوانایی کد در سیستمهای بزرگ
وقتی پروژههات پیچیده میشن، Partial Functions بهت کمک میکنن توابعی بسازی که واضحترن:
from functools import partial
def logger(log_level, message):
print(f"[{log_level}] {message}")
info_logger = partial(logger, log_level='INFO')
info_logger("This is an info message") # خروجی: [INFO] This is an info message
⚖️ مقایسه با دیگر روشها
ـPartial Functions یه جایگزین سبکتر برای تعریف کلاسهای خاص یا توابع جدیده. اما وقتی منطق خیلی پیچیدهای داری یا نیاز به شرطهای مختلف هست، بهتره به جای Partial Functions از کلاسها یا Wrapper Functions استفاده کنی.
✍️ جمعبندی
فهمیدیم Partial Functions ابزاری ساده اما قدرتمند در پایتون هستن که میتونن کدهای تکراری رو حذف کنن و انعطاف بالایی بهت بدن.
#python #programing
🔆 CHANNEL | GROUP
👌13❤2🔥2
🚀 معرفی FastAPI
ـ FastAPI یه فریم ورک پایتونیه که باهاش میشه داخل پایتون api توسعه داد که تازگیا خیلییی بین پایتون کارا سرو و صدا کرده.
ـFastAPI یه فریمورک مدرن برای ساختن APIبا پایتون و ویژگی هایی مثل async/await که بهینه شده و... . خیلی از شرکتهای بزرگ مثل Netflix و Uber برای توسعه سرویسهاشون از FastAPI استفاده میکنن، و دلیلش هم مشخصه: سریع، ساده و انعطافپذیره.
💡 چرا FastAPI محبوبه؟
سریعترین فریمورک پایتون: FastAPI به لطف استفاده از Starlette و Pydantic، یکی از سریعترین فریمورکهای پایتون حساب میشه.
کدنویسی سریعتر: تایپهینتهای پایتون باعث میشه نوشتن کدها هم سریعتر باشه و هم باگهای کمتری داشته باشی.
مستندات خودکار: یکی از بهترین ویژگیهای FastAPI اینه که خودش بهطور اتوماتیک با Swagger UI و ReDoc مستندات API رو برات میسازه.
پشتیبانی از async/await: فست خیلی خوب از کدونیسی async ساپورت میکنه و یکی از دلایل محبوبیتشه.
🛠 ـFastAPI و کار با دیتابیس
وقتی میخوای با دیتابیس کار کنی، معمولاً از ORMها استفاده میکنی. تو FastAPI دو تا گزینه معروف داریم:
ـSQLAlchemy
ـSQLModel
حالا کدوم بهتره؟ بیاین دقیقتر بررسی کنیم:
ـ🔍 SQLAlchemy؛ قدیمی و قدرتمند
ـSQLAlchemy یکی از معروفترین ORMها برای پایتونه که زیاد استفاده میشه. انعطافپذیری بالایی داره و برای پروژههای پیچیده و بزرگ گزینه خیلی خوبیه.
مزیتها:
کنترل کامل روی کوئریها و عملکرد دیتابیس
پشتیبانی از تراکنشها و مدلهای پیچیده
جامعه کاربری بزرگ و منابع آموزشی زیاد
چالشها:
سینتکسش برای تازهکارها ممکنه سخت و پیچیده باشه
نوشتن کدهای زیاد برای مدلسازی
ـ🌀 SQLModel؛ ساده و مدرن
ـSQLModel یه کتابخونه جدیدتره که توسط خالق FastAPI یعنی Sebastián Ramírez توسعه داده شده. هدف SQLModel اینه که کار با دیتابیس رو سادهتر کنه و کدنویسی رو شبیه به Pydantic (برای ولیدیشن) بکنه.
مزیتها:
سینتکس خیلی ساده و خوانا
پشتیبانی از تایپهینتهای پایتون
هماهنگی عالی با FastAPI
کمتر شدن کدنویسی و مدلسازی سریع
چالشها:
هنوز نسبت به SQLAlchemy به بلوغ کامل نرسیده
برای پروژههای خیلی پیچیده ممکنه محدودیتهایی داشته باشه
⚡ مقایسه کدها
مدلسازی با SQLAlchemy:
مدلسازی با SQLModel:
همونطور که میبینید، SQLModel خیلی تمیزتر و کوتاهتره و شبیه به Pydantic میشه.
🎯 بالاخره SQLAlchemy یا SQLModel؟
اگه تازهکار هستی یا پروژهت کوچیکه و میخوای سریع کارت راه بیفته، SQLModel گزینه بهتریه. سینتکس سادهای داره و هماهنگیش با FastAPI عالیه.
ولی اگه پروژهت بزرگه یا نیاز به کنترل کامل و قابلیتهای بیشتر ORM داری ، SQLAlchemy انتخاب بهتریه.
خلاصه:
پروژههای کوچیک و متوسط SQLModel
پروژههای بزرگ و پیچیده SQLAlchemy
امید وارم مفید بوده باشه :)
ـ FastAPI یه فریم ورک پایتونیه که باهاش میشه داخل پایتون api توسعه داد که تازگیا خیلییی بین پایتون کارا سرو و صدا کرده.
ـFastAPI یه فریمورک مدرن برای ساختن APIبا پایتون و ویژگی هایی مثل async/await که بهینه شده و... . خیلی از شرکتهای بزرگ مثل Netflix و Uber برای توسعه سرویسهاشون از FastAPI استفاده میکنن، و دلیلش هم مشخصه: سریع، ساده و انعطافپذیره.
💡 چرا FastAPI محبوبه؟
سریعترین فریمورک پایتون: FastAPI به لطف استفاده از Starlette و Pydantic، یکی از سریعترین فریمورکهای پایتون حساب میشه.
کدنویسی سریعتر: تایپهینتهای پایتون باعث میشه نوشتن کدها هم سریعتر باشه و هم باگهای کمتری داشته باشی.
مستندات خودکار: یکی از بهترین ویژگیهای FastAPI اینه که خودش بهطور اتوماتیک با Swagger UI و ReDoc مستندات API رو برات میسازه.
پشتیبانی از async/await: فست خیلی خوب از کدونیسی async ساپورت میکنه و یکی از دلایل محبوبیتشه.
🛠 ـFastAPI و کار با دیتابیس
وقتی میخوای با دیتابیس کار کنی، معمولاً از ORMها استفاده میکنی. تو FastAPI دو تا گزینه معروف داریم:
ـSQLAlchemy
ـSQLModel
حالا کدوم بهتره؟ بیاین دقیقتر بررسی کنیم:
ـ🔍 SQLAlchemy؛ قدیمی و قدرتمند
ـSQLAlchemy یکی از معروفترین ORMها برای پایتونه که زیاد استفاده میشه. انعطافپذیری بالایی داره و برای پروژههای پیچیده و بزرگ گزینه خیلی خوبیه.
مزیتها:
کنترل کامل روی کوئریها و عملکرد دیتابیس
پشتیبانی از تراکنشها و مدلهای پیچیده
جامعه کاربری بزرگ و منابع آموزشی زیاد
چالشها:
سینتکسش برای تازهکارها ممکنه سخت و پیچیده باشه
نوشتن کدهای زیاد برای مدلسازی
ـ🌀 SQLModel؛ ساده و مدرن
ـSQLModel یه کتابخونه جدیدتره که توسط خالق FastAPI یعنی Sebastián Ramírez توسعه داده شده. هدف SQLModel اینه که کار با دیتابیس رو سادهتر کنه و کدنویسی رو شبیه به Pydantic (برای ولیدیشن) بکنه.
مزیتها:
سینتکس خیلی ساده و خوانا
پشتیبانی از تایپهینتهای پایتون
هماهنگی عالی با FastAPI
کمتر شدن کدنویسی و مدلسازی سریع
چالشها:
هنوز نسبت به SQLAlchemy به بلوغ کامل نرسیده
برای پروژههای خیلی پیچیده ممکنه محدودیتهایی داشته باشه
⚡ مقایسه کدها
مدلسازی با SQLAlchemy:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
مدلسازی با SQLModel:
from sqlmodel import SQLModel, Field
class User(SQLModel, table=True):
id: int = Field(default=None, primary_key=True)
name: str = Field(index=True)
همونطور که میبینید، SQLModel خیلی تمیزتر و کوتاهتره و شبیه به Pydantic میشه.
🎯 بالاخره SQLAlchemy یا SQLModel؟
اگه تازهکار هستی یا پروژهت کوچیکه و میخوای سریع کارت راه بیفته، SQLModel گزینه بهتریه. سینتکس سادهای داره و هماهنگیش با FastAPI عالیه.
ولی اگه پروژهت بزرگه یا نیاز به کنترل کامل و قابلیتهای بیشتر ORM داری ، SQLAlchemy انتخاب بهتریه.
خلاصه:
پروژههای کوچیک و متوسط SQLModel
پروژههای بزرگ و پیچیده SQLAlchemy
#python #fastapi
🔆 CHANNEL | GROUP
❤21👍5
خب خب خب Sentry چیه؟ 🔍
اگه برنامه نویسی میکنی احتمالاً این سناریو برات آشناست:
کلی وقت میذاری، کد مینویسی، تست میکنی، همهچی درست کار میکنه. ولی وقتی میدی دست کاربر، یهو یه ارور عجیب غریب میاد که اصلاً نمیدونی از کجا دراومده اینجاست که Sentry وارد بازی میشه.
ـSentry چیه اصلاً؟
ـSentry یه ابزار خطایاب (Error Tracking) که کمک میکنه باگها و خطاهای پروژهت رو همون لحظهای که اتفاق میفتن، پیدا کنی.
این ابزار نهتنها ارورها رو جمعآوری میکنه، بلکه یه گزارش دقیق و کامل ازشون میده؛ از جزئیات خطا گرفته تا شرایطی که باعث شده ارور پیش بیاد.
فرض کن یه باگ تو اپلیکیشن ته که اصلاً قابل پیشبینی نبوده. بهجای اینکه کاربر بیاد غر بزنه یا خودت بری تو لاگها دنبال مشکل بگردی، Sentry خودش ارور رو تشخیص میده و گزارشش رو مستقیم برات میفرسته.
چرا Sentry محبوبه؟ 🌟
1⃣ گزارش ارور دقیق و کاربردی 🛠️
2⃣ پشتیبانی از پلتفرمهای مختلف 📱
3⃣ دستهبندی ارورها 🗂️
4⃣ هشدار و نوتیفیکیشن 🔔
5⃣ـ Release Tracking 🚀
6⃣ـPerformance Monitoring ⚡
چطور از Sentry استفاده کنیم؟
ثبتنام کن:
تو سایت Sentry.io یه اکانت بساز. نسخه رایگانش برای شروع کافیه.
نصب کن:
ـSDK مخصوص زبان پروژهت رو نصب کن. مثلاً برای Django این دستور کافیه:
تنظیمش کن:
با چند خط کد ساده Sentry رو به پروژه وصل کن:
ارورها رو مدیریت کن:
حالا هر اروری اتفاق بیفته، مستقیم تو داشبورد Sentry میره.
چند نکته مهم:
نسخه رایگان Sentry محدودیت داره (مثلاً تعداد ارورهای ماهانه). برای پروژههای بزرگ باید پلنهای پولیش رو بگیری.
میتونی از مستندات رسمی کمک بگیری تا تنظیمات حرفهایتر انجام بدی.
جمعبندی ✍
اگه میخوای ارورهای پروژهت رو حرفهای مدیریت کنی و حتی قبل از اینکه کاربر بفهمه، خودت رفعشون کنی، Sentry بهترین انتخابه. هم راحت نصب میشه، هم کلی قابلیت خفن داره.
تا حالا از Sentry استفاده کردی؟ نظرت چیه؟ 👀
➖➖➖➖➖➖➖➖➖
اگه برنامه نویسی میکنی احتمالاً این سناریو برات آشناست:
کلی وقت میذاری، کد مینویسی، تست میکنی، همهچی درست کار میکنه. ولی وقتی میدی دست کاربر، یهو یه ارور عجیب غریب میاد که اصلاً نمیدونی از کجا دراومده اینجاست که Sentry وارد بازی میشه.
ـSentry چیه اصلاً؟
ـSentry یه ابزار خطایاب (Error Tracking) که کمک میکنه باگها و خطاهای پروژهت رو همون لحظهای که اتفاق میفتن، پیدا کنی.
این ابزار نهتنها ارورها رو جمعآوری میکنه، بلکه یه گزارش دقیق و کامل ازشون میده؛ از جزئیات خطا گرفته تا شرایطی که باعث شده ارور پیش بیاد.
فرض کن یه باگ تو اپلیکیشن ته که اصلاً قابل پیشبینی نبوده. بهجای اینکه کاربر بیاد غر بزنه یا خودت بری تو لاگها دنبال مشکل بگردی، Sentry خودش ارور رو تشخیص میده و گزارشش رو مستقیم برات میفرسته.
چرا Sentry محبوبه؟ 🌟
1⃣ گزارش ارور دقیق و کاربردی 🛠️
وقتی یه ارور اتفاق میفته، Sentry دقیقاً بهت میگه مشکل کجاست. جزئیاتی مثل:
فایل و خط کدی که ارور داده
نوع خطا (Exception)
اطلاعات مرورگر یا دستگاه کاربر
وضعیت سرور (مثلاً رم و CPU)
حتی مراحل درخواست کاربر تا لحظهای که ارور رخ داده
2⃣ پشتیبانی از پلتفرمهای مختلف 📱
هرچی فکرش رو بکنی، Sentry ساپورتش میکنه.
Backend: Python (جنگو، فلاسک و ...)، Node.js
Frontend: React، Vue.js
Mobile: اندروید و iOS
DevOps: Docker، Kubernetes
3⃣ دستهبندی ارورها 🗂️
وقتی تعداد ارورها زیاد بشه، Sentry اونا رو گروهبندی میکنه. مثلاً یه باگ اگه صد بار اتفاق بیفته، همشون رو زیر یه گزارش میذاره که بتونی راحت مدیریت کنی.
4⃣ هشدار و نوتیفیکیشن 🔔
به محض اینکه یه ارور جدید اتفاق بیفته، سریع بهت خبر میده. از ایمیل گرفته تا Slack یا حتی پیامک.
5⃣ـ Release Tracking 🚀
یه قابلیت جالبش اینه که میتونی ارورها رو به نسخههای پروژت وصل کنی و بفهمی کدوم تغییرات باعث مشکل شده.
6⃣ـPerformance Monitoring ⚡
علاوه بر ارورها، میتونی بفهمی اپلیکیشن کجاها کنده.
چطور از Sentry استفاده کنیم؟
ثبتنام کن:
تو سایت Sentry.io یه اکانت بساز. نسخه رایگانش برای شروع کافیه.
نصب کن:
ـSDK مخصوص زبان پروژهت رو نصب کن. مثلاً برای Django این دستور کافیه:
pip install sentry-sdk
تنظیمش کن:
با چند خط کد ساده Sentry رو به پروژه وصل کن:
import sentry_sdk
sentry_sdk.init(
dsn="لینک DSN که Sentry میده",
traces_sample_rate=1.0
)
ارورها رو مدیریت کن:
حالا هر اروری اتفاق بیفته، مستقیم تو داشبورد Sentry میره.
چند نکته مهم:
نسخه رایگان Sentry محدودیت داره (مثلاً تعداد ارورهای ماهانه). برای پروژههای بزرگ باید پلنهای پولیش رو بگیری.
میتونی از مستندات رسمی کمک بگیری تا تنظیمات حرفهایتر انجام بدی.
جمعبندی ✍
اگه میخوای ارورهای پروژهت رو حرفهای مدیریت کنی و حتی قبل از اینکه کاربر بفهمه، خودت رفعشون کنی، Sentry بهترین انتخابه. هم راحت نصب میشه، هم کلی قابلیت خفن داره.
تا حالا از Sentry استفاده کردی؟ نظرت چیه؟ 👀
#programming #python #sentry
➖➖➖➖➖➖➖➖➖
🔆 CHANNEL | GROUP
Sentry
Application Performance Monitoring & Error Tracking Software
Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. Get started at sentry.io.
❤17
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم.
این شما و این لیست دستهبندیهای کانال🔻:
هر کدوم از این هشتگها برای یه موضوع خاص طراحی شده تا شما به راحتی بتونید محتوای مورد نظرتون رو پیدا کنید. دیگه لازم نیست کلی تو کانال بگردید 😊
راستی میتونید بنر کانال رو برای دوستاتون هم بفرستید تا اونا هم به جمع ما بپیوندن و از این مطالب مفید استفاده کنن 😉
➖➖➖➖➖➖➖➖➖
از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید محتوای مورد نظرتون رو پیدا کنید
این شما و این لیست دستهبندیهای کانال🔻:
🦫 #go: آموزشها و نکات کاربردی زبان گو
💻 #programming: مطالب برنامه نویسی
🐍 #python: ترفندها و نکات پایتونی
🦄 #django: مطالب فریمورک جنگو
⚡️ #fastapi: مطالب فریم ورک فست
🌐 #web: مطالب مرتبط به وب
📡 #network: مطالب مرتبط به شبکه
🗂️ #db: معرفی و نکات دیتابیس
🔖 #reference: معرفی مقاله و ویدیو
📢 #notif: اطلاع رسانی ها
❓ #question: سوالات جالب در برنامه نویسی
🎊 #event: رویداد هایی که معرفی کردیم
🎬 #movie: معرفی فیلم و سریال
📚 #book: معرفی کتابهای تخصصی
🤖 #AI: مطالب مرتبط به هوش مصنوعی
📊 #ml: مطالب مرتبط به یادگیری ماشین
🛠️ #backend: آموزشها و ترفندهای بکاند
🔒 #security: نکات امنیتی
⚙ #devops: مطالب مرتبط به دواپس
📺 #YouTube: ویدیوهای چنل یوتیوب ما
هر کدوم از این هشتگها برای یه موضوع خاص طراحی شده تا شما به راحتی بتونید محتوای مورد نظرتون رو پیدا کنید. دیگه لازم نیست کلی تو کانال بگردید 😊
اگه موضوع جدیدی به مطالب کانال اضافه بشه، حتماً تو این لیست قرار میگیره ✅
راستی میتونید بنر کانال رو برای دوستاتون هم بفرستید تا اونا هم به جمع ما بپیوندن و از این مطالب مفید استفاده کنن 😉
NinjaLearn Banner 🥷🤝
#category
➖➖➖➖➖➖➖➖➖
🔆 CHANNEL | GROUP
❤22👍1👎1🔥1
خب خب خب شیگرایی در پایتون🚀
شیگرایی تو پایتون فقط محدود به تعریف کلاسها و متدهای ساده نیست. این زبان امکانات پیشرفتهتری هم داره که با یاد گرفتنشون میتونید کدهای بهینهتر، استانداردتر و انعطافپذیرتری بنویسید. بیاید چند تا از این مفاهیم رو بررسی کنیم.
1⃣ متاکلاسها🕵️♂️
متاکلاسها این امکان رو میدن که قبل از ایجاد یک کلاس، ساختارش رو کنترل کنی. میتونی مطمئن شی که قوانین خاصی رعایت شدن یا حتی رفتار کلاس رو دستکاری کنی.
مثال:
اطمینان از تعریف متد greet در کلاس
💡 چی شد؟
ترکیب یا Composition یک راه انعطافپذیرتر برای ساختار دادن به کلاسهات هست. این روش بهت کمک میکنه وابستگیها رو کم کنی و کدهات قابل نگهداریتر باشن.
مثال: تعریف ماشین با استفاده از موتور
💡 چی شد؟
ویژگی های (attributes) هر آبجکت در پایتون به صورت پیشفرض در یک دیکشنری ذخیره میشن که حافظه زیادی مصرف میکنه. با slots میتونی این دیکشنری رو حذف کنی و مصرف حافظه رو کاهش بدی.
مثال: استفاده از slots برای بهینهسازی
💡 چی شد؟
4⃣ Abstract Base Classes 🎯
کلاسهای پایه انتزاعی (ABC) تضمین میکنن که کلاسهای فرزند متدهای مشخصی رو پیادهسازی کنن. این کار طراحی رو مطمئنتر و کدها رو خواناتر میکنه.
مثال: طراحی یک کلاس پایه برای اشکال هندسی
💡 چی شد؟
جمعبندی ✍
این نکات فقط نوک کوه یخه اگه میخوای عمیق تر بشی، کتاب Fluent Python یکی از بهترین منابعه.
➖➖➖➖➖➖➖➖➖
شیگرایی تو پایتون فقط محدود به تعریف کلاسها و متدهای ساده نیست. این زبان امکانات پیشرفتهتری هم داره که با یاد گرفتنشون میتونید کدهای بهینهتر، استانداردتر و انعطافپذیرتری بنویسید. بیاید چند تا از این مفاهیم رو بررسی کنیم.
1⃣ متاکلاسها🕵️♂️
متاکلاسها این امکان رو میدن که قبل از ایجاد یک کلاس، ساختارش رو کنترل کنی. میتونی مطمئن شی که قوانین خاصی رعایت شدن یا حتی رفتار کلاس رو دستکاری کنی.
مثال:
اطمینان از تعریف متد greet در کلاس
class Meta(type):
def __new__(cls, name, bases, dct):
# Ensure 'greet' method exists in the class
if 'greet' not in dct:
raise TypeError(f"Class '{name}' must define 'greet' method")
return super().__new__(cls, name, bases, dct)
class MyClass(metaclass=Meta):
def greet(self):
return "Hello, world!"
obj = MyClass()
print(obj.greet()) # Output: Hello, world!
💡 چی شد؟
متاکلاس Meta بررسی میکنه که متد greet توی هر کلاسی که ازش استفاده میکنه، حتماً تعریف شده باشه. با این کار، خطاها زودتر شناسایی میشن و کدت تمیزتر میمونه.2⃣ Composition به جای ارثبری 🔗
ترکیب یا Composition یک راه انعطافپذیرتر برای ساختار دادن به کلاسهات هست. این روش بهت کمک میکنه وابستگیها رو کم کنی و کدهات قابل نگهداریتر باشن.
مثال: تعریف ماشین با استفاده از موتور
class Engine:
def start(self):
return "Engine started"
class Car:
def __init__(self):
self.engine = Engine() # Engine is a part of Car
def start(self):
return self.engine.start() # Delegate starting to Engine
car = Car()
print(car.start()) # Output: Engine started
💡 چی شد؟
به جای این که ماشین از موتور ارثبری کنه، موتور به عنوان یک جزء در ماشین ترکیب شده. این یعنی موتور رو میتونی راحت عوض کنی بدون این که ساختار کلی ماشین به مشکل بخوره.3⃣ بهینهسازی حافظه با slots 🧠
ویژگی های (attributes) هر آبجکت در پایتون به صورت پیشفرض در یک دیکشنری ذخیره میشن که حافظه زیادی مصرف میکنه. با slots میتونی این دیکشنری رو حذف کنی و مصرف حافظه رو کاهش بدی.
مثال: استفاده از slots برای بهینهسازی
class MyClass:
__slots__ = ['name', 'age'] # Restrict attributes to these two
obj = MyClass()
obj.name = "Alice"
obj.age = 25
💡 چی شد؟
ویژگیهای آبجکت فقط محدود به name و age هستن و هیچ فضای اضافی برای دیکشنری داخلی استفاده نمیشه. این روش توی سیستمهایی با تعداد آبجکت زیاد، تفاوت بزرگی ایجاد میکنه.
4⃣ Abstract Base Classes 🎯
کلاسهای پایه انتزاعی (ABC) تضمین میکنن که کلاسهای فرزند متدهای مشخصی رو پیادهسازی کنن. این کار طراحی رو مطمئنتر و کدها رو خواناتر میکنه.
مثال: طراحی یک کلاس پایه برای اشکال هندسی
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
"""Calculate the area of the shape"""
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2 # Area formula for a circle
circle = Circle(5)
print(circle.area()) # Output: 78.5
💡 چی شد؟
کلاس Shape تضمین میکنه که همهی اشکال فرزند متد area رو داشته باشن. بدون این متد، ساختن کلاس فرزند امکانپذیر نیست.
جمعبندی ✍
این نکات فقط نوک کوه یخه اگه میخوای عمیق تر بشی، کتاب Fluent Python یکی از بهترین منابعه.
#programming #python #oop
➖➖➖➖➖➖➖➖➖
🔆 CHANNEL | GROUP
O’Reilly Online Learning
Fluent Python
Python’s simplicity lets you become productive quickly, but this often means you aren’t using everything it has to offer. With this hands-on guide, you’ll learn how to write effective, idiomatic … - Selection from Fluent Python [Book]
1👍14🔥2❤1
Ninja Learn | نینجا لرن
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم. از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید محتوای…
دوستانیم که تازه تشریف اوردید کانال (خیلی خوش اومدید ❤️)
حتما این دسته بندی کانال رو مطالعه کنید که از مطالب قبلی کانال استفاده ببرید 😉
حتما این دسته بندی کانال رو مطالعه کنید که از مطالب قبلی کانال استفاده ببرید 😉
Telegram
Ninja Learn | نینجا لرن
تا حالا کلی مطالب خفن و کاربردی تو کانال NinjaLearn براتون آماده کردیم و الان صدها مطلب مختلف و جذاب داریم.
از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید…
از اونجایی که مطالب کانال خیلی متنوع و زیاد شده، تصمیم گرفتیم یه دستهبندی مرتب و منظم برای همهی پستها داشته باشیم تا شما عزیزان راحتتر بتونید…
❤8
class MetaLoggernew
def __new__(meta_cls, cls_name, bases, cls_dict):
print(f"داریم کلاس {cls_name} رو میسازیم!")
new super().__new__(meta_cls, cls_name, bases, clsinit
def __init__(cls, cls_name, bases, cls_dict):
print(f"کلاس {cls_name} ساخته شده و آماده استفاده است!")
initsuper().__init__(cls_name, bases, cls_dict)
class Example(metaclass=MetaLogger):
pass
# خروجی:
# داریم کلاس Example رو میسازیم!
# کلاس Example ساخته شده و آماده استفاده است
5⃣ مزایا و چالشهای متاکلاسها 💡⚠️
مزایا:
کنترل دقیق روی ساختار کلاسها:
میتوانید رفتار و ساختار کلاسها رو به دلخواه تغییر بدید.
کاهش تکرار کد:
الگوها و قوانین مشترک رو در یک نقطه متمرکز میکنید.
ایجاد چارچوبهای پیچیده:
برای ساخت فریمورکهای پیشرفته (مثل Django یا SQLAlchemy) این تکنیک فوقالعاده کاربردیه.
چالشها:
پیچیدگی در درک:
متاکلاسها مفهومی پیشرفته هستند و نیاز به زمان و تجربه برای درک کامل دارند.
اشکالزدایی سختتر:
خطاها در متاکلاسها معمولاً در زمان ایجاد کلاس اتفاق میافتند و پیدا کردشون سخت تر هست.
استفاده بیش از حد:
همیشه باید از متاکلاسها تنها در وقتایی استفاده کنید که واقعاً نیاز دارید؛ بعضی وقتی راهحلهای سادهتر مانند دکوریتورها یا میکسینها کفایت میکنن.
7⃣ جمعبندی نهایی ✍
متاکلاسها به شما این امکان رو میدن که قبل از ساختهشدن کلاس، رفتار و ساختار اون رو تغییر بدید. اگه نیاز به کنترل دقیق روی ساختار کد دارید یا میخواید چارچوبهای پیچیدهای بسازید، متاکلاسها ابزار قدرتمندی هستن. اما همزمان باید به خاطر داشته باشید که این جادوی عمیق نیازمند دانش و دقت بالایی هست.
امید وارم مفید بوده باشه :)
#⃣ #python #programming
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
👍10❤2
خب خب خب دکوریتورها (Decorators) در پایتون: تغییر رفتار توابع و کلاسها 🐍
سلام دوستان امروز میخوایم در مورد یکی از ویژگیهای خیلی قوی و در عین حال جذاب پایتون صحبت کنیم:
دکوریتورها. این قابلیت به شما اجازه میده تا بدون دست زدن به کد اصلی توابع یا کلاسها، رفتارشون رو تغییر بدید.
1⃣ دکوریتورها چیستند؟ 🤔
دکوریتورها در پایتون، توابع یا کلاسهایی هستن که مثل یه "بستهبندی" عمل میکنن. یعنی، شما یه تابع یا کلاس رو میگیرید، اون رو به یه دکوریتور میفرستید، دکوریتور رفتارش رو تغییر میده (یا بهبود میبخشه) و نسخه تغییر یافته رو برمیگردونه.
مثال ساده:
اینجا دکوریتور simple_decorator قبل و بعد از اجرای تابع greet پیام چاپ میکنه. یعنی بدون اینکه کد اصلی تابع رو دست بزنیم، رفتارش تغییر پیدا میکنه.
2⃣ نحوهی کارکرد دکوریتورها 🔧
🔻 دکوریتور به عنوان یک تابع
در واقع، دکوریتورها توی پایتون همون توابعی هستن که یه تابع یا کلاس رو به عنوان ورودی میگیرن و یه نسخه تغییر یافته برمیگردونن. وقتی از علامت @ استفاده میکنید، پایتون به طور خودکار این کار رو انجام میده.
🔻 مراحل استفاده از دکوریتور:
تعریف دکوریتور:
دکوریتور یه تابعه که یه تابع ورودی میگیره و نسخه بهبود یافته یا تغییر یافته رو برمیگردونه.
اعمال دکوریتور:
با قرار دادن علامت @ قبل از تعریف تابع یا کلاس، دکوریتور روی اون اعمال میشه.
اجرای تابع دکوریتور:
وقتی تابع دکوریت شده فراخوانی میشه، اول تابع "بستهبندی" (wrapper) اجرا میشه و بعد تابع اصلی.
🔻 مثال دکوریتور بر روی کلاس
دکوریتورها فقط برای توابع نیستن؛ میتونن رفتار کلاسها رو هم تغییر بدن. مثلاً:
اینجا دکوریتور add_str متد str
رو به کلاس Person اضافه میکنه، بدون اینکه کد داخل کلاس رو تغییر بده.
3⃣ مزایای استفاده از دکوریتورها ✨
کنترل دقیق روی ساختار کد:
دکوریتورها به شما این امکان رو میدن تا بدون دست زدن به منطق اصلی تابع یا کلاس، رفتارشون رو تغییر بدید. این موضوع برای توسعه چارچوبهای پیچیده خیلی مفیده.
اجرای الگوهای تکراری (DRY):
میتونید کدهای تکراری مثل ثبت رویدادها، اعتبارسنجی یا مدیریت استثناها رو توی یه مکان متمرکز کنید.
گسترش قابلیتها:
به راحتی میشه قابلیتهای جدیدی به توابع یا کلاسها اضافه کرد بدون اینکه لازم باشه کد اصلی رو تغییر بدید.
4⃣ چالشهای استفاده از دکوریتورها ⚠️
درک اولیه سختتر:
برای کسانی که تازه شروع کردن، مفهوم دکوریتورها ممکنه گیجکننده باشه. برای درک کاملش نیاز به مطالعه و تمرین داره.
اشکالزدایی پیچیده:
وقتی دکوریتورها به شکل گسترده استفاده میشن، پیدا کردن مشکلات در کد ممکنه سختتر بشه، چون تغییرات به طور پنهانی در رفتار توابع اعمال میشه.
ترکیب با سایر مفاهیم:
استفاده همزمان از دکوریتورها با مفاهیم پیشرفته مثل متاکلاسها یا توابع بازگشتی میتونه باعث پیچیدگیهای اضافه بشه.
جمعبندی ✍
دکوریتورها ابزار خیلی قدرتمندی در پایتون هستن که به شما امکان میدن رفتار توابع و کلاسها رو بدون تغییر کد اصلی تغییر بدید. این قابلیت مخصوصاً توی پیادهسازی چارچوبهای پیچیده و کنترل دقیق روی ساختار کد کاربرد زیادی داره. اگرچه درک اولیهش ممکنه کمی سخت باشه، اما با تمرین و استفاده از مثالهای عملی، دکوریتورها میتونن ابزار بسیار موثری برای بهبود و انعطافپذیری کدتون باشن.
➖➖➖➖➖➖➖➖➖
سلام دوستان امروز میخوایم در مورد یکی از ویژگیهای خیلی قوی و در عین حال جذاب پایتون صحبت کنیم:
دکوریتورها. این قابلیت به شما اجازه میده تا بدون دست زدن به کد اصلی توابع یا کلاسها، رفتارشون رو تغییر بدید.
1⃣ دکوریتورها چیستند؟ 🤔
دکوریتورها در پایتون، توابع یا کلاسهایی هستن که مثل یه "بستهبندی" عمل میکنن. یعنی، شما یه تابع یا کلاس رو میگیرید، اون رو به یه دکوریتور میفرستید، دکوریتور رفتارش رو تغییر میده (یا بهبود میبخشه) و نسخه تغییر یافته رو برمیگردونه.
مثال ساده:
def simple_decorator(func):
def wrapper(*args, **kwargs):
print("قبل از اجرای تابع")
result = func(*args, **kwargs)
print("بعد از اجرای تابع")
return result
return wrapper
@simple_decorator
def greet(name):
print(f"سلام، {name}!")
greet("علی")
اینجا دکوریتور simple_decorator قبل و بعد از اجرای تابع greet پیام چاپ میکنه. یعنی بدون اینکه کد اصلی تابع رو دست بزنیم، رفتارش تغییر پیدا میکنه.
2⃣ نحوهی کارکرد دکوریتورها 🔧
🔻 دکوریتور به عنوان یک تابع
در واقع، دکوریتورها توی پایتون همون توابعی هستن که یه تابع یا کلاس رو به عنوان ورودی میگیرن و یه نسخه تغییر یافته برمیگردونن. وقتی از علامت @ استفاده میکنید، پایتون به طور خودکار این کار رو انجام میده.
🔻 مراحل استفاده از دکوریتور:
تعریف دکوریتور:
دکوریتور یه تابعه که یه تابع ورودی میگیره و نسخه بهبود یافته یا تغییر یافته رو برمیگردونه.
اعمال دکوریتور:
با قرار دادن علامت @ قبل از تعریف تابع یا کلاس، دکوریتور روی اون اعمال میشه.
اجرای تابع دکوریتور:
وقتی تابع دکوریت شده فراخوانی میشه، اول تابع "بستهبندی" (wrapper) اجرا میشه و بعد تابع اصلی.
🔻 مثال دکوریتور بر روی کلاس
دکوریتورها فقط برای توابع نیستن؛ میتونن رفتار کلاسها رو هم تغییر بدن. مثلاً:
def add_str(cls):
# افزودن یه متد برای نمایش
def __str__(self):
return f"{cls.__name__} با ویژگیها: {self.__dict__}"
cls.__str__ = __str__
return cls
@add_str
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("سارا", 28)
print(p) # خروجی: Person با ویژگیها: {'name': 'سارا', 'age': 28}
اینجا دکوریتور add_str متد str
رو به کلاس Person اضافه میکنه، بدون اینکه کد داخل کلاس رو تغییر بده.
3⃣ مزایای استفاده از دکوریتورها ✨
کنترل دقیق روی ساختار کد:
دکوریتورها به شما این امکان رو میدن تا بدون دست زدن به منطق اصلی تابع یا کلاس، رفتارشون رو تغییر بدید. این موضوع برای توسعه چارچوبهای پیچیده خیلی مفیده.
اجرای الگوهای تکراری (DRY):
میتونید کدهای تکراری مثل ثبت رویدادها، اعتبارسنجی یا مدیریت استثناها رو توی یه مکان متمرکز کنید.
گسترش قابلیتها:
به راحتی میشه قابلیتهای جدیدی به توابع یا کلاسها اضافه کرد بدون اینکه لازم باشه کد اصلی رو تغییر بدید.
4⃣ چالشهای استفاده از دکوریتورها ⚠️
درک اولیه سختتر:
برای کسانی که تازه شروع کردن، مفهوم دکوریتورها ممکنه گیجکننده باشه. برای درک کاملش نیاز به مطالعه و تمرین داره.
اشکالزدایی پیچیده:
وقتی دکوریتورها به شکل گسترده استفاده میشن، پیدا کردن مشکلات در کد ممکنه سختتر بشه، چون تغییرات به طور پنهانی در رفتار توابع اعمال میشه.
ترکیب با سایر مفاهیم:
استفاده همزمان از دکوریتورها با مفاهیم پیشرفته مثل متاکلاسها یا توابع بازگشتی میتونه باعث پیچیدگیهای اضافه بشه.
جمعبندی ✍
دکوریتورها ابزار خیلی قدرتمندی در پایتون هستن که به شما امکان میدن رفتار توابع و کلاسها رو بدون تغییر کد اصلی تغییر بدید. این قابلیت مخصوصاً توی پیادهسازی چارچوبهای پیچیده و کنترل دقیق روی ساختار کد کاربرد زیادی داره. اگرچه درک اولیهش ممکنه کمی سخت باشه، اما با تمرین و استفاده از مثالهای عملی، دکوریتورها میتونن ابزار بسیار موثری برای بهبود و انعطافپذیری کدتون باشن.
#⃣ #python #programming
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
❤14👍6👌2
خب خب خب پشت صحنه دکوریتورها در پایتون: چه اتفاقی پشت پرده میافته؟ 🚀
تو پست قبلی یه نگاه کلی به دکوریتورها داشتیم و دیدیم چقدر میتونن کاربردی باشن. ولی بیاین یه کم عمیقتر بشیم و ببینیم وقتی یه دکوریتور روی تابع یا کلاس اعمال میشه، دقیقاً چه اتفاقی پشت صحنه رخ میده؟ حتی قبل از اینکه کد اجرا بشه.
1⃣ پایتون چطوری کد رو اجرا میکنه؟ 📜
قبل از اینکه بریم سراغ دکوریتورها، یه نکته مهم:
پایتون یه زبان مفسریه، یعنی خطبهخط کد رو اجرا میکنه. ولی قبل از اجرا، اول کد رو به بایتکد تبدیل میکنه و بعد اون رو میفرسته برای ماشین مجازی پایتون (PVM).
تو این فرآیند، هر تابع و کلاس یه آبجکت جداگانه توی حافظه میشه و همینجاست که دکوریتورها وارد عمل میشن 🚀
2⃣ دکوریتورها دقیقاً چیکار میکنن؟ 🔧
1⃣ وقتی @ میذاریم، واقعاً چی میشه؟
وقتی یه تابع رو با @my_decorator دکوریت میکنیم، پایتون پشت صحنه این کارو انجام میده:
میشه این:
یعنی تابع اصلی ساخته میشه، بعد به دکوریتور داده میشه و خروجی دکوریتور جایگزین تابع اصلی میشه. این اتفاق در لحظه تعریف تابع رخ میده، نه وقتی تابع اجرا میشه
2⃣ ترتیب اجرا چطوریه؟
وقتی دکوریتور روی تابع اعمال میشه:
پس، از این به بعد هر وقت تابع رو صدا بزنید، در واقع دارید خروجی دکوریتور رو اجرا میکنید، نه تابع اصلی رو
3⃣ چه بلایی سر تابع میاد؟ 🔍
1⃣ تابع اصلی تبدیل میشه به...
هر تابع تو پایتون یه آبجکته، پس دکوریتورها میتونن روش تغییرات زیادی بدن:
قبل از اجرا یه کار انجام بدن (مثلاً لاگ بگیرن).
تابع اصلی رو اجرا کنن.
بعد از اجرا هم یه کار دیگه انجام بدن (مثلاً خروجی رو دستکاری کنن).
یا حتی یه چیز کاملاً جدید برگردونن
در نتیجه، اسم تابع دیگه به اون چیزی که اول تعریف کردید اشاره نمیکنه، بلکه به خروجی دکوریتور اشاره داره.
2⃣ مشکل متادیتا و راهحل functools.wraps
یه مشکل اینه که دکوریتور باعث میشه اطلاعات تابع (مثل نام، توضیحات و...) از بین بره. برای حل این مشکل، باید از functools.wraps استفاده کنیم:
اینطوری، متادیتای تابع اصلی حفظ میشه وdoc __doc__ دسترسی داشت. 😎
3⃣ دکوریتورهای پشت سر هم (Chaining Decorators)
اگه چندتا دکوریتور رو روی یه تابع بذاریم، ترتیبش مهمه. به این مثال دقت کن:
اول decorator_b اجرا میشه و خروجیش میره تو decorator_a. پس ترتیب اجرا به این شکله:
پس، دکوریتوری که پایینتر نوشته شده، زودتر اجرا میشه 🔄
4⃣ پشت صحنه در زمان کامپایل و اجرا 🕒
1⃣ دکوریتور کی اجرا میشه؟
دکوریتورها همون موقعی که تابع یا کلاس تعریف میشه اجرا میشن، نه وقتی که تابع رو صدا میزنید. پس این کد:
در لحظهای که پایتون به این خط کد میرسه، my_decorator(my_func) اجرا میشه و خروجیش جایگزین my_func میشه.
2⃣ ذخیره تابع در فضای نام (Namespace Binding)
بعد از این فرآیند، اسم تابع به تابع دکوریتشده اشاره میکنه. پس اگه تابع اصلی رو نگه نداشته باشید، دیگه بهش دسترسی ندارید
3⃣ تأثیر روی بهینهسازی
چون دکوریتورها میتونن کد تابع رو تغییر بدن، ممکنه باعث بشن که بهینهسازیهایی که پایتون انجام میده، دیگه درست کار نکنه. برای مثال، اگه دکوریتور یه حلقه اضافه کنه یا اجرای تابع رو تغییر بده، بایتکد نهایی کاملاً متفاوت میشه.
5⃣ نکات مهم که باید رعایت کنید 💡
✅ از functools.wraps استفاده کنید
اگه دکوریتورتون متادیتای تابع رو تغییر میده، این کار باعث میشه اطلاعات تابع اصلی حفظ بشه.
✅ ترتیب دکوریتورها مهمه
اگه چند دکوریتور دارید، حتماً ترتیب اجرا رو بررسی کنید که به مشکل نخورید.
✅ موقع اشکالزدایی حواستون باشه
چون دکوریتورها موقع تعریف اجرا میشن، اگه کدتون مشکل داشته باشه، ممکنه سختتر اشکالزدایی بشه. پس بهتره با print یا لاگ گرفتن، مراحل اجرا رو چک کنید.
➖➖➖➖➖➖➖➖➖
تو پست قبلی یه نگاه کلی به دکوریتورها داشتیم و دیدیم چقدر میتونن کاربردی باشن. ولی بیاین یه کم عمیقتر بشیم و ببینیم وقتی یه دکوریتور روی تابع یا کلاس اعمال میشه، دقیقاً چه اتفاقی پشت صحنه رخ میده؟ حتی قبل از اینکه کد اجرا بشه.
1⃣ پایتون چطوری کد رو اجرا میکنه؟ 📜
قبل از اینکه بریم سراغ دکوریتورها، یه نکته مهم:
پایتون یه زبان مفسریه، یعنی خطبهخط کد رو اجرا میکنه. ولی قبل از اجرا، اول کد رو به بایتکد تبدیل میکنه و بعد اون رو میفرسته برای ماشین مجازی پایتون (PVM).
تو این فرآیند، هر تابع و کلاس یه آبجکت جداگانه توی حافظه میشه و همینجاست که دکوریتورها وارد عمل میشن 🚀
2⃣ دکوریتورها دقیقاً چیکار میکنن؟ 🔧
1⃣ وقتی @ میذاریم، واقعاً چی میشه؟
وقتی یه تابع رو با @my_decorator دکوریت میکنیم، پایتون پشت صحنه این کارو انجام میده:
@my_decorator
def func(...):
...
میشه این:
def func(...):
...
func = my_decorator(func)
یعنی تابع اصلی ساخته میشه، بعد به دکوریتور داده میشه و خروجی دکوریتور جایگزین تابع اصلی میشه. این اتفاق در لحظه تعریف تابع رخ میده، نه وقتی تابع اجرا میشه
2⃣ ترتیب اجرا چطوریه؟
وقتی دکوریتور روی تابع اعمال میشه:
تابع اصلی به عنوان یه آبجکت ساخته میشه.
دکوریتور اجرا میشه و تابع اصلی رو میگیره.
خروجی دکوریتور جایگزین تابع اصلی میشه.
پس، از این به بعد هر وقت تابع رو صدا بزنید، در واقع دارید خروجی دکوریتور رو اجرا میکنید، نه تابع اصلی رو
3⃣ چه بلایی سر تابع میاد؟ 🔍
1⃣ تابع اصلی تبدیل میشه به...
هر تابع تو پایتون یه آبجکته، پس دکوریتورها میتونن روش تغییرات زیادی بدن:
قبل از اجرا یه کار انجام بدن (مثلاً لاگ بگیرن).
تابع اصلی رو اجرا کنن.
بعد از اجرا هم یه کار دیگه انجام بدن (مثلاً خروجی رو دستکاری کنن).
یا حتی یه چیز کاملاً جدید برگردونن
در نتیجه، اسم تابع دیگه به اون چیزی که اول تعریف کردید اشاره نمیکنه، بلکه به خروجی دکوریتور اشاره داره.
2⃣ مشکل متادیتا و راهحل functools.wraps
یه مشکل اینه که دکوریتور باعث میشه اطلاعات تابع (مثل نام، توضیحات و...) از بین بره. برای حل این مشکل، باید از functools.wraps استفاده کنیم:
import functools
def log_calls(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"قبل از اجرای {func.__name__}")
result = func(*args, **kwargs)
print(f"بعد از اجرای {func.__name__}")
return result
return wrapper
اینطوری، متادیتای تابع اصلی حفظ میشه وdoc __doc__ دسترسی داشت. 😎
3⃣ دکوریتورهای پشت سر هم (Chaining Decorators)
اگه چندتا دکوریتور رو روی یه تابع بذاریم، ترتیبش مهمه. به این مثال دقت کن:
@decorator_a
@decorator_b
def func():
pass
اول decorator_b اجرا میشه و خروجیش میره تو decorator_a. پس ترتیب اجرا به این شکله:
func = decorator_b(func)
func = decorator_a(func)
پس، دکوریتوری که پایینتر نوشته شده، زودتر اجرا میشه 🔄
4⃣ پشت صحنه در زمان کامپایل و اجرا 🕒
1⃣ دکوریتور کی اجرا میشه؟
دکوریتورها همون موقعی که تابع یا کلاس تعریف میشه اجرا میشن، نه وقتی که تابع رو صدا میزنید. پس این کد:
@my_decorator
def my_func():
pass
در لحظهای که پایتون به این خط کد میرسه، my_decorator(my_func) اجرا میشه و خروجیش جایگزین my_func میشه.
2⃣ ذخیره تابع در فضای نام (Namespace Binding)
بعد از این فرآیند، اسم تابع به تابع دکوریتشده اشاره میکنه. پس اگه تابع اصلی رو نگه نداشته باشید، دیگه بهش دسترسی ندارید
3⃣ تأثیر روی بهینهسازی
چون دکوریتورها میتونن کد تابع رو تغییر بدن، ممکنه باعث بشن که بهینهسازیهایی که پایتون انجام میده، دیگه درست کار نکنه. برای مثال، اگه دکوریتور یه حلقه اضافه کنه یا اجرای تابع رو تغییر بده، بایتکد نهایی کاملاً متفاوت میشه.
5⃣ نکات مهم که باید رعایت کنید 💡
✅ از functools.wraps استفاده کنید
اگه دکوریتورتون متادیتای تابع رو تغییر میده، این کار باعث میشه اطلاعات تابع اصلی حفظ بشه.
✅ ترتیب دکوریتورها مهمه
اگه چند دکوریتور دارید، حتماً ترتیب اجرا رو بررسی کنید که به مشکل نخورید.
✅ موقع اشکالزدایی حواستون باشه
چون دکوریتورها موقع تعریف اجرا میشن، اگه کدتون مشکل داشته باشه، ممکنه سختتر اشکالزدایی بشه. پس بهتره با print یا لاگ گرفتن، مراحل اجرا رو چک کنید.
#⃣ #python #programming
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
❤14👍6🔥3👎1👏1👌1
خب خب خب جلوگیری از Race Condition در جنگو با select_for_update 🔒🚀
توی این پست در مورد Race Condition صحبت کردیم و گفتیم چطور ممکنه چندتا درخواست همزمان بیان و دیتا رو خراب کنن. حالا بریم ببینیم جنگو چه ترفندهایی برای کنترل این مشکل داره و چطور میتونیم از select_for_update استفاده کنیم.
مشکل چیه؟ 🤔
فرض کن یه سیستم بانکی داری و کاربرا دارن پول جابهجا میکنن. حالا دو نفر همزمان میخوان از حسابشون پول بردارن و موجودی حساب فقط 100 تومنه. اگه این درخواستها بدون قفل کردن دیتا پردازش بشن، ممکنه هر دو برداشت موفق بشن و سیستم بدهکار بشه 😬
چطوری select_for_update مشکل رو حل میکنه؟ 🔐
وقتی از select_for_update استفاده میکنی، رکورد دیتابیس قفل میشه تا هیچ درخواست دیگهای نتونه همزمان تغییرش بده. این یعنی هر درخواستی که بعد از اولین درخواست بیاد، باید منتظر بمونه تا قفل آزاد بشه و بعد پردازش بشه.
مثال 1: جلوگیری از برداشت همزمان از حساب بانکی 🏦
✅ این کد مطمئن میشه که وقتی یه درخواست داره موجودی رو چک میکنه و کم میکنه، هیچ درخواست دیگهای همزمان وارد عمل نشه.
مثال 2: انتقال وجه بین دو حساب 💳
حالا یه چالش سختتر انتقال پول از یه حساب به حساب دیگه. باید هر دو حساب همزمان قفل بشن تا مشکلات همزمانی پیش نیاد.
✅ اینجا هر دو حساب رو قفل میکنیم تا حتی اگه دو درخواست انتقال پول به صورت همزمان بیاد، هیچکدوم نتونن وسط کار رو همدیگه تأثیر بذارن.
چندتا نکته 🚀
🔹 انتخاب نوع قفل (select_for_update(nowait=True))
اگه بخوای درخواستهای معطل رو سریع رد کنی، میتونی nowait=True بذاری که اگه رکورد قفل بود، درخواست جدید منتظر نمونه و مستقیم خطا بده.
☝️ این باعث میشه که اگه رکورد قفل باشه، جنگو بلافاصله یه DatabaseError بده و منتظر نمونه.
🔹 قفل کردن رکوردها بدون مسدود کردن خواندن (select_for_update(skip_locked=True))
اگه درخواستهای زیادی داری و نمیخوای که یک درخواست کل سیستم رو بلاک کنه، میتونی از skip_locked=True استفاده کنی که درخواستهای دیگه بتونن رکوردهای آزاد رو پردازش کنن.
☝️ این کار باعث میشه که اگه یه رکورد قفل بود، درخواست بیخیال اون رکورد بشه و فقط رکوردهایی که قفل نیستن رو انتخاب کنه.
🔹 مدیریت تایماوت قفل (set statement_timeout)
اگه نمیخوای که درخواستها مدت زیادی بلاک بشن، توی PostgreSQL میتونی یه تایماوت برای قفل تعیین کنی:
☝️ این یعنی اگه یه درخواست بیشتر از ۵ ثانیه قفل بمونه، بهش خطا داده میشه و میره بیرون.
جمعبندی ✍
select_for_update یکی از قویترین ابزارها برای جلوگیری از Race Condition توی جنگوئه. مهمترین نکاتش اینان:
✅ قفل کردن رکوردهای دیتابیس موقع آپدیت برای جلوگیری از دستکاری همزمان
✅ استفاده از nowait=True برای جلوگیری از انتظار بیش از حد
✅ استفاده از skip_locked=True برای رد کردن رکوردهای قفلشده و ادامه پردازش.
➖➖➖➖➖➖➖➖➖
توی این پست در مورد Race Condition صحبت کردیم و گفتیم چطور ممکنه چندتا درخواست همزمان بیان و دیتا رو خراب کنن. حالا بریم ببینیم جنگو چه ترفندهایی برای کنترل این مشکل داره و چطور میتونیم از select_for_update استفاده کنیم.
مشکل چیه؟ 🤔
فرض کن یه سیستم بانکی داری و کاربرا دارن پول جابهجا میکنن. حالا دو نفر همزمان میخوان از حسابشون پول بردارن و موجودی حساب فقط 100 تومنه. اگه این درخواستها بدون قفل کردن دیتا پردازش بشن، ممکنه هر دو برداشت موفق بشن و سیستم بدهکار بشه 😬
اینجا همون جاییه که select_for_update میاد وسط و دیتا رو از فاجعه نجات میده.
چطوری select_for_update مشکل رو حل میکنه؟ 🔐
وقتی از select_for_update استفاده میکنی، رکورد دیتابیس قفل میشه تا هیچ درخواست دیگهای نتونه همزمان تغییرش بده. این یعنی هر درخواستی که بعد از اولین درخواست بیاد، باید منتظر بمونه تا قفل آزاد بشه و بعد پردازش بشه.
مثال 1: جلوگیری از برداشت همزمان از حساب بانکی 🏦
from django.db import transaction
from myapp.models import Account
def withdraw_money(account_id, amount):
with transaction.atomic(): # شروع تراکنش
account = Account.objects.select_for_update().get(pk=account_id) # قفل کردن رکورد
if account.balance >= amount:
account.balance -= amount
account.save()
print("برداشت موفقیتآمیز بود!")
else:
print("موجودی کافی نیست!") # جلوگیری از برداشت بیش از حد
✅ این کد مطمئن میشه که وقتی یه درخواست داره موجودی رو چک میکنه و کم میکنه، هیچ درخواست دیگهای همزمان وارد عمل نشه.
مثال 2: انتقال وجه بین دو حساب 💳
حالا یه چالش سختتر انتقال پول از یه حساب به حساب دیگه. باید هر دو حساب همزمان قفل بشن تا مشکلات همزمانی پیش نیاد.
from django.db import transaction
from myapp.models import Account
def transfer_money(from_id, to_id, amount):
with transaction.atomic():
accounts = Account.objects.select_for_update().filter(pk__in=[from_id, to_id]).order_by("id")
sender = accounts[0]
receiver = accounts[1]
if sender.balance >= amount:
sender.balance -= amount
receiver.balance += amount
sender.save()
receiver.save()
print("انتقال وجه موفقیتآمیز بود!")
else:
print("موجودی کافی نیست!") # جلوگیری از انتقال اشتباه
✅ اینجا هر دو حساب رو قفل میکنیم تا حتی اگه دو درخواست انتقال پول به صورت همزمان بیاد، هیچکدوم نتونن وسط کار رو همدیگه تأثیر بذارن.
چندتا نکته 🚀
🔹 انتخاب نوع قفل (select_for_update(nowait=True))
اگه بخوای درخواستهای معطل رو سریع رد کنی، میتونی nowait=True بذاری که اگه رکورد قفل بود، درخواست جدید منتظر نمونه و مستقیم خطا بده.
account = Account.objects.select_for_update(nowait=True).get(pk=1)
☝️ این باعث میشه که اگه رکورد قفل باشه، جنگو بلافاصله یه DatabaseError بده و منتظر نمونه.
🔹 قفل کردن رکوردها بدون مسدود کردن خواندن (select_for_update(skip_locked=True))
اگه درخواستهای زیادی داری و نمیخوای که یک درخواست کل سیستم رو بلاک کنه، میتونی از skip_locked=True استفاده کنی که درخواستهای دیگه بتونن رکوردهای آزاد رو پردازش کنن.
account = Account.objects.select_for_update(skip_locked=True).get(pk=1)
☝️ این کار باعث میشه که اگه یه رکورد قفل بود، درخواست بیخیال اون رکورد بشه و فقط رکوردهایی که قفل نیستن رو انتخاب کنه.
🔹 مدیریت تایماوت قفل (set statement_timeout)
اگه نمیخوای که درخواستها مدت زیادی بلاک بشن، توی PostgreSQL میتونی یه تایماوت برای قفل تعیین کنی:
SET statement_timeout = '5s';
☝️ این یعنی اگه یه درخواست بیشتر از ۵ ثانیه قفل بمونه، بهش خطا داده میشه و میره بیرون.
جمعبندی ✍
select_for_update یکی از قویترین ابزارها برای جلوگیری از Race Condition توی جنگوئه. مهمترین نکاتش اینان:
✅ قفل کردن رکوردهای دیتابیس موقع آپدیت برای جلوگیری از دستکاری همزمان
✅ استفاده از nowait=True برای جلوگیری از انتظار بیش از حد
✅ استفاده از skip_locked=True برای رد کردن رکوردهای قفلشده و ادامه پردازش.
#️⃣ #python #programming #db
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
1👍20🔥4❤2👌1
خب خب خب WebSocket در Fastapi 🌀
امروز میخوام دربارهی یه موضوع باحال و کاربردی تو دنیای وب حرف بزنم: پیادهسازی WebSocket در FastAPI اگه دنبال ساخت اپلیکیشنهای realtime مثل چت، داشبوردهای زنده یا بازیهای آنلاین هستین، این پست براتون خیلی مفیده. پس با من همراه باشین تا با هم یاد بگیریم WebSocket چیه و چطور میتونیم تو FastAPI ازش استفاده کنیم.
🧠 WebSocket چیه و چرا مهمه؟
WebSocket یه پروتکل ارتباطیه که به کلاینت (مثل مرورگر) و سرور اجازه میده یه ارتباط دوطرفه و همیشگی داشته باشن. برعکس HTTP که فقط یه درخواست میفرستی و یه پاسخ میگیری، WebSocket این امکان رو میده که هر دو طرف هر وقت خواستن پیام بفرستن و بگیرن، بدون اینکه نیاز باشه کلاینت مدام درخواست بفرسته. این برای اپلیکیشنهایی که نیاز به آپدیتهای زنده دارن، مثل چت رومها، اعلانهای realtime یا بازیهای آنلاین، عالیه
🚀 FastAPI و WebSocket
FastAPI یه فریمورک وب مدرن و سریع برای پایتونه. یکی از قابلیتهای باحالش هم پشتیبانی از WebSocketه. FastAPI از Starlette استفاده میکنه (یه فریمورک ASGI سبک و قدرتمند)، و همین باعث میشه بتونیم به راحتی WebSocket رو پیادهسازی کنیم.
🛠 چطوری WebSocket رو تو FastAPI پیادهسازی کنیم؟
برای شروع، باید از کلاس
تو این کد:
به این میگن یه Echo Server ساده هر چی کلاینت بفرسته، سرور عینشو برمیگردونه.
📡 یه مثال پیشرفتهتر: چت روم با WebSocket
حالا بیاین یه چیز باحالتر بسازیم، مثلاً یه چت روم که چندتا کلاینت بتونن بهش وصل بشن و پیامهاشون رو به هم بفرستن. برای این کار، باید اتصالهای فعال رو مدیریت کنیم. یه کلاس به اسم ConnectionManager
اینجا چی داریم؟
ConnectionManager یه کلاسه که اتصالهای فعال رو تو یه لیست نگه میداره.
وقتی کلاینت وصل میشه، به لیست اضافه میشه (connect) و وقتی قطع میشه، حذف میشه (disconnect).
send_personal_message به یه کلاینت خاص پیام میفرسته.
broadcast به همه کلاینتهای وصلشده پیام رو میفرسته.
تو endpoint، پیام کلاینت رو میگیریم، به خودش یه جواب شخصی میدیم و به بقیه هم broadcast میکنیم.
جمعبندی ✍
WebSocket تو FastAPI به شما این امکان رو میده که اپلیکیشنهای realtime و جذاب بسازین. از چت رومها گرفته تا داشبوردهای زنده و بازیهای آنلاین.
خب اینم از این امید وارم مفید بوده باشه :]
➖➖➖➖➖➖➖➖➖
امروز میخوام دربارهی یه موضوع باحال و کاربردی تو دنیای وب حرف بزنم: پیادهسازی WebSocket در FastAPI اگه دنبال ساخت اپلیکیشنهای realtime مثل چت، داشبوردهای زنده یا بازیهای آنلاین هستین، این پست براتون خیلی مفیده. پس با من همراه باشین تا با هم یاد بگیریم WebSocket چیه و چطور میتونیم تو FastAPI ازش استفاده کنیم.
🧠 WebSocket چیه و چرا مهمه؟
WebSocket یه پروتکل ارتباطیه که به کلاینت (مثل مرورگر) و سرور اجازه میده یه ارتباط دوطرفه و همیشگی داشته باشن. برعکس HTTP که فقط یه درخواست میفرستی و یه پاسخ میگیری، WebSocket این امکان رو میده که هر دو طرف هر وقت خواستن پیام بفرستن و بگیرن، بدون اینکه نیاز باشه کلاینت مدام درخواست بفرسته. این برای اپلیکیشنهایی که نیاز به آپدیتهای زنده دارن، مثل چت رومها، اعلانهای realtime یا بازیهای آنلاین، عالیه
🚀 FastAPI و WebSocket
FastAPI یه فریمورک وب مدرن و سریع برای پایتونه. یکی از قابلیتهای باحالش هم پشتیبانی از WebSocketه. FastAPI از Starlette استفاده میکنه (یه فریمورک ASGI سبک و قدرتمند)، و همین باعث میشه بتونیم به راحتی WebSocket رو پیادهسازی کنیم.
🛠 چطوری WebSocket رو تو FastAPI پیادهسازی کنیم؟
برای شروع، باید از کلاس
WebSocket
تو FastAPI استفاده کنیم. بیاین با یه مثال ساده شروع کنیم:from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"پیامت این بود: {data}")
تو این کد:
یه endpoint به اسم /ws
ساختیم.
وقتی کلاینت بهش وصل میشه، سرور با accept()
ارتباط رو قبول میکنه.
بعدش تو یه حلقه پیامهای کلاینت رو میگیره و همونو برمیگردونه.
به این میگن یه Echo Server ساده هر چی کلاینت بفرسته، سرور عینشو برمیگردونه.
📡 یه مثال پیشرفتهتر: چت روم با WebSocket
حالا بیاین یه چیز باحالتر بسازیم، مثلاً یه چت روم که چندتا کلاینت بتونن بهش وصل بشن و پیامهاشون رو به هم بفرستن. برای این کار، باید اتصالهای فعال رو مدیریت کنیم. یه کلاس به اسم ConnectionManager
میسازیم که لیست اتصالها رو نگه داره و بتونیم بهشون پیام بفرستیم یا به همه
broadcast کنیم.
from fastapi import FastAPI, WebSocket
from typing import List
app = FastAPI()
class ConnectionManager:
def __init__(self):
self.active_connections: List[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
async def send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
await manager.send_personal_message(f"تو نوشتی: {data}", websocket)
await manager.broadcast(f"یکی گفت: {data}")
except Exception as e:
print(f"خطا: {e}")
finally:
manager.disconnect(websocket)
اینجا چی داریم؟
ConnectionManager یه کلاسه که اتصالهای فعال رو تو یه لیست نگه میداره.
وقتی کلاینت وصل میشه، به لیست اضافه میشه (connect) و وقتی قطع میشه، حذف میشه (disconnect).
send_personal_message به یه کلاینت خاص پیام میفرسته.
broadcast به همه کلاینتهای وصلشده پیام رو میفرسته.
تو endpoint، پیام کلاینت رو میگیریم، به خودش یه جواب شخصی میدیم و به بقیه هم broadcast میکنیم.
جمعبندی ✍
WebSocket تو FastAPI به شما این امکان رو میده که اپلیکیشنهای realtime و جذاب بسازین. از چت رومها گرفته تا داشبوردهای زنده و بازیهای آنلاین.
خب اینم از این امید وارم مفید بوده باشه :]
#️⃣ #fastapi #backend #python
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
👍11👌5❤3🔥2👏1🤩1
آیا پایتون همیشه کنده؟ 🐢
چیزی که همیشه از زبون همه ی برنامه نویسا میشنویم (مخصوصا جامعه محترم C#) اینه که پایتون خیلی کنده (نسبت به زبان های دیگه هرچند این مقایسه اشتباهه بعضی جاها)
خب اره، درسته پایتون کنده (البته در حالت pure)
توی این پست میخوام بگم که چرا کنده و چجوری میشه سریعش کرد؟
چرا پایتون کنده ؟ 🤓
همونجور که میدونید پایتون به صورت پیشفرض با CPython اجرا میشه، که یه مفسر (interpreter) برای پایتونه و با زبان C نوشته شده. CPython کد پایتون رو به بایتکد (bytecode) تبدیل میکنه و بعد اون رو تو یه ماشین مجازی (VM) اجرا میکنه. این فرایند باعث میشه پایتون نسبت به زبانهای کامپایلشده مثل C یا Rust کندتر باشه، چون
تفسیر خطبهخط انجام میده و به جای کامپایل مستقیم به کد ماشین، پایتون تو زمان اجرا تفسیر میشه.
GIL (Global Interpreter Lock) تو CPython، یه قفل سراسری هست که جلوی اجرای چند نخ (thread) همزمان رو میگیره و برای کارهای multithreading مشکلساز میشه.
داینامیک تایپ بودن پایتون تایپها رو تو زمان اجرا چک میکنه، که یه کم سرعت رو پایین میاره.
ولی خبر خوب اینه که پایتون راه ها و ابزارهایی داره که میتونن این کندی رو برطرف کنن و پرفورمنس رو حسابی بالا ببرن
راه ها و ابزارهایی برای افزایش سرعت 📚
1️⃣ PyPy 🌟
Pypy یه مفسر جایگزین برای پایتونه که از JIT (Just-In-Time Compilation) استفاده میکنه.
و کارکردش اینجوریه که کد پایتون رو به جای تفسیر ساده، تو زمان اجرا به کد ماشین کامپایل میکنه. این یعنی برای حلقهها و عملیات تکراری خیلی سریعتره.
مزیتشم اینه تو بعضی موارد تا ۷ برابر سریعتر از CPython عمل میکنه
و باید توجه داشت باشید برای کدهایی که با C extensionها (مثل NumPy) کار میکنن، کامل سازگار نیست.
2️⃣ Cython ⚡
Cython یه ابزار که کد پایتون رو به C تبدیل میکنه و بعد کامپایلش میکنه.
اینجوری کار میکنه که میتونی تایپهای استاتیک (مثل
و تا چندین برابر سریعتر از CPython میشه، بهخصوص برای محاسبات سنگین.
3️⃣ Numba 🔥
Numba یه کامپایلر JIT برای پایتونه که با دکوریتور
کارکردش اینجوریه که کد پایتون رو تو زمان اجرا به کد ماشین تبدیل میکنه، بدون نیاز به تغییر زیاد تو کدنویسی.
برای حلقهها و محاسبات عددی (مثل کار با آرایهها) تا ۱۰۰ برابر سریعتر میشه
4️⃣ CPython با C Extensions 🛠️
میتونی بخشهای کند پروژت یا جاهایی که به سرعت بالا نیاز داری رو با C بنویسی و به CPython وصل کنی.
اینجوریه که کد C رو به صورت ماژول میسازی و تو پایتون لودش میکنی.
و سرعت C رو با سادگی پایتون ترکیب میکنی. کتابخونههایی مثل NumPy و Pandas از این روش استفاده میکنن.
و در اخر پایتون همیشه کند نیست 🙃
حقیقت اینه که پایتون به تنهایی برای خیلی از کارها به اندازه کافی سریعه، بهخصوص تو پروژههایی که I/O (مثل شبکه یا دیتابیس) گلوگاه اصلیه، نه CPU. ولی وقتی پای محاسبات سنگین وسط میاد، ابزارهایی مثل PyPy، Cython و Numba میتونن پرفورمنس رو چند برابر کنن. مثلاً:
یه حلقه ساده با Numba میتونه از ۵ ثانیه به ۰.۰۵ ثانیه برسه
PyPy تو برنامههای واقعی تا ۷ برابر سرعت رو بالا برده. 🐆
➖➖➖➖➖➖➖➖➖
چیزی که همیشه از زبون همه ی برنامه نویسا میشنویم (مخصوصا جامعه محترم C#) اینه که پایتون خیلی کنده (نسبت به زبان های دیگه هرچند این مقایسه اشتباهه بعضی جاها)
خب اره، درسته پایتون کنده (البته در حالت pure)
توی این پست میخوام بگم که چرا کنده و چجوری میشه سریعش کرد؟
چرا پایتون کنده ؟ 🤓
همونجور که میدونید پایتون به صورت پیشفرض با CPython اجرا میشه، که یه مفسر (interpreter) برای پایتونه و با زبان C نوشته شده. CPython کد پایتون رو به بایتکد (bytecode) تبدیل میکنه و بعد اون رو تو یه ماشین مجازی (VM) اجرا میکنه. این فرایند باعث میشه پایتون نسبت به زبانهای کامپایلشده مثل C یا Rust کندتر باشه، چون
تفسیر خطبهخط انجام میده و به جای کامپایل مستقیم به کد ماشین، پایتون تو زمان اجرا تفسیر میشه.
GIL (Global Interpreter Lock) تو CPython، یه قفل سراسری هست که جلوی اجرای چند نخ (thread) همزمان رو میگیره و برای کارهای multithreading مشکلساز میشه.
داینامیک تایپ بودن پایتون تایپها رو تو زمان اجرا چک میکنه، که یه کم سرعت رو پایین میاره.
ولی خبر خوب اینه که پایتون راه ها و ابزارهایی داره که میتونن این کندی رو برطرف کنن و پرفورمنس رو حسابی بالا ببرن
راه ها و ابزارهایی برای افزایش سرعت 📚
1️⃣ PyPy 🌟
Pypy یه مفسر جایگزین برای پایتونه که از JIT (Just-In-Time Compilation) استفاده میکنه.
و کارکردش اینجوریه که کد پایتون رو به جای تفسیر ساده، تو زمان اجرا به کد ماشین کامپایل میکنه. این یعنی برای حلقهها و عملیات تکراری خیلی سریعتره.
مزیتشم اینه تو بعضی موارد تا ۷ برابر سریعتر از CPython عمل میکنه
و باید توجه داشت باشید برای کدهایی که با C extensionها (مثل NumPy) کار میکنن، کامل سازگار نیست.
2️⃣ Cython ⚡
Cython یه ابزار که کد پایتون رو به C تبدیل میکنه و بعد کامپایلش میکنه.
اینجوری کار میکنه که میتونی تایپهای استاتیک (مثل
int
یا float
) به متغیرها اضافه کنی تا سرعتش بیشتر بشه. بعد Cython این کد رو به C تبدیل میکنه و یه فایل باینری سریع تحویلت میده.و تا چندین برابر سریعتر از CPython میشه، بهخصوص برای محاسبات سنگین.
3️⃣ Numba 🔥
Numba یه کامپایلر JIT برای پایتونه که با دکوریتور
@jit
کار میکنه.کارکردش اینجوریه که کد پایتون رو تو زمان اجرا به کد ماشین تبدیل میکنه، بدون نیاز به تغییر زیاد تو کدنویسی.
برای حلقهها و محاسبات عددی (مثل کار با آرایهها) تا ۱۰۰ برابر سریعتر میشه
4️⃣ CPython با C Extensions 🛠️
میتونی بخشهای کند پروژت یا جاهایی که به سرعت بالا نیاز داری رو با C بنویسی و به CPython وصل کنی.
اینجوریه که کد C رو به صورت ماژول میسازی و تو پایتون لودش میکنی.
و سرعت C رو با سادگی پایتون ترکیب میکنی. کتابخونههایی مثل NumPy و Pandas از این روش استفاده میکنن.
و در اخر پایتون همیشه کند نیست 🙃
حقیقت اینه که پایتون به تنهایی برای خیلی از کارها به اندازه کافی سریعه، بهخصوص تو پروژههایی که I/O (مثل شبکه یا دیتابیس) گلوگاه اصلیه، نه CPU. ولی وقتی پای محاسبات سنگین وسط میاد، ابزارهایی مثل PyPy، Cython و Numba میتونن پرفورمنس رو چند برابر کنن. مثلاً:
یه حلقه ساده با Numba میتونه از ۵ ثانیه به ۰.۰۵ ثانیه برسه
PyPy تو برنامههای واقعی تا ۷ برابر سرعت رو بالا برده. 🐆
#️⃣ #python
➖➖➖➖➖➖➖➖➖
🥷 CHANNEL | GROUP
👌9❤3👍2🔥2