Sadra Codes
Открыть в Telegram
Sadra Yahyapour ✌️ Let's dive deeper together. :) imsadra.dev github.com/lnxpy linkedin.com/in/sadra-yahyapour x.com/lnxpylnxpy lnxpylnxpy@gmail.com
Больше3 610
Подписчики
+1024 часа
+497 дней
+16030 день
Загрузка данных...
Похожие каналы
Облако тегов
Входящие и исходящие упоминания
---
---
---
---
---
---
Привлечение подписчиков
июнь '26
июнь '26
+207
в 3 каналах
май '26
+39
в 2 каналах
Get PRO
апрель '26
+57
в 0 каналах
Get PRO
март '26
+22
в 0 каналах
Get PRO
февраль '26
+162
в 1 каналах
Get PRO
январь '26
+14
в 0 каналах
Get PRO
декабрь '25
+24
в 1 каналах
Get PRO
ноябрь '25
+57
в 1 каналах
Get PRO
октябрь '25
+65
в 0 каналах
Get PRO
сентябрь '25
+54
в 1 каналах
Get PRO
август '25
+57
в 0 каналах
Get PRO
июль '25
+72
в 1 каналах
Get PRO
июнь '25
+63
в 0 каналах
Get PRO
май '25
+60
в 0 каналах
Get PRO
апрель '25
+47
в 0 каналах
Get PRO
март '25
+88
в 8 каналах
Get PRO
февраль '25
+62
в 6 каналах
Get PRO
январь '25
+159
в 2 каналах
Get PRO
декабрь '24
+204
в 5 каналах
Get PRO
ноябрь '24
+267
в 4 каналах
Get PRO
октябрь '24
+182
в 3 каналах
Get PRO
сентябрь '24
+182
в 5 каналах
Get PRO
август '24
+253
в 10 каналах
Get PRO
июль '24
+105
в 3 каналах
Get PRO
июнь '24
+392
в 7 каналах
Get PRO
май '24
+151
в 7 каналах
Get PRO
апрель '24
+126
в 7 каналах
Get PRO
март '24
+126
в 5 каналах
Get PRO
февраль '24
+143
в 5 каналах
Get PRO
январь '24
+166
в 2 каналах
Get PRO
декабрь '23
+229
в 8 каналах
Get PRO
ноябрь '23
+63
в 2 каналах
Get PRO
октябрь '23
+23
в 0 каналах
Get PRO
сентябрь '23
+90
в 0 каналах
Get PRO
август '23
+206
в 0 каналах
Get PRO
июль '23
+85
в 0 каналах
Get PRO
июнь '23
+122
в 0 каналах
Get PRO
май '23
+225
в 0 каналах
Get PRO
апрель '23
+279
в 0 каналах
Get PRO
март '23
+214
в 0 каналах
Get PRO
февраль '23
+32
в 0 каналах
Get PRO
январь '23
+80
в 0 каналах
Get PRO
декабрь '22
+97
в 0 каналах
Get PRO
ноябрь '22
+12
в 0 каналах
Get PRO
октябрь '22
+115
в 0 каналах
Get PRO
сентябрь '22
+15
в 0 каналах
Get PRO
август '22
+16
в 0 каналах
Get PRO
июль '22
+27
в 0 каналах
Get PRO
июнь '22
+26
в 0 каналах
Get PRO
май '22
+24
в 0 каналах
Get PRO
апрель '22
+20
в 0 каналах
Get PRO
март '22
+72
в 0 каналах
Get PRO
февраль '22
+5
в 0 каналах
Get PRO
январь '22
+2
в 0 каналах
Get PRO
декабрь '21
+2
в 0 каналах
Get PRO
ноябрь '21
+4
в 0 каналах
Get PRO
октябрь '21
+4
в 0 каналах
Get PRO
сентябрь '210
в 0 каналах
Get PRO
август '21
+2
в 0 каналах
Get PRO
июль '21
+2
в 0 каналах
Get PRO
июнь '21
+7
в 0 каналах
Get PRO
май '21
+4
в 0 каналах
Get PRO
апрель '21
+6
в 0 каналах
Get PRO
март '21
+5
в 0 каналах
Get PRO
февраль '21
+3
в 0 каналах
Get PRO
январь '21
+3
в 0 каналах
Get PRO
декабрь '20
+720
в 0 каналах
| Дата | Привлечение подписчиков | Упоминания | Каналы | |
| 28 июня | +6 | |||
| 27 июня | +11 | |||
| 26 июня | +11 | |||
| 25 июня | +12 | |||
| 24 июня | +8 | |||
| 23 июня | +6 | |||
| 22 июня | +7 | |||
| 21 июня | +6 | |||
| 20 июня | +8 | |||
| 19 июня | +3 | |||
| 18 июня | +6 | |||
| 17 июня | +5 | |||
| 16 июня | +4 | |||
| 15 июня | +13 | |||
| 14 июня | +5 | |||
| 13 июня | +15 | |||
| 12 июня | +15 | |||
| 11 июня | +15 | |||
| 10 июня | +6 | |||
| 09 июня | +8 | |||
| 08 июня | +8 | |||
| 07 июня | +10 | |||
| 06 июня | +3 | |||
| 05 июня | +3 | |||
| 04 июня | +8 | |||
| 03 июня | +5 | |||
| 02 июня | 0 | |||
| 01 июня | 0 |
Посты канала
آیا pass بهتره یا ...؟
هر دو باعث میشن این کد بدون خطا اجرا بشه:
def foo():
pass
یا
def foo():
...
اما تفاوتشون چیه؟
عبارت pass یعنی «هیچ کاری انجام نده».
عبارت ... یعنی «اینجا عمداً هنوز پیادهسازی نشده».
به همین دلیل توی پروژههای بزرگ، فایلهای Stub (`.pyi`) و بعضی کتابخونهها مثل FastAPI، Pydantic یا ابزارهای Type Hinting بیشتر ... رو میبینی تا pass.
منبع: https://blog.imsadra.dev/ellipsis-in-python-the-mysterious-three-dots
Join 👉 @lnxpylnxpy| 2 | سه نقطه (...) در پایتون فقط برای زیبایی نیست!
احتمالاً جایی در کدهای پایتون این مورد رو دیدی:
def process_data():
...
این سه نقطه در پایتون یک آبجکت واقعی به اسم Ellipsis هست، نه یک تریک یا کامنت.
>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
خیلیا فکر میکنن ... همون pass هست، اما این دو تا دقیقاً یکی نیستن.
درواقع pass فقط یک statement خالیه، ولی ... یک آبجکت واقعی از نوع ellipsis محسوب میشه و کاربردهای بیشتری داره.
منبع: https://blog.imsadra.dev/ellipsis-in-python-the-mysterious-three-dots
Join 👉 @lnxpylnxpy | 299 |
| 3 | pass یا `...`؛ کدوم بهتره؟
هر دو باعث میشن این کد بدون خطا اجرا بشه:
def foo():
pass
یا
def foo():
...
اما تفاوتشون چیه؟
* pass یعنی «هیچ کاری انجام نده».
* ... یعنی «اینجا عمداً هنوز پیادهسازی نشده».
به همین دلیل توی پروژههای بزرگ، فایلهای Stub (`.pyi`) و بعضی کتابخونهها مثل FastAPI، Pydantic یا ابزارهای Type Hinting بیشتر ... رو میبینی تا pass. | 1 |
| 4 | سه نقطه (`...`) در پایتون فقط برای زیبایی نیست!
احتمالاً جایی در کدهای پایتون این مورد رو دیدی:
def process_data():
...
این سه نقطه در پایتون یک آبجکت واقعی به اسم Ellipsis هست، نه یه کامنت یا تریک خاص.
>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>
خیلی از برنامهنویسها فکر میکنن ... همون pass هست، اما این دو تا دقیقاً یکی نیستن.
pass فقط یک statement خالیه، ولی ... یک آبجکت واقعی از نوع ellipsis محسوب میشه و کاربردهای بیشتری داره.
pass یا `...`؛ کدوم بهتره؟
هر دو باعث میشن این کد بدون خطا اجرا بشه:
def foo():
pass
یا
def foo():
...
اما تفاوتشون چیه؟
* pass یعنی «هیچ کاری انجام نده».
* ... یعنی «اینجا عمداً هنوز پیادهسازی نشده».
به همین دلیل توی پروژههای بزرگ، فایلهای Stub (`.pyi`) و بعضی کتابخونهها مثل FastAPI، Pydantic یا ابزارهای Type Hinting بیشتر ... رو میبینی تا pass. | 1 |
| 5 | من از این متدها واسه مقابله با burnout استفاده میکنم همیشه. :)
✅ چند روز واقعاً از کار فاصله بگیر. نه اینکه فقط لپتاپ رو ببندی و همچنان به تسکها فکر کنی.
✅ خواب، ورزش، موسیقی و فعالیتهای خارج از کار رو جدی بگیر. اینها لوکس و لاکچریبازی نیست؛ بخشی از ریکاوریه.
✅ حجم مسئولیتهات رو کمتر کن. بعضا مشکل از خودت نیست، از بار کاری غیرمنطقیه که روی دوشت قرار داره.
✅ برناوت در سکوت و تنهایی بدتر میشه. پس اگه دوست، رفیق یا پارتنر داری، باهاش در تعامل باش.
✅ قبل از تصمیمهای بزرگ مثل استعفا یا تغییر مسیر شغلی، اول استراحت کن و بعد تصمیم بگیر چون وقتی burnoutی، فقط دنبال راه فراری.. ممکنه تصمیم عاقلانه نگیری.
ما ماشین نیستیم. گاها دنبال self-improvement نبودن، خودش self-improvementه. لزوما نباید هر روزمون، بهتر از دیروزمون باشه.. بعضی وقتها باید تسلیم شد. باید Give up کرد روی یک سری از مسائل. تعصب بیجا و کورکورانه و درگیر کلمات و جزئیات شدن واقعا آدم رو از راه به در میکنه و یهو خودت رو بی هدف و بی مسیر وسط یه بیابون پیدا میکنی. درک کردن این موضوع و عاقلانه فکر کردن بهش، شاید زمانبر باشه اما اگه واقعا کسی به این باور برسه و اون Ego و تخیلات کاذب رو بذاره کنار، واقعا پیشرفت میکنه و زندگیای به مراتب زیباتر و پربارتر خواهد داشت.
Join 👉 @lnxpylnxpy | 593 |
| 6 | If you eat your favorite food two meals a day for a month, you'll end up hating that food.
لینک مقاله: https://blog.imsadra.dev/burnout-the-time-you-hate-everything
Join 👉 @lnxpylnxpy | 546 |
| 7 | شاید خسته نیستی؛ شاید Burnout شدی!
نشونه اصلی Burnout این نیست که انرژی نداری؛ اینه که دیگه برات مهم نیست.
تسکی که قبلاً با ذوق انجامش میدادی، الان فقط میخوای تموم بشه. پروژهای که برات هیجان داشت، تبدیل شده به یه لیست از کارهای تکراری.
خیلیها Burnout رو با خستگی اشتباه میگیرن. خستگی معمولاً با چند روز استراحت بهتر میشه؛ اما Burnout باعث میشه حتی بعد از استراحت هم نسبت به کار، تیم یا پروژه حس خوبی نداشته باشی.
معمولا برناوت یک شبه اتفاق نمیافته. هیچکس صبح بیدار نمیشه و ناگهان Burnout نمیشه.
معمولاً داستان از اینجا شروع میشه که..
- چند هفته اضافهکاری داشتی..
- چند ماه با استرس مداوم سر و کله میزدی..
- خیلی وقته استراحت نداشتی..
- خیلی تلاش کردی از یه سرویس خاص استفاده کنی یا دسترسی به اینترنت آزاد داشته باشی و نشد..
و بعد کمکم میبینی:
- تمرکزت کمتر شده
- اشتباهاتت بیشتر شده
- انگیزهات از بین رفته
- همه چیز آزاردهنده به نظر میرسه
مشکل اینجاست که سعی میکنیم با فشار بیشتر جبرانش کنیم؛ دقیقاً همون کاری که Burnout رو شدیدتر میکنه.
چطور بفهمیم Burnout داریم یا فقط از کارمون خوشمون نمیاد؟
این دو تا خیلی شبیه هم به نظر میرسن.
یه سوال ساده:
اگر دو هفته مرخصی بگیری، بعدش دلت برای کار کردن تنگ میشه؟
اگر جواب «آره» باشه، احتمالاً خسته یا Burnout شدی.
اگر جواب «نه» باشه و حتی بعد از استراحت هم از فکر برگشتن به کار حالت بد بشه، شاید مسئله فقط خستگی نباشه و خود شغل یا محیط کارت مشکل داره.
خیلی وقتها ما دنبال استراحت بیشتر میگردیم، در حالی که مشکل اصلی جای دیگه است:
- نقش اشتباه
- تیم اشتباه
- مدیر اشتباه
- یا حتی مسیر شغلی اشتباه
استراحت میتونه انرژی رو برگردونه، ولی همیشه نمیتونه علاقه رو برگردونه.
وقتی از همه چیز بدت میاد، اولین راهحل «بیشتر تلاش کردن» نیست!
یکی از خطرناکترین واکنشها به Burnout اینه که فکر کنیم:
- باید قویتر باشم!
- باید بیشتر کار کنم!
- باید تحمل کنم!
- نباید تسلیم بشم!
قبل از هر تصمیم بزرگ مثل استعفا، مهاجرت یا تغییر مسیر، این چند سوال رو از خودت بپرس:
- آخرین باری که واقعاً استراحت کردم کی بود؟
- چند وقته بدون وقفه زیر فشارم؟
- هنوز از خود کار لذت میبرم یا فقط خستهام؟
- اگر یک ماه استراحت کنم، نظرم عوض میشه؟
گاها مشکل این نیست که از همه چیز متنفری؛ مشکل اینه که مدت زیادیه فرصت ریکاوری نداشتی.
Join 👉 @lnxpylnxpy | 468 |
| 8 | اگر مسیج یک commit رو اشتباه نوشتید، اصلا نیاز نیست یه کامیت جدید بزنید.
برای ویرایش آخرین commit:
git rebase -i HEAD~1
سپس:
reword abc123 Fix logni page
بعد از ذخیره فایل، Git از شما میخواد پیام جدید رو وارد کنید:
Fix login page
دستورهای مهم Interactive Rebase:
pick استفاده از commit بدون تغییر
reword تغییر پیام commit
edit ویرایش commit
squash ادغام با commit قبلی
fixup ادغام بدون نگه داشتن پیام
drop حذف commit
پینوشت: من خودم واسه ادیت کردن آخرین کامیت، از این کامند استفاده میکنم. سریعتر و راحتتره:
git commit --amend -m "NEW MESSAGE"
منبع: https://blog.imsadra.dev/introduction-to-interactive-rebase-in-git
Join 👉 @lnxpylnxpy | 588 |
| 9 | یکی از خفنترین قابلیتهای Git که تقریبا اجازه میده همه نوع مانوری روی کامیتها و هیستوری گیت داشته باشین، Interactive Rebase هست. یاد گرفتنش، خیلی دستتون رو باز میکنه.
نکته مهم: Interactive Rebase تاریخچه Git رو بازنویسی میکنه؛ بنابراین روی branchهای حساس، باید با احتیاط ازش استفاده کرد.
چطور چند commit را به یک commit تبدیل کنیم؟
فرض کنید همچین تاریخچهای داریم:
Add Login
Fix Login Bug
Fix Typo
میخوایم ۳ تا کامیت آخر رو ادغام کنیم:
git rebase -i HEAD~3
هیستوریتون توی ادیتور باز میشه. کافیه فایل رو به این شکل تغییر بدیم:
pick abc123 Add Login
squash def456 Fix Login Bug
squash ghi789 Fix Typo
در نتیجه، یک تاریخچه تمیزتر و خواناتر واسه ریویو خواهیم داشت.
منبع: https://blog.imsadra.dev/introduction-to-interactive-rebase-in-git
Join 👉 @lnxpylnxpy | 569 |
| 10 | میدونستید به راحتی میتونید یه اسکریپت پایتون بنویسید و کاملا رایگان روی سرورهای گیتهاب رانش کنید؟
تقریبا هر سناریو Automationی که مدنظر داشته باشین رو میشه پیاده کرد. مثلا:
- یه اسکریپت پایتون که هر n ساعت، سریعترین کانفیگ vmess و vless رو واست SMS کنه یا توی یه README نگهش داره.
- هر n ساعت، یه پست AI-generated توی چنل تلگرامت منتشر کنه.
- هرموقع کسی روی ریپازیتوریت issue باز کرد، واست SMS بیاد.
تقریبا همه کار میشه باهاش کرد. یک سری محدودیتهای ریز داره ولی خب این محدودیتها موقعی تو چشم میان که کار شما هم خیلی خاص بشه.
لینک پروژه: https://github.com/lnxpy/pyaction
✨ خودم این موارد رو تاحالا باهاش ساختم:
- یه ریپازیتوری که از طریق issue باز کردن روش، بتونی با GPT صحبت کنی: https://github.com/lnxpy/mdb-ai-prompted-text
- یه پایپلاین که بلافاصله وقتی یه issue رو ریپازیتوریتون باز شه، شروع میکنه تغییرات رو بررسی کردن و به هر تغییر توی هر فایل، یه امتیاز میده و یه سری tip میده نسبت به تغییرات: https://github.com/lnxpy/revai
- امکان ارسال SMS توی پایپلاینهای گیتهاب اکشن با کاوهنگار: https://github.com/lnxpy/kavenegar-action
- یه چارت خیلی مینیمال و کوچیک از تعداد دانلود پکیج پایتونتون توی ریپازیتوری نگه میداره که میتونید توی README نمایشش بدید: https://github.com/lnxpy/pypi-chart-badge
- یه پایپلاین که اون موقعها تا مقاله منتشر میکردم، با AI به هر زبان دیگهای ترجمهاش میکرد و توی یه markdown file توی گیتهاب کامیتش میکرد: https://github.com/lnxpy/notio
Join 👉 @lnxpylnxpy | 749 |
| 11 | یه زمان، بحث سر اضافه کردن براکت فرفری {😄} یا همون Curly Braces خیلی داغ بود. شاید تقریبا ۱۰-۱۵ سال پیش. پایتونم اومد یه همچین Easter eggی اضافه کرد که وقتی ایمپورتش میکنی، یه تریسبک جالب میده:
>>> from __future__ import braces
File "<python-input-5>", line 1
from __future__ import braces
^^^^^^
SyntaxError: not a chance
منبع: https://blog.imsadra.dev/10-python-easter-eggs
Join 👉 @lnxpylnxpy | 920 |
| 12 | توی پایتون، یه Operand داریم، یه Operator. در مثال زیر، به x و y میگیم Operand و به < میگیم Opeartor.
if (x > y): ...
حالا این وسط یه Operatorی داریم که شاید کمتر کسی راجع بهش بدونه. اسمش Walrus operator هست. کارش چیه؟ عبارت مقایسهای ما که سرجاشه.. حالا این وسط میاد یه Variable assignment هم انجام میده.
مثلا اگه قبلا مینوشتید:
length = len("test1234")
if length < 8:
print(f"Your password is {length} chars long. It must be longer than 8
chars.")
زین پس بنویسید:
if (length:=len("test1234")) < 8:
print(f"Your password is {length} chars long. It must be longer than 8
chars.")
و چه شرط true باشه چه false، متغیر length همیشه در دسترس خواهد بود.
حالا یه اپراتور داریم که شاید اصلا ندیده باشینش. البته Deprecate شده ولی خب هنوز میشه ازش استفاده کرد و اسمش Barry Warsaw's Operator هست. بری خان دولوپر پایتون بوده و اون زمان، بجای =! یا همون Not equal، از <> استفاده میکردن.
>>> 2 != 3
True
>>> 2 <> 3
File "<python-input-1>", line 1
2 <> 3
^^
SyntaxError: invalid syntax
>>> from __future__ import barry_as_FLUFL
>>> 2 != 3
File "<python-input-3>", line 1
2 != 3
^^
SyntaxError: with Barry as BDFL, use '<>' instead of '!='
>>> 2 <> 3
True
>>>
کاملا بیمصرف و چرت. 😄
منبع: https://blog.imsadra.dev/10-python-easter-eggs
Join 👉 @lnxpylnxpy | 1 037 |
| 13 | توی cli، ران کنید:
python -c "import antigravity"
Join 👉 @lnxpylnxpy | 1 120 |
| 14 | Love is neither true, or false. Love is just love. This is love. 🖤
>>> import this
>>> love = this
>>> this is love
True
>>> love is True
False
>>> love is False
False
>>> love is not True or False
True
>>> love is not True or False; love is love
True
Join 👉 @lnxpylnxpy | 1 260 |
| 15 | دیگه بهتر از بانو، نیاد.. 🖤
Join 👉 @lnxpylnxpy | 1 130 |
| 16 | واسه توسعه پکیج پایتون، من از استکها و محیطی استفاده میکنم که تقریبا تمام نیازمندهام رو برطرف میکنه. از تست و کاوریج و داکیومنت، تا اتومیشنها و..
توی این مقاله، راجع به پروسه و تصمیماتی که حین توسعه میگیرم نوشتم. راجع به ابزارهای زیر هم صحبت کردم که هرکدوم به چه دردی میخورن:
CodeCov - PyTest - Tox - Nox - Ruff - Mkdocs - Coverage.py - GitHub Actions - Pre-commit
Link: https://blog.imsadra.dev/python-open-source-development-how-i-build-and-maintain-open-source-repositories
Join 👉 @lnxpylnxpy | 1 678 |
| 17 | یه موضوع هست راجع به تنظیم دپریکیشنها. مثلا شما قراره به زودی، یه utility که میتونه اصلا یه فانکشن باشه رو اسم یا ساختارش رو تغییر بدید. یا اصلا حذفش کنید و دیگه در دسترس نباشه و یک راه جایگزین واسش طراحی کنید. خلاصه قراره تغییری ایجاد کنید که شیوه استفاده از اون utility رو قراره تغییر بده.
def greet(name: str) -> str:
return f"hey {name}"
توی ورژن جدید قراره اسم greet به say_hi تغییر کنه. بهتره که از چند ورژن قبل تر، یه همچین حرکتی بزنید:
from warnings import deprecated
@deprecated("greet function will be renamed to say_hi")
def greet(name: str) -> str:
return f"hey {name}"
هر موقع که تابع greet کال شه، یه چنین وارنینگی هم نمایش داده میشه:
DeprecationWarning: greet function will be renamed to say_hi
یه سری پکیجها و ابزارها هم هستن واسه مدیریت این دپریکیشنها و تغییراتی که شیوه استفاده از اون موجودیت رو تغییر میدن. مثلا دقیقا توی چه ورژنی باید deprecationها رو ست کنید. دقیقا در چه ورژنی؟ بعدا راجع بهشون صحبت میکنیم. :)
Join 👉 @lnxpylnxpy | 1 300 |
| 18 | وقتی دارید روی یه پکیج کار میکنید که یوزرها برنامهنویس هستن، در قسمتهایی از پروژه، ورژن پکیج رو قید کردین. مسلما هر بیلد، یه ورژن خاص خودش رو داره. معروفترین نوع ورژنبندی هم که همه تقریبا باهاش آشناییم همون Semantic Versioning هست که از سه بخش اصلی درست شده:
[MAJOR].[MINOR].[PATCH]
شمارهٔ نسخهٔ اصلی (MAJOR) رو زمانی افزایش میدیم که تغییرات بزرگ اعمال شدن و ممکنه باعث Breaking Changes در بخشهایی از پروژه شده باشن.
شمارهٔ نسخهٔ جزئی (MINOR) رو زمانی افزایش میدیم که قابلیتهایی اضافه شدن که با نسخههای قبل سازگار هستند. (مثلا اکوسیستم و پترنها همون پترنهای قبلن، یه دوتا ماژول یا util جدید اضافه شدن به ساختار قبلی)
شمارهٔ نسخهٔ (PATCH) رو زمانی افزایش میدیم که صرفا یه باگ فیکس کردیم که با نسخههای قبل هم سازگار هست و Breaking Changesی نداریم.
یه اصطلاح هست به اسم Version Bumping. موقعی شما ورژن رو بامپ میکنید که تغییراتی ایجاد کردید و میخواید یه بیلد جدید بگیرید از پکیج. (شما هیچوقت نمیتونید از یه ورژن، دوتا بیلد داشته باشید. حتی اگه یه خط هم اضافه کنید، نیازه واسه منتشر کردنش، حتما یه ورژن بامپ کنید و بعد بیلد بگیرید)
قبلا من از bump-my-version استفاده میکردم. کاری که میکنن، ورژن فعلی رو از pyproject یا setup.py یا.. میخونن، ورژن فعلی رو پیدا میکنن توی تمام قسمتهای پروژه، سپس شما اجرا میکنی:
bump-my-version bump patch
و این میاد در هر قسمت از پروژه که ورژن اصلی (مثلا 1.2.3 ثبت شده) رو تبدیل میکنه به 1.2.4.
اگه از uv استفاده میکنید، با این روش هم میتونید ورژن رو بامپ کنید و خیلی بهتر و تمیزتره.
منبع: https://blog.imsadra.dev/python-313-new-features-deprecations
منبع: https://semver.org
Join 👉 @lnxpylnxpy | 1 330 |
| 19 | واسه اینکه راحتتر درک کنید قدرت Genericها رو در پایتون، چند مثال پایین رو ببینید، قشنگ جا میوفته واستون.
ساختار به این شکله:
def FUNCTION_NAME[TYPES](ARGS..) -> TYPE:
مثال:
```python
def select[T](items: List[T]) -> T:
...
پس داریم:
python
select(items=[1, 2, 3, 4, 5]) # T=int & List[T] = List[int]
select(items=["a", "b", "c"]) # T=str & List[T] = List[str]
select(items=[1.2, 1.3, 1.4]) # T=float & List[T] = List[Float]
# Therefore, we have..
users = [User("Abby"), User("Chris"), User("Nick")]
select(items=users) # T=User & List[T] = List[User]
همونطور که محسوسه، T داره بصورت داینامیک، طبق دیتایی که توی items قرار میگیره، ماهیت و نوعش تغییر میکنه. پوینت کل ماجرا همینه.
چرا اصلا اسمش T هست؟
اصلا مهم نیست اسمش چی باشه. یه سری مسائل هست که Conventionalان. یعنی یک سری قواعد نانوشتهای هستن که توسعهدهندهها ازش بصورت مرامی، پیروی میکنن وگرنه این مثال هم کاملا درسته:
python
def convert[B](item: B) -> Tuple[B, B, B]:
return (item,)
یه تابع، با چند Generic Type:
python
def convert[A, B](first: A, second: B) -> Tuple[A, B]:
return (first, second)
`
منبع: https://blog.imsadra.dev/generic-typing-in-python
Join 👉 @lnxpylnxpy | 1 741 |
| 20 | چرا Generic Typing مهمه؟
خیلی از برنامهنویسای پایتون هنگام استفاده از Type Hinting تنها از انواع مشخصی مانند str`، `int یا list[str] استفاده میکنن. اما زمانی که یک تابع یا کلاس باید با چندین نوع داده مختلف کار کنه، استفاده از Generic Typing باعث میشه هم انعطافپذیری حفظ شه و هم Type Safety از بین نره.
به جای اینکه برای هر نوع داده یک تابع جداگانه بنویسید، میتونید یک Type Variable تعریف کنید و نوع ورودی و خروجی رو به اون وابسته کنید. به این ترتیب ابزارهایی مثل MyPy و Pyright قادر خواهند بود خطاهای احتمالی رو پیش از اجرای برنامه تشخیص بدن.
from typing import TypeVar
T = TypeVar("T")
def first(items: list[T]) -> T:
return items[0]
در این مثال، تابع first میتونه روی لیستی از هر نوع دادهای کار کنه؛ اما نوع خروجی دقیقاً با نوع عناصر لیست مطابقت داره.
منبع: https://blog.imsadra.dev/generic-typing-in-python
Join 👉 @lnxpylnxpy | 2 005 |
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
