Python Hints
رفتن به کانال در Telegram
Python tips and tricks The Good, Bad and the Ugly توی این کانال فقط قرار هست در مورد core python صحبت کنیم. این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازهکار) Admin: @Abbasi_ai
نمایش بیشتر9 573
مشترکین
+1324 ساعت
+587 روز
+20630 روز
آرشیو پست ها
9 573
پرسیدید چرا نویسنده میگه این مورد appealing هست؟ با اینکه بنظر رفتار خیلی خوبی میاد.
من یک نمونه کد زدم که نشون بدم چرا بد هست این رفتار؛ توی این حالت من بیش از حد سخت گرفتم و همه چیز
NewType هست (یا یک رفتاری رو نباید دنبال کنید یا کل کد باید یک استاندارد رو رعایت کنه)
اولین و مهمترین نکته :
توجه کنید نویسنده همین رفتار یعنی تعریف مداوم تایپ جدید برای نوع دادههای اصلی رو بد میدونه!
اینکه بجای str, bool, int تایپ جدید تعریف کنید که پارامتر ورودی شما بهتر بنظر برسه!
حالا بررسی کنیم خود ایرادات وارده رو:
۱- تعریف نوع دادهای جدید هیچ عملکرد بهتری برای runtime بهم نمیده!
خیلی از افرادی که اینکار رو میکنند برای فرار از تست کردن کدها؛ فرار از نوشتن ولیدیشن؛ فرار از چک کردن پارامترهای ورودی و ... اینکار رو میکنند! این چیزی هست که شخصا بسیار توی این مدل کد زدن دیدم (قطعا هستند افرادی که اینطوری عمل نمیکنند ولی خب من ندیدم)
۲- خط ۹۱ کد رو ببینید؛ هرجایی از کدم که بخوام یک str یا ... رو برای این توابع استفاده کنم حتما باید توی NewType ایی که تعریف کردم بذارمش!
ادامه پست بعدی:9 573
یک نگاهی به مصاحبههای
software engineering بندازید
یا حتی mock interview هایی که موجود هست!
تمام این موارد حداقلای ها هست ولی در سطوح مختلف از شما پرسیده میشه.
در نهایت؛ فکر میکنم از پستهایی که تا به امروز گذاشته شده همه درک کردید!
من پستهام برای
software engineer
شدن هست و کسایی که شاید بودنشون توی این کانال هم اشتباه باشه؛ اما قطعاً خوشحالیم از اینکه هستند:
۱- انواع و اقسام وایب کدر
۲- بطورکلی تر کدرها
۳- هرکسی که نیازی به درک داشتن از کاری که میکنه نداره و فقط میخواد ی چیزی دمو کنه
درنهایت برای سه مورد خاص هم هیچکدوم از مطالب کتابهای بالا نیاز نیست :
۱- دانشجویی که میخواد از شر تسکهای استاد زودتر راحت بشه.
۲- کارمند دولتی که ۱/۳ شرکت خصوصی حقوق میگیره و مدیرانش هم هیچ درکی از هیچی ندارند.
۳- کسی که ایده خوبی داره و کمتر از ۱-۲ هفته وقت داره برای ارائه ایدهاش MVP داشته باشه که کار کنه
اگر توی این ۲ دسته بندی و ۶ مورد نیستید؛ شرمندهام باور کنید یا نه تأکید میکنم!
کتابهایی که گفتم حداقلهایی هست که باید یاد بگیرید تا بهتون بگن Software Engineer9 573
من یک پستی روی لینکدین گذاشتم؛ چندروزه برای ارتباط گرفتن با maintainer های یک پروژهای فعالیتم زیاد شده اونجا و کامنت گذاشتن زیر پستها و ... ازم راجب منبع زیاد سوال شد.
خلاصه؛ یک عکس از کتابهایی که اینجا استوری کردم گذاشتم و توضیح دادم که اکثر فعالیتم توی تلگرام هست، آخر اون متن یک چیزی نوشتم:
این کتابها حداقلهایی هست که باید بخونید تا به خودتون بگید مهندس نرمافزار پایتون!و کامنتی که هیچوقت جواب داده نشد؛ چندنفر سوال کردند گفتم بازم توضیح بدم: اول نگاهی به کتابها بندازیم و دستهبندی کنیم اونارو ؟ من کتاب هوش مصنوعی رو توی لینکدین نذاشتم. کل کتابهایی که معرفی کردم به ۴ دسته تقسیم میشه: ۱- پایتون مقدماتی تا کمی پیشرفته. مگه میشه ضما زبان برنامهنویسی که کد میزنی رو درست نشناسی ؟ ۲- برنامهنویسی async و کمی optimization برای پایتون. واجب هست؛ چون باعث میشه نسبت به رقبای بازار بهتر باشید ۳- ساختمان داده و الگوریتم؛ هرجای استانداردی که برید مصاحبه فنی حداقل چیزی هست که پرسیده میشه ۴- طراحی و معماری نرمافزار و سیستم امکان نداره یک سوال هرچند کوچیک و ساده راجب این موضوع ازتون نشه. پست بعدی
9 573
4: It is appalling. Please, please don't do this.
source: Architecture Patterns with Python
9 573
خیلی وقتا بهم میگن؛ این چیزایی که میگی و تأکید میکنی روش برای کسی که تازه شروع کرده یا داره شروع میکنه خوب نیست، دست انداز میشه دلزده میشه و ....
اولاً من اینارو برای بچههای سطح بالاتر میگم؛ برای تازهکار شنیدنش خوبه ولی لزومی نداره روز اول بره سراغ این موارد.
ولی خب
یک مثال ساده میزنم همه درک کنند؛ زبان انگلیسی خوندن بچههای کوچیک رو دیدید ؟ زیر ۸ سال رو منظورم هست.
اگر سر کلاساشون نشسته باشید، هیچوقت درس دادن گرامر انگلیسی رو نمیبینید! گرامر جزو موارد سخت هست، چیز سخت دلزده میکنه بچه رو
ولی
این دلیل نمیشه معلم گرامر اشتباه استفاده کنه؛ توی طول آموزش بچه گرامر نخونده اصلا ولی موقع صحبت کردن از گرامر درست استفاده میکنه، حتی بعد چند ترم بدون خوندن گرامر پترن گرامر اشتباه رو هم یاد گرفته و اگر جلوش اشتباه بگی بهت میخنده
تست کنید 👆
داستان گیر دادن من هم همین هست؛ کسی که آموزش میده لزومی نداره تمام موارد و جزئیات رو به یک تازهکار بگه اما همین که توی آموزشش اشتباه نگه و از حالات درست استفاده کنه باعث میشه ذهن نیرویی که تربیت میکنه آماده باشه.
در نهایت:
همونطوری که خروجی همهی کلاسهای آموزش زبان انگلیسی، مترجمهای برتر ادبیات کلاسیک انگلیسی نیست و حتی ممکنه فقط
I am a blackboard
ازش در بیاد؛ قرار هم نیست خروجی همه شاگردهای شما Dennis Ritchie باشه، اتفاقاً خیلیهاشون قراره خیلی زود متوجه بشوند اصلا علاقهای به برنامهنویسی ندارند فقط لایک شدن پستای اینستاگرامشون و ویدئو دادن توی یوتیوب براشون مهمه9 573
توی معماری سیستم یک اصطلاحی داریم به اسم؛
distributed monolithic
که خب یک anti-pattern هست برای معماری micro-service اول هفته با یک شرکتی برای مشاوره صحبت کردیم (کارشون رو قبول نکردم ولی یک قرارداد کوچک بستم برای اینکه بگم مشکل فعلی سیستم کجاس)
معماری سیستم مثلاً قرار بوده micro-service باشه؛ در نگاه اول هم هست و حتی از تمام ابزارهای لازم هم داره استفاده میشه اما به اشتباه.
کل سیستم رو امروز کنار هم چیدم و روی یک سرور بالا آوردم (بجای چندتا سرور) و تبدیلش کردم به multi app monolithic اولش خیلی ناراحت و نگران بودند کت پرفورمنس خراب میشه و ازین حرفا ولی بعد توی تستها دیدند که حداقل ۲ برابر سرعت پاسخ و تعداد درخواستهایی که هندل میشه بیشتره.
البته من مطمئن بودم که اینطوری میشه به سه دلیل :
۱- به وضوح anti pattern رو میدیدم
۲- تعداد درخواستهای بین سرویسها زیاد بود
۳- خیلی از زمان پروفایلنگ، برای درخواست بین سرویسها هدر میرفت روی نتورک. (که خب حتی async هم نبود که حداقل cpu هدر نره)
این موضوع دلیلی شد؛ بیام چندتا تعریف اشتباه که دائم میشنوم رو انتقال بدم:
۱- توی ماکروسرویس هر سرویس باید دیتابیس جدا داشته باشه.
این تعریف درسته، اما تفسیر غلط ازش زیاده؛ مثلاً ۹۹٪ فکر میکنند این یعنی برای هر سرویس باید یک سرور Postgres جدا داشته باشند، نه لزوماً مفهوم این تعریف اینه که:
مثلاً سرویس auth شما نره دیتای سرویس payment رو بخونه حتی اگر جفتشون روی یک دیتابیس هستند (فقط دوتا تیبل جداشده) و برای گرفتن دیتای مورد نیازش به سرویس payment درخواست بده
۲- هر تابع، متد یا ... باید single responsibility داشته باشه.
بله درسته، این یکی از موارد مهم هست اما تفسیر اشتباه ازش زیاده، مثلاً:
فرض کنید سرویس payment بالا، بعد از اینکه پرداخت انجام شد باید به بخش انبارداری تیکت بزنیم که پرداخت موفق بوده موجودی رو کم کن، به بخش حسابداری بزنیم که فاکتور صادر شده پرداخت شد و مثلاً به بخش ارسال کالا هم بگیم چیو بستهبندی و ارسال کنه به چه آدرسی ...
اینو دیدم که میگم، به طرف میگم، خب عالی توابع اینکارها رو بذار یکجا داخل یک تابع و درخواست بده اگر مشکلی توی پرداخت پیش اومد همه باهم باید rollback بخوره (توجه به بحث قبل شما حق نداری، تیبل سرویسهای دیگه رو دستکاری کنی)؛ برگشته میگه پس Single Responsiblity چی میشه ؟
یک ساعت داشتم براش توضیح میدم؛ که این تابع SSR رو رعایت میکنه چون تو فقط داری میگی من پول رو پرداخت کردم موفق بود یا نه.
۳- ماکروسرویس بهتره ...
نه چون یک چیزی سختتر هست پیادهسازیش لزوماً بهتر نیست، بسیار بسیار پروژه دیدم که گفتم خب همهی چیزایی که اینا لازم دارن اگر monolithic بود، هم سریعتر بود هم سرعت توسعهاش بیشتر بود هم نیاز به این همه دولوپر نداشت.
چندتا برداشت اشتباه دیگه هم بود که متأسفانه یادم نیست دیگه، ولی تبدیل سیستم به یک monolithic واقعی توی این پروژه نتایج خیلی بهتری داشت.
حتی برای مرحله بعدی هم پیشنهاد کردم اول سراغ
Load balance
و بالا آوردن چندتا instance از همین monolithic برند، بعد برای تبدیل به micro-sercive از یکی که معماری رو واقعاً بلد هست کمک بگیرند نه کسی که پوشه پوشه کردن فایلای پایتونش رو فقط یاد گرفته.
نهایتاً؛ البته من میدونم خیلی از این برداشتهای اشتباه از کجا میاد.
منابع ترجمه شده به فارسی.
ترجمه اشتباه لغوی یک کلمه، باعث میشه معنی یک جمله بطور کامل عوض بشه.9 573
تا همین ماه پیش هم اگر از من راجب کتاب داکر میپرسید، نسخه اول کتاب
Docker in a month of lunches
رو معرفی میکردم؛ نوشتار فوقالعاده و جزئیات به اندازه کافی و البته تصاویر خوب برای انقال نکات مهم.
توی کسانی که نسخه اول رو بهشون معرفی کردم، ندیدم کسی کتاب رو بخونه و درک اشتباه از عملکرد داکر داشته باشه.
حالا نسخه دوم کتاب معرفی شده (برای اونایی که بهونهاشون تغییر دستورات بود)
شخصاً هنوز فرصت نکردم بخونم، اما یک مرور سریع کردم و بنظرم ازین به بعد باید این نسخه رو دنبال کرد.
(راستی قابلیت استوری گذاشتن کانال رو از دست دادیم، اگر کتابهایی که قبلتر معرفی شدند رو خواستید روی اسم کانال بزنید و وارد بخش posts بشید)9 573
دستورات مهم uv, چون درموردش ازم پرسیدید.
تمام پروژههای خودم رو بردم روی این مورد؛ و اکثر پروژههای شرکت که مسئولیت تیم نگهداری و توسعهاش با من هست.
برای دپلویها هم، از
uv تو مرحله build روی Docker استفاده میکنم9 573
Repost from RandRng
#موقت
وسط توضیح برق رفت
utils/preprocessing.py:
def preprocessing(text: str) :
return text.strip()
utils/__init__.py
```python
```
from utils.preprocessing import preprocess
...
cleaned_text = preprocess(text)
...
این میزان کدی هست که باید برنامه نویس بعدی توی ذهنش نگهداره 👆
بجای :
text = input.strip()
حالا اینو ضربدر ۱۰۰ یا ۱,۰۰۰ کنید برای یک پروژه توی اسکیل استاندارد.9 573
Repost from RandRng
خیلی پستهای مختلف میبینم که میگن؛ لایه logic, data, view, .... رو از هم جدا کنید و ازین حرفا (طرف ۲ هفتس کلین کد خونده) که نکته خیلی خوبی هست اما نه همه جا
و خیلی وقتا هم کد دستم اومده که دیدم؛ طرف زده
get_repository بعد این رو گذاشته توی یک پوشه و فایل دیگه
میرم کد رو میخونم میبینم ۱ خط کد نوشته یک return ساده.
این مدل جداسازی مزخرفترین کاری هست که میتونید انجام بدید.
نکتهاش توی کتاب بالا هم هست؛
دولوپر بعدی، بیچاره میشه تا ذهنش رو دور این چیزا سر و سامون بده و متوجه بشه فایلها و ... چطوری به هم ارتباط داره
repository= .....
همون کار رو میکنه؛ ۱۰۰ برابر خواناتر و تمیزتر هست و در صورت رشد کردن کدش؛ توی refactor جدا خواهد شد.
بعضی وقتا آدما برای clean code زدن، گند میزنند توی خوانایی و حتی clean بودن پروژه چرا چون clean code رو فقط در سطح یک اسکریپت بهش نگاه میکنند در سطح کل پروژه.
مثال دیگر:
این رو زیاد میبینم؛
cleaned_text = preprocess(mytext)
بعد میرم توی مسیری که گفته شده:
utils/preprocessing.py
def preprocess(text:str):
return text.strip()
ببین ذهن من چقدر باید اذیت بشه که توی توسعه کدهای بعدی یادش باشه که اینکار رو برای یک strip ساده انجام بده.
حالا فرض کنید یک پروژه ۱ میلیون خط کدی؛ اینطوری نوشته شده باشه!
بنظرتون این پروژه clean code هست یا shit code ؟!
یادتون نره؛ refactor پنالتی نیست، بلکه نشون میده شما به کد و پروژه زیر دستتون اهمیت میدید!
من ترجیح میدم
text = input.strip()
رو داشته باشم و وقتی این تمیز کاری دیتای ورودی بزرگتر شد اونوقت اون رو جدا کنم.9 573
Repost from RandRng
دارم فصل ۱۰ کتاب Rust web programming 3rd edition رو ریویو میکنم، این بخش بهترین نکتهای هست که داره.
9 573
Repost from RandRng
اگر از Docker Desktop استفاده میکنید حتما باید آپدیتش کنید؛ یک vulnerability سطح بالا توی نحوه پیادهسازی داره (آپدیت آخر مشکل رو حل کرده)
https://nvd.nist.gov/vuln/detail/CVE-2025-9074
این مورد باعث میشه با ۲ خط کد بشه تمام موارد امنیتی رو دور زد و به سیستم عامل اصلی دسترسی گرفت.
توی گزارش اصلی فقط ویندوز گفته شده (نمیدونم مک هم داره یا نه)
9 573
ماه دیگه!
شدیدا منتظر انتشار این کتاب هستم.
Python3.11, Django 4اولین بار که 1st edition این کتاب رو میخوندم قبل از این بود که وارد حوزه AI بشم (چندماه قبلتر) و خیلی چیزا ازش یاد گرفتم. امیدوارم 3rd edition هم به همون خوبی باشه.
9 573
شمارو نمیدونم،
ولی من یک تجربه مار گزیدگی دارم.
البته سمی نبود؛ که خب مار پایتون هم سمی نیست. 😂
9 573
پستهای پروفایلینگ 👆👆👆
چون الان
scalene روزم رو نجات داد و توی ۱۵ دقیقه اشتباهات کد async همکارم رو توی code review پیدا کردم، گفتم یک اشاره بکنم به پستهای قدیمی که درمورد profiling بوده
ابزار scalene واقعاً کاربردی و فوقالعاده جذاب و راحت هست.
الان متوجه شدم پست آموزشش رو نذاشتم؛ ولی یادم نیست برای اینکه با متن نمیتونستم توضیح بدم پست نذاشتم
یا اینکه توی شلوغی روزهام فراموشش کردم!
#یادآوری
پست scalene رو روی کدهای Bashutils بذارم 🤔9 573
👆👆👆👆👆
هر ۵ تا کتابی که گفتم + ۱ کتاب هم شما گفتید همرو خوندم.
اگر تا حالا اصلا سراغ FastApi نرفتید و خیلی با مفاهیم بکند هم آشنا نیستید؛ هرکدوم از کتابها که تاریخ 2024 یا 2025 خورده رو میتونید بخونید!
اما اگر ۳ ساعت بیشتر روی
FastApi وقت گذاشتید؛ هیچکدوم از کتابها بدرد شما نخواهد خورد!
داکیومنت FastApi رو بخونید!
داکیومنت ابزارهایی که معرفی کرده رو بخونید مثل celery یا sqlmodel بطور استثنا برای sqlalchemy کتاب خوب داریم (سرچ کنید میاد)
نگاهی هم به اسپانسرهاش و پروژههای open-source که باهاش نوشته شده بندازید که خودش یک دانشگاه هست!9 573
چه تغییرات قشنگی داریم روی؛
PostgreSql 18 شماهم دیدید ؟
برای من سه موردش خیلی جذاب هست؛
اولیش بالاخره؛ Asynchronous I/O بله منم خوندم فعلا فقط روی Read ولی همینم خوبه ۲-۳ برابر سرعت بیشتر اونم مفتی کیه که بدش بیاد ؟
دومیش؛ پشتیبانی کامل از UUIDv7 یعنی بدون دردسر میتونی حتی روی distributed system هم primary key کاملا یونیک داشته باشی.
تازه اگر پستهای قبلی رو دنبال کرده باشید میدونید UUIDv7 برای ایندکس هم عملکرد بهتری داره (مشکلی که خیلی از پروژهها با UUIDv4 داشتند و حالا تقریبا حل شده)
نهایتا یک سری Optimization های خاص که بصورت اتومات کوئری شما رو قبل از اجرا بهبود میده مثلا اگر OR زیاد باشه و بشه با Any تغییرش میده و ...
و یک اشاره هم بکنم به این پست (حدودا همین موقعها ۲ سال پیش):
https://t.me/pyHints/117
هنوزم دیر نشده؛ وقت بذارید براش و درکش کنید!
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
