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

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

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

Admin: @Abbasi_ai
Download Telegram
نوروز این زیباترین جشن ایرانی پیشاپیش بر همگان مبارک.

توی سال جدید
برای وطنم ایران؛ آرزوی آزادی آزادی آزادی و آبادی دارم.

برای مردمم و خودم؛ آرزوی آگاهی آگاهی آگاهی و سلامتی و شادابی دارم.


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

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

منبع تصویر، گوگل سرچ.
82🍾5❤‍🔥3👍2😁2🤷‍♀1👎1🎉1👌1
لطفاً پیام‌های پین شده کانال رو بطور کامل نگاه کنید، قبل از هرگونه سوال و جواب : 🌹

زحمت این پست رو یکی از اعضا کشیدند 🌹

logging :
https://t.iss.one/pyHints/446
https://t.iss.one/pyHints/81
https://t.iss.one/pyHints/127

Dunder methods
https://t.iss.one/pyHints/12
https://t.iss.one/pyHints/14
https://t.iss.one/pyHints/20
https://t.iss.one/pyHints/29
https://t.iss.one/pyHints/43
https://t.iss.one/pyHints/320

Cache
https://t.iss.one/pyHints/30
https://t.iss.one/pyHints/33
https://t.iss.one/pyHints/107


Linux:
https://t.iss.one/pyHints/401
https://t.iss.one/pyHints/258
https://t.iss.one/pyHints/271
https://t.iss.one/pyHints/273
https://t.iss.one/pyHints/347
https://t.iss.one/pyHints/401

Data structer in python:
https://t.iss.one/pyHints/15
https://t.iss.one/pyHints/64
https://t.iss.one/pyHints/115
https://t.iss.one/pyHints/283
https://t.iss.one/pyHints/294
https://t.iss.one/pyHints/373
https://t.iss.one/pyHints/408

Exception :
https://t.iss.one/pyHints/56
https://t.iss.one/pyHints/57
https://t.iss.one/pyHints/58
https://t.iss.one/pyHints/60
https://t.iss.one/pyHints/77
https://t.iss.one/pyHints/367

Dis-Disassembler for Python bytecode:
https://t.iss.one/pyHints/96
https://t.iss.one/pyHints/99


Async:
https://t.iss.one/pyHints/117
https://t.iss.one/pyHints/137
https://t.iss.one/pyHints/150

Profiling:
https://t.iss.one/pyHints/148
https://t.iss.one/pyHints/109
https://t.iss.one/pyHints/146
https://t.iss.one/pyHints/277
https://t.iss.one/pyHints/279
https://t.iss.one/pyHints/280
https://t.iss.one/pyHints/288

decorator:
https://t.iss.one/pyHints/37
https://t.iss.one/pyHints/41
https://t.iss.one/pyHints/47

Duck tpye & dynamic protocl:
https://t.iss.one/pyHints/328
https://t.iss.one/pyHints/331
https://t.iss.one/pyHints/336
https://t.iss.one/pyHints/338

Book &roadmap &video :
https://t.iss.one/pyHints/16
https://t.iss.one/pyHints/101
https://t.iss.one/pyHints/123
https://t.iss.one/pyHints/168
https://t.iss.one/pyHints/194
https://t.iss.one/pyHints/196
https://t.iss.one/pyHints/210
https://t.iss.one/pyHints/223
https://t.iss.one/pyHints/231

Income:
https://t.iss.one/pyHints/50
https://t.iss.one/pyHints/87
https://t.iss.one/pyHints/394

Package management:
https://t.iss.one/pyHints/73
https://t.iss.one/pyHints/402

Experiments:
https://t.iss.one/pyHints/85
https://t.iss.one/pyHints/93
https://t.iss.one/pyHints/108

Standard file for software and backend developers:
https://t.iss.one/pyHints/178
https://t.iss.one/pyHints/180
https://t.iss.one/pyHints/181
https://t.iss.one/pyHints/186
https://t.iss.one/pyHints/190

Other important post:
https://t.iss.one/pyHints/111
https://t.iss.one/pyHints/27

#summary #all_in_one_1402
😍8131👍20🙏4🎉3❤‍🔥1👏1
#خارج_از_بحث

توی این مدت تعطیلی ( فقط ۴ ساعت در روز, تسک داشتم ) ۲ تا پروژه جالب رو دنبال کردم که نتایجش برام جذابتر بود ؛

1- Rust
روی rust-lang خودم رو آپدیت کردم، یک سری از موارد که خوب درک نکرده بودم برام خیلی خیلی بهتر جا افتاد و دلیلش رو متوجه شدم، همین بحث رو دارم ادامه میدم و برای آخر فروردین یک مصاحبه هم برای خودم رزرو کردم.

البته این وسطا ۱۵ فروردین یک مصاحبه هم دارم ولی هدف گذاریم مصاحبه آخر فروردین هست.

اگر علاقه داشتید، این کانال من هست درحال یادگیری هستم و خیلی خوبه همین اول کار یک کامیونیتی خوب کنار خودم داشته باشم :
https://t.iss.one/pyrust

خوندن بخش‌هایی از کرنل لینوکس (نسخه جدید) و بخش‌هایی از سورس کد گیت (نسخه‌ای که با Rust داره بازنویسی می‌شه, غیر رسمی) جزو اهداف بعدیم هستند.

2-droidian

خیلی وقته گوشی فعلیم رو دارم (۵-۶ سال)، دروغ چرا فوق‌العاده ازش رضایت دارم ولی software update براش تموم شده و چند وقت دیگه security هم تموم میشه.

خودم چندتا Distribution مختلف رو روش تست کردم، اما دیگه مراقبت ازش وقت زیادی میگیره.
تصمیم گرفتم اگر امسال Nothing phone 3 با مشخصات flagship معرفی شد عوضش کنم (اگر نشد ۱ سال دیگه صبر کنم).
و توی تعطیلات داشتم به این فکر میکردم که این دستگاه همه‌ی قابلیت‌های خوب رو داره و حیف هست که همینطوری بذارمش توی کمد (همه‌ی دیوایس‌هام رو نگه میدارم)
برای همین به ذهنم رسید روش لینوکس نصب کنم و service های ساده‌ای که دارم برای اتوماسیون کدها و ... رو روی این دستگاه بیارم (خیلی از raspberry pi ایی که دارم قویتر هست، ۱۲ گیگ رم، ۵۱۲ گیگ حافظه و ...)

روی یک گوشی قدیمی‌تر (برای یکی از دوستان) بررسی کردیم و نتایج عالی بود.

https://droidian.org/

گفتم اگر شما هم مثل من گوشی قدیمی دارید، بد نیست به این پروژه سر بزنید‌.
مخصوصاً اگر کلی پروژه و سرویس برای مانیتور کردن دارید (مثلاً مدل هوش مصنوعی)
یا میخواید، از راه دور سیستم رو روشن کنید یا ...
👍376😍3🌚2🆒1🦄1
یکسال از زمانی که اولین پست کانال رو گذاشتم گذشت ( پیام‌های پین شده؛ معرفی خودم و هدف کانال )
به لطف خیلی از شما عزیزان و با به اشتراک گذاری پست‌ها کانال بدون هیچ تبلیغاتی حالا به بیش از 4k عضو رسیده.

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

چیزی که من رو شدیدا جذب ادامه نوشتن مطالب می‌کنه همین موضوع هست؛ توی این ۱ سال با آدم‌های زیادی آشنا شدم؛ شاید هیچ سود و منفعت مالی برای هم نداشتیم اما صحبت با شما برای من بسیار ارزشمند و بسیار جذاب بوده
راجب موضوعات لذت بخشی صحبت کردیم و بسیار بسیار مطالب و دید جدید گرفتم از شما عزیزان.

حالا چرا این مطلب رو دارم می‌نویسم ؟
هم انگیزه هم ترس.
روز اولی که کانال رو راه اندازی کردم؛ با خودم فکر میکردم فقط و فقط مطالب سطح advance و بدون توضیحات مقدمات طوری که هر پست کمتر از ۱ ساعت وقت بگیره.
اما الان که داشتم پست جدیدی رو آماده می‌کردم؛ دیدم نمی‌تونم بدون توضیح بخش‌های دیگر (ابزار دیگری) کد رو بذارم و آموزش به ۷ آموزش دیگه تقصیم شد. (این شد ترس؛ دیگه آماده سازی هیچ پستی ۱ ساعته نخواهد بود.)

اما بسیار هم خوشحالم؛ با چندتا از شما عزیزان توی این تعطیلات صحبت داشتم و وقتی به چت‌های روزهای اول نگاه می‌کنم تغییرات بسیاری رو می‌بینم؛ پیشرفت و انتخاب مسیر درست و این من رو بسیار خوشحال می‌کنه چون هدفم از روز اول همین موضوع بود.

همین پیشرفت شما باعث شد موضوعاتی رو بحث کنیم که شاید قبل از این ۱ در ۱۰۰۰ فرصتش برام پیش میومد تا بحث کنم راجبش و بعضی صحبت‌ها و سوالات باعث شد شخصا بسیار بسیار یاد بگیرم.

برای سال جدید مسیر کانال شاید کمی متفاوت باشه؛ کمی وارد جزئیات میشم توی پست‌ها.
خوانش گروهی کتاب رو بجای محدود کردن به ۱۰۰-۲۰۰ عضو و بر اساس فایل‌هایی که گروه اول درست کردند پیش خواهم برد.
سعی می‌کنم ارائه‌ها با خودم باشه؛ و بعد از هر جلسه گوگل میت؛ ویدئو ارائه روی یوتیوب قرار بگیره و بصورت همزمان بعد از اتمام کتاب توسط گروه اول با بعضی از اعضا سراغ کتاب‌های موضوعی بریم:
Django, Pytorch, Deep learning, ...
و به همین ترتیب ادامه بدیم.

امیدوارم سال جدید هم؛ موضوعات و کانال و روش ارائه به اندازه سال قبل و حتی بیشتر مفید باشه.

درنهایت؛ مرسی از همگی.

پ.ن : هر پیشنهاد یا انتقادی دارید. حتماً بهم بگید، قطعاً هرچیزی که باعث پیشرفت اعضا باشه
من رو هم خوشحال خواهد کرد ☺️
99👍23❤‍🔥4🙏3🍾3👎2
یکی از پروژه‌های شرکت دستم رسیده؛ پروژه بزرگی هم هست که با FastAPI توسعه داده شده و نیاز به code review , ... داره.

توی کدها که داشتم بررسی میکردم تیم توسعه یک پوشه درست کرده (مثل چیزی که توی Django حا افتاده و چقدرم من بدم میاد ازش) و همه چیز رو شکونده توی ۱۲ تا اسکریپت پایتون بعد توی بخش‌های مختلف test, dev, prod اومده این‌هارو patch کرده و ...
ندید باید بگید که کثیف هست؛ من پروژه‌های django رو هم نمیذارم تیمم این کار رو بکنه که خب جاش اینجا نیست.

هرکسی هم که با من کار کرده می‌دونه برای چیزهای کوچیک اصلا دوست ندارم از پکیج‌های آماده استفاده کنم اما توی پروژه FastAPI و هر پروژه‌ای که pydantic رو دارید استفاده می‌کنید بد نیست که بجای اینکه همه چیز رو دستی کد بزنید از
pydantic-settings
استفاده کنید.

توی تصویر دوتا فایل رو داریم؛ sample.env نقش راهنما رو داره و .env (من همه حالاتش رو روی سیستمم میذارم ولی در واقعیت شما فقط برای ENV_STATE مورد نظر خودتون تنظیمات رو قرار میدید)

ادامه پست بعدی
👍21❤‍🔥4
Python Hints
یکی از پروژه‌های شرکت دستم رسیده؛ پروژه بزرگی هم هست که با FastAPI توسعه داده شده و نیاز به code review , ... داره. توی کدها که داشتم بررسی میکردم تیم توسعه یک پوشه درست کرده (مثل چیزی که توی Django حا افتاده و چقدرم من بدم میاد ازش) و همه چیز رو شکونده توی…
توی پست قبلی زیر 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

ادامه پست بعدی.
👍15❤‍🔥5
Python Hints
توی پست قبلی زیر sample.env خروجی دستور tree رو هم گذاشتم (نباید اینجا باشه) فقط گفتم شاید توی مثال‌های بعدی لازم شد. اما مهمترین فایل این مثال config.py هست. راجب lru_cache قبلا صحبت کردیم؛ اما بطور خلاصه بخوام یادآوری کنم. اگر یک تابع در طول پروژه مقدار…
خط ۱۴ تا ۱۹:
همیشه اسمش رو Global بهش میدم تا همه بچه‌های تیم بدونند تحت هر ENV_STATE ایی که باشه این تنظیمات برای پروژه واجب هست.
و بعد از این برای هر ENV_STATE یک کلاس جداگونه تعریف میشه؛ بعضی‌ موارد ممکنه مقدار default داشته باشند مثل MONGO_DBNAME توی کلاس DevConfig (دوباره برمیگردم سراغش). اما توی خط بعدی
SettingsConfigDict(env_prefix="DEV_")
چیزی که خیلی مهم هست env_prefix هست که میگه اسم‌های هرکدوم از تنظیمات لازم که توی Global تعریف شده اگر اولش DEV_ داشت توسط این کلاس هندل میشه؛ زیاده روی هست ؟ شاید باشه ولی اینطوری مطمئن میشم طرف بیشتر حواسش جمع هست موقع ساخت .env همین کار رو برای موارد دیگه هم انجام میدم. من case_sensitive رو True نمیذارم هیچوقت (شاید یکی حال نمی‌کنه از کاراکترهای uppercase استفاده کنه توی .env )

خط ۳۶ تا ۴۷:
همونطور که گفتم من هرجا تابعی دارم که return value ثابتی رو خواهد داشت یا حتی input argument های محدودی داره که همیشه return value خاص خودشون رو تولید می‌کنند از lru_cache استفاده می‌کنم که سربار کمتری روی سیستم و پردازش داشته باشه (بیشتر نمیگم چون قبلا راجبش صحبت‌ کردم؛ مثالش توی نجات پروژه رو هم زدم)
توی این تابع بر اساس مقداری که BaseConfig از .env برای ENV_STATE خواهد گرفت class معادلش رو صدا میزنم.
اما برای اینکه مطمئن بشم مقدار ENV_STATE برای مثلا DEV در صورت وجود DEV_ENV_STATE خونده نمی‌شه موقع ساخت instance اینکارو کردم :
return DevConfig(ENV_STATE="development")
که یعنی مهم نیست یوزر چی خواسته یا اینکه اصن تعریف کرده یا نه باید development باشه ENV_STATE ایی که از DevConfig میاد.

حواستون باشه ENV_STATE , DEV_ENV_STATE تنظیمات متفاوتی هست از نظر کدهای بالا بخاطر env_prefix هرچیزی که env_prefix درست رو نداشته باشه بی‌اهمیت میشه توی اون کلاس.

print(settings.model_dump())
وظیفه model_dump بازگردان خروجی بصورت dictionary هست همون کار
settings.dict()
رو می‌کنه که اتوی آپدیت‌های بعدی قرار هست deprecate بشه.

شمارو نمی‌دونم ولی من این تنظیم رو به شکوندن فایل‌ها به ۱۲ تا فایل بیس و بعدم monkey patch برای هر environment ترجیح میدم.

اما اگر تنظیمات بسیار زیادی داشتید؛ می‌تونید ازین حالت هم استفاده کنید :
├── config
│ ├── base.py
│ ├── dev.py
│ ├── __init__.py
│ ├── prod.py
│ └── test.py


و توی init تابع get_config , settings رو داشته باشید :
from functools import lru_cache

from config.base import BaseConfig, BaseSettings
from config.dev import DevConfig
from config.prod import ProdConfig
from config.test import TestConfig


@lru_cache()
def get_config(env_state: str | None) -> GlobalConfig:
try:
match env_state.casefold(): # type: ignore
case "production" | "prod":
return ProdConfig(ENV_STATE="production") # type: ignore
case "test":
return TestConfig(ENV_STATE="test") # type: ignore
case _:
return DevConfig(ENV_STATE="development") # type: ignore
except AttributeError:
return DevConfig(ENV_STATE="development") # type: ignore


settings = get_config(BaseConfig().ENV_STATE)


موقع استفاده هم یوزر راحت هست :
from myproject.config import settings


بنظرم این مورد هم حتی تمیزتر هست.‍‍‍
👍17❤‍🔥41
Python Hints
توی پست قبلی زیر sample.env خروجی دستور tree رو هم گذاشتم (نباید اینجا باشه) فقط گفتم شاید توی مثال‌های بعدی لازم شد. اما مهمترین فایل این مثال config.py هست. راجب lru_cache قبلا صحبت کردیم؛ اما بطور خلاصه بخوام یادآوری کنم. اگر یک تابع در طول پروژه مقدار…
یک اشتباهی توی این تصویر هست (توی پست بعدیش درست کردم) خط ۳۷ type خروجی باید GlobalConfig باشه یعنی حالت درستش این هست :
def get_config(env_state: str | None) -> GlobalConfig:


پست خودش به محدودیت تعداد خط رسیده بود مجبور شدم ی پست جدید بزنم.
7❤‍🔥5👌4👍1
همین ابتدا بگم این مثال ایراد فنی داره :
connection
باید داخل
try, except, finally
باشه و این موضوع که هربار connection جدیدی به دیتابیس ایجاد بشه هم چیز خوبی نیست اما مثال خوبی برای آموزش هست:
from contextlib import
contextmanger


میخوام راجب contextmanager صحبت کنم؛ وقتی میخوایم ی context manager توی پایتون بسازیم باید پروتوکل درستش رو رعایت کنیم؛ یعنی یک کلاسی بنوسیم که
__enter__, __exit__
رو داشته باشه؛ توی همین کدهایی که داشتم review میکردم کلی کلاس دیدم که هیچ کار خاصی نمیکرد جز اینکه همین ۲ تا متد رو پیاده سازی کنه.

اگر شما هم شرایط مشابه‌ایی داشتید از
contextmanager decorator
استفاده کنید؛ کافیه یک تابع بصورت generator بنویسید هرچیزی قبل از yield میشه __enter__ و خود yield مقداری هست که
with connect_to_mongodb() as db
برای db (آنچه که بعد از as) میاد بر میگرده و وقتی کار contextmanager شما یا همون with تموم شد generator شما چیزی که بعد از yield اومده رو بعنوان __exit__ اجرا خواهد کرد.

from contextlib import asynccontextmanger
هم مورد مشابهی هست برای مواردی که
__aenter__, __aexit__
رو داریم.
👍15❤‍🔥51
بزرگترین تغییری هم که توی پروژه‌ای که دارم review میکنم لازمه اینه که pymongo حذف بشه؛ موقع کد زدن روی FastAPI تا جای ممکن باید از کتابخونه‌های async استفاده کرد که به اندازه کافی از مزایا بهره ببریم؛ برای مانگو

Motor Github
👍11👌112❤‍🔥2👨‍💻1
اصلاً همه چیز این روزها عجیب شده؛
۹۰٪ آگهی‌هایی که میاد اینطوری شده (چرا سر و ته نداره این آگهی یا چرا انگار شغل چندنفره هست ؟)، این مورد رو نه

ولی موارد دیگری رو تست کردم؛ به طرف میگم ایمیل شرکت رو بدید رزومه بفرستم.
نگم دیگه به چی ختم میشه، بعضی‌ها که درخواست پرداخت برای معرفی هم می‌کنند.

بعد چرا توسعه دهنده‌های AI, Python این پست‌‌هارو لایک می‌کنند ؟
چرا باید شبکه افراد کانکت شده با این مشاغل رو داشته باشند ؟
و اوکی دارند، چرا باید به scam بودن این آگهی‌ها شک نکنید و برعکس پروموت هم بکنیدش ؟

لینکدین جامعه فارسی فقط برای من مزخرف شده یا برای شما هم شده ؟
👍31🤔11😁2
Python Hints pinned «لطفاً پیام‌های پین شده کانال رو بطور کامل نگاه کنید، قبل از هرگونه سوال و جواب : 🌹 زحمت این پست رو یکی از اعضا کشیدند 🌹 logging : https://t.iss.one/pyHints/446 https://t.iss.one/pyHints/81 https://t.iss.one/pyHints/127 Dunder methods https://t.iss.one/pyHints/12 https://t.iss.one/pyHints/14…»
#خارج_از_بحث

خبرهارو نمی‌دونم خوندید یا خیر؛ اما ردیس توی ی حرکت عجیب غریب لایسنس‌اش رو عوض کرد طوری که صدای همه رو درآورد.
حالا الان داشتم خبر‌ها رو بررسی میکردم دیدم The Linux Foundation اومده ی پروژه بر اساس آخرین نسخه Redis و کاملا OpenSource منتشر کرده به اسم Valkey و تقریبا هم بسیار سریع داره پیشرفت می‌کنه
contribution, community, github star, ...

منتظر هستم اولین ایمیج رسمی داکر رو منتشر کنند + اولین نسخه ردیس با لایسنس جدید برای همه به نوعی اجباری بشه.


پ.ن : شما که غریبه نیستید؛ حتی منتظر ی نسخه با باگ خیلی کمتر روی Rust هم هستم.

Valkey Github
❤‍🔥15👍3👏1🍓1
#موقت
برای سازمان سنجش :

از صبح ۷-۸ نفر از آشناها که جوان کنکوری دارند تماس گرفتند

درجا جواب دادم: شماره پلاک و طبقه خونه رو به عدد ننویسید، به حروف تایپ کنید.

خواستم بگم برنامه‌نویس سازمان سنجش هر کسی که هستید؛ منطق فکری‌ات چی بوده واقعاً ؟

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

پ.ن :
چیزی که فکر می‌کنم، سازمان سنجش یک پیغام گذاشته و نوشته که از ()، - ، _ و ... استفاده نکنید توی آدرس
احتمالاً توی بکند رنج دادند برای regex و این رنج روی حروف فارسی هست.مثل انگلیسی :
[A-Z]
رو همین حساب اعداد رو قبول نمی‌کنه 😂😂
😨53😁25🌚4🤔1🗿1🙊1
به بهانه معرفی فریمورک <جای‌خالی> با ۳ برابر سرعت در پاسخگویی نسبت به FastAPI و البته باهدف battery included بودن مثل django

وقتی صحبت از بکند توی پایتون میشه تا همین چندسال قبل تنها گزینه خوب فقط و فقط django بود و مرسی دولوپرهاش؛ تو زمانی که همه غر میزدند پایتون کند هست و نباید و ... (تو ایرانم ازین حرفا زیاد بود) قشنگ یادمه ی بنده خدایی اسم نمیبرم ولی معروفم هست توی یکی از دانشگاها پنل سخنرانی داشت.
گفت که پایتون فقط یک جو هست و خیلی زود هم تموم می‌شه؛ بعد هم ادعا کرد به همین دلیل مطالبش رو نیاورده و ترجیح میده راجب مطالب مهمتر صحبت کنه (سخنرانی به شوخی گذشت و تنها کسی که اعتراض کرد توی سالن ۳۰۰-۴۰۰ نفری من بودم) الان شنیدم همون بنده خدا داره از پایتون نون میخوره و دوره هم میذاره.

بگذریم اومد جلوتر و async معرفی شد؛ هوش مصنوعی از فقط ریسرچ بودن داشت خارج میشد و تجریه دپلوی مهم شد.
دپلوی رو django انقدر سخت و غیر بهینه بود که عملا خیلی از تیم‌هایی که پروژه‌هاشون مشتری کافی رو داشت مجبور به توسعه بکند توی زبان‌های برنامه نویسی دیگه بودند؛ خیلی از بچه ها رفتند سراغ C, C++ , Go-lang و ...
حتی جوگیری زیاد شد مدل هارو سمت وب و موبایل و ... هم بردند که صحبتی نیست.

یادی کنم از شب زنده داری‌ها و دپلوی کدها و مدل‌ها با Majid A.M (آیدی نمیزارم ولی احتمالا هرکی django کار می‌کنه میشناسه) عزیز و حجم اپتیمایز‌های بالا جزو اولین نفرات و تیم‌هایی بودیم که کل مدل هوش مصنوعی و اپتیمایز و وب و ... همه روی پایتون بود و البته دسترسی و درخواست رایگان (این برای زمانی بود که همه میرفتن سراغ C, ... برای دپلوی و کسی باورش نمیشد بشه مدل‌های سنگین رو روی سرور بیاری و اون تعداد ریکوست رو با پایتون جواب بده) اون زمان همه فکر میکردند روی سرورهای خفن و ...هستیم ولی این موضوع رو اولین بار هست دارم اعلام می‌کنم؛
۲ نسخه اول مدل‌های پردازش تصویرمون روی کلاستر رزپبری پای و نسخه آخر روی لپ‌تاپ شخصی بنده بود.

ازین دوران گذشتیم flask با ایده‌های جدید اومد و خوبیش این بود که دیگه به اندازه django سنگین نبود (برای تست‌های کوچیک خیلی جواب بود ولی بازم همون مشکلات رو داشت)
البته اضافه کنم سرویس‌هایی مثل Celery, ... خیلی از مشکلات رو توی django حل می‌کردند

بعد از این زمان FastAPI معرفی شد؛ روی همون کامیت‌های اولیه که عمومی شد چون از بچه‌ها و همکارای بکندم توی شرکت‌های سیلیکون‌ولی و ... بسیار راجبش شنیدم به خیلی از دوستان بکند دولوپرم پیشنهاد کردم که وقتش هست یاد بگیرند و بهش کد donate کنند (کاش خودم اینکارو میکردم) خیلی هم مسخره میکردند. همون Majid A.M جزوشون بود.

به لطف همه‌ی دولوپرهای پروژه‌های قبلی django - flask - fastapi حالا خیلی‌ها باور دارند پایتون می‌تونه توی پروداکشن و برای پروژه‌های بزرگ استفاده بشه؛ خیلی‌ها قبول دارند که میشه با پایتون کد زد و از پکیج‌هایی استفاده کرد که سرعت پردازش بسیار بیشتر بشه .
دولوپرهای پروژه‌های قبلی نشون دادند که توسعه پکیج‌هایی با ایده‌هایی حتی کمی بهتر بسیار ارزش داره و جامعه پایتون همیشه قدردان این زحمات خواهد بود.

تا اینجا که حالا community زبانی مثل Rust برای توسعه یک web framework با سرعت بیشتر و البته به راحتی موارد قبلی برای Python وارد شده و پروژه Robyn رو به حد خوبی رسونده بطوری که امروز توی چندین جلسه مختلف با دوستان و همکاران بسیار درمورد این پروژه شنیدم.
توی مطالبی که داشتم میخوندم و بنچمارک‌هایی که از باقی شنیدم اکثرا اشاره می‌کنند که به راحتی سرعتی ۳ برابر fastapi رو ارائه میده.
از نظر کدهم شخصا یک نگاهی انداختم به همون سادگی هست؛ خلاصه که شمارو نمی‌دونم اما شخصا فکر کردم باید قدردان زحمات تیم‌های توسعه django, flask, fastapi و برو بچه هایی که توی دوران سخنرانی ضد سرعت و ... پایتون با این زبان برنامه نویسی ادامه دادند باشم.
👍7010😍4❤‍🔥2🤪2🆒2🐳1
قشنگ Meme شدم :


رفتم مصاحبه Rust دادم،
بعنوان Senior Python Engineer قرارداد بهم دادند.
😁164🗿10👾7🤓5😢4🔥3❤‍🔥1🌚1🤪1