TorhamDev | تورهام 😳
ایده ام درباره اونایی که زیر پستا بی دلیل دلقک و دیسلاک و ... میزارن. در موارد خیلی زیاد وقتی بچهها رزومهاشون رو میزارن برای مثال کانال جنگو اکسپرت یک عالمه دیسلایک میخوره یا ایموجی های به اصطلاح منفی. خواستم بگم در نهایت دلقک در جامعه ما زیاد اگه نبود…
از اونجایی که جامعه ایران مرد پرور و قالب دوستان فکر میکنن کره خاکی هول محور عزیزان میچرخه و هرچی بفرمایند حقیقت داره و اگر هم خطایی کردن تقصیر اونایی نیست کار دشمنه.
نتیجه اش هم به وضوح در دانشگاه سطج پایین کشور داخل اساتید میبینید.
خلاصه خواستم بگم که این آدمها جدی نگیرید و ببینید کی داره چی میگه و اون آدم چی بارشه :)
یک آدم رندوم که تو عمرش نزدیک به مصاحبه هم نرفته قطعا دیسلایک زدنش زیر رزومه شما ارزشی نداره و مهم نیست
@TorhamDevCH
نتیجه اش هم به وضوح در دانشگاه سطج پایین کشور داخل اساتید میبینید.
خلاصه خواستم بگم که این آدمها جدی نگیرید و ببینید کی داره چی میگه و اون آدم چی بارشه :)
یک آدم رندوم که تو عمرش نزدیک به مصاحبه هم نرفته قطعا دیسلایک زدنش زیر رزومه شما ارزشی نداره و مهم نیست
@TorhamDevCH
👍26👎2❤1
خوب تا اینایی که بهشون بر خورد دارن لفت میدن یک پست فنی بنویسم
❤12🤣5👎1
Protocol class
داخل پایتون ما یک مفهمومی داریم به اسم protocol. این مفهوم در پایتون دوتا شده، یک پروتوکل داریم که به نحوه پیاده سازی چیزهایی مثل کانتکس منیجیر و ایتریتور و ... میگن که باید رعایت شه و به اصطلاح پرتوکول هستش.
یک پروتوکل داریم که شما از کتابخونه typing ایمپورت میکنید.
from typing import Protocol
این یکی پروتوکل خیلی جذابه.
شما با این پروتوکل میتونید یک تایپ درست کنید که ازش استفاده کنید بدون ارث بری از چیزی یا جایی. بزارید بیشتر توضیح بدم.
برای مثال من یک فانکشن دارم که ورودی EmailSMTP میگیره و از ایمیل اسامتیپی متد send_mail صدا میزنه.
حالا اگه یک روزی من بخام ساپورت از فلان ایمیل سندر جدید اضافه کنم یک کلاس جدید میسازم مثلا
DogMailClint
حالا بدبختی شروع میشه. فانشکن من فقط و فقط EmailSMTP میخاد هرچی دیگه بهش بدی تایپ ارور میده. میگه این تایپش ایمیل اسامتیپی نیست نوموخام.
اینجاست که شما یک پروتوکل مینویسید به این شکل:
اینطوری شما یک پرتوکول دارید که میگه هرچیزی که فانکشن send_email داشته باشه و ورودی و خروجیش هم مثل اینه باشه در نتیجه تایپش EmailClient هستش.
به قول معروف به این ماجرا میگن داکتایپینگ یا تایپ اردکی.
اگه مثل ارد راه میره، اگر مثل اردک صدا میده حتما یک اردک دیگه!
حالا برای فانشکن شما مهم نیست که تایپ ورودیش EmailSMTP باشه یا DogMailClient باشه یا هرچیز دیگه ای تا وقتی که متد send_mail داره و ورودی و خروجیش ( سیگنچر فانکشن) مثل اینه حتما همینی که من لازم دارم :)
اینطوری شما یک تایپ داریو که در حقیقت یک پروتوکل برای هر کلاسیه که میخاد این شکلی باشه :)
این پست ۳ بار نوشتم هربار مثال بد بود :)))
برای اینکه خیلی بیشتر و بهتر بفهمید میتونید این ویدیو رو ببینید:
https://youtu.be/dryNwWvSd4M?si=ZCdBUYs-xaOjIe2e
@TorhamDevCH
داخل پایتون ما یک مفهمومی داریم به اسم protocol. این مفهوم در پایتون دوتا شده، یک پروتوکل داریم که به نحوه پیاده سازی چیزهایی مثل کانتکس منیجیر و ایتریتور و ... میگن که باید رعایت شه و به اصطلاح پرتوکول هستش.
یک پروتوکل داریم که شما از کتابخونه typing ایمپورت میکنید.
from typing import Protocol
این یکی پروتوکل خیلی جذابه.
شما با این پروتوکل میتونید یک تایپ درست کنید که ازش استفاده کنید بدون ارث بری از چیزی یا جایی. بزارید بیشتر توضیح بدم.
برای مثال من یک فانکشن دارم که ورودی EmailSMTP میگیره و از ایمیل اسامتیپی متد send_mail صدا میزنه.
حالا اگه یک روزی من بخام ساپورت از فلان ایمیل سندر جدید اضافه کنم یک کلاس جدید میسازم مثلا
DogMailClint
حالا بدبختی شروع میشه. فانشکن من فقط و فقط EmailSMTP میخاد هرچی دیگه بهش بدی تایپ ارور میده. میگه این تایپش ایمیل اسامتیپی نیست نوموخام.
اینجاست که شما یک پروتوکل مینویسید به این شکل:
class EmailClient(Protocol):
def send_email(addresses: list[str], content: str, attachments: list[File] | None = None):
...اینطوری شما یک پرتوکول دارید که میگه هرچیزی که فانکشن send_email داشته باشه و ورودی و خروجیش هم مثل اینه باشه در نتیجه تایپش EmailClient هستش.
به قول معروف به این ماجرا میگن داکتایپینگ یا تایپ اردکی.
اگه مثل ارد راه میره، اگر مثل اردک صدا میده حتما یک اردک دیگه!
حالا برای فانشکن شما مهم نیست که تایپ ورودیش EmailSMTP باشه یا DogMailClient باشه یا هرچیز دیگه ای تا وقتی که متد send_mail داره و ورودی و خروجیش ( سیگنچر فانکشن) مثل اینه حتما همینی که من لازم دارم :)
اینطوری شما یک تایپ داریو که در حقیقت یک پروتوکل برای هر کلاسیه که میخاد این شکلی باشه :)
این پست ۳ بار نوشتم هربار مثال بد بود :)))
برای اینکه خیلی بیشتر و بهتر بفهمید میتونید این ویدیو رو ببینید:
https://youtu.be/dryNwWvSd4M?si=ZCdBUYs-xaOjIe2e
@TorhamDevCH
YouTube
Protocols vs ABCs in Python - When to Use Which One?
💡 Learn how to design great software in 7 steps: https://arjan.codes/designguide.
In this video, I’m revisiting Protocols and ABCs in Python, essential for creating abstraction layers by defining interfaces. I covered this a while back, but it deserves a…
In this video, I’m revisiting Protocols and ABCs in Python, essential for creating abstraction layers by defining interfaces. I covered this a while back, but it deserves a…
🔥12❤1
یک بار برای همیشه.
auto_now
هر بار که آبجکت اپدیت بشه اپدیت میشه
auto_now_add
فقط زمان ساخت ابجکت پر میشه.
برای اینکه یادمون بمونه فرقشون هم از add اخر auto now add استفاده میکنیم. چون که میگه add یعنی زمان اضافه شدن.
فردا یادم میره دوباره
@TorhamDevCH
auto_now
هر بار که آبجکت اپدیت بشه اپدیت میشه
auto_now_add
فقط زمان ساخت ابجکت پر میشه.
برای اینکه یادمون بمونه فرقشون هم از add اخر auto now add استفاده میکنیم. چون که میگه add یعنی زمان اضافه شدن.
@TorhamDevCH
🤣22🔥1
من تیر خوردم شما ادامه بدید.
ترجمه header به فارسی میشه سرآیند
ترجمه agent به فارسی میشه گماشته
ترجمه header به فارسی میشه سرآیند
ترجمه agent به فارسی میشه گماشته
😁13
TorhamDev | تورهام 😳
من تیر خوردم شما ادامه بدید. ترجمه header به فارسی میشه سرآیند ترجمه agent به فارسی میشه گماشته
meanwhile, in parallel universe, when everybody uses translated versions:
امیر جان سرآیند احراز هویت در تشریفات انتقال ابر متن در گماشته ایکس کار نمیکنه.
امیر جان سرآیند احراز هویت در تشریفات انتقال ابر متن در گماشته ایکس کار نمیکنه.
🤣17
وای، مسافر صندلی جلویی داره با استفاده از گوگل ترنسلیت با دوست دختر AIاش چت میکنه. خودایا ویلم کن😂
🤣36🗿2😭1
سودوئر رو از دست دادیم. امیدوارم خوشحال و خندون باشه در ادامه زندگی :)
💔16
Forwarded from Python BackendHub (Mani)
تو بحث کردن دو روش داریم:
Strawman: یعنی ضعیفترین و دمدستیترین برداشت از حرف طرف مقابل رو میگیری و همونو میکوبی.
Steelman: یعنی قویترین و منطقیترین نسخه از حرف طرف مقابل رو تصور میکنی و بعد اونو نقد میکنی.
تو بحثهای تکنیکال و تو حوزه خودمون، حداقل steelman باشید. یعنی قبل از اینکه یه ایده رو بکوبید، سعی کنید بهترین حالت ممکنش رو در بیارید و بعد نقد کنید. ولی میبینم یک عده اخیرا کلا دلیلی نمیارن؛ ایده رو از بیسیک میزنن و میگن «کلا خوب نیست» بدون حتی یه خط استدلال! جملشون هم انگلیسی مینویسن که مثلا جذبه بیشتری داشته باشه :)) اینطوری نه بحث جلو میره، نه کسی چیزی یاد میگیره. اگه میخواید نقد کنید، اول قویترین نسخهی ایده رو بسازید، بعد برید سراغ نقد.
@PyBackendHub
Strawman: یعنی ضعیفترین و دمدستیترین برداشت از حرف طرف مقابل رو میگیری و همونو میکوبی.
Steelman: یعنی قویترین و منطقیترین نسخه از حرف طرف مقابل رو تصور میکنی و بعد اونو نقد میکنی.
تو بحثهای تکنیکال و تو حوزه خودمون، حداقل steelman باشید. یعنی قبل از اینکه یه ایده رو بکوبید، سعی کنید بهترین حالت ممکنش رو در بیارید و بعد نقد کنید. ولی میبینم یک عده اخیرا کلا دلیلی نمیارن؛ ایده رو از بیسیک میزنن و میگن «کلا خوب نیست» بدون حتی یه خط استدلال! جملشون هم انگلیسی مینویسن که مثلا جذبه بیشتری داشته باشه :)) اینطوری نه بحث جلو میره، نه کسی چیزی یاد میگیره. اگه میخواید نقد کنید، اول قویترین نسخهی ایده رو بسازید، بعد برید سراغ نقد.
@PyBackendHub
👍4❤1
Forwarded from Python BackendHub (Mani)
یک سوال رو میخوام مطرح کنم , شما یک فانکشن
فانکشن
سوالی که پیش میاد اینه که شما چطور توابعتون رو طراحی میکنید که این مشکل به وجود نیاد؟ کدتون احتمالا این شکلیه.
همونطور که میبینید نحوه استفاده inner1 و inner2 کاپل شده به یوزر. من اگه حواسم نباشه lock=true رو نذارم کدم در برابر ریس کاندیشن سیف نیست. اگه یک نفر دیگه یک جای دیگه دوباره inner1 رو استفاده کنه و یادش بره یوزر رو لاک کنه بازم همین مشکلو داریم. درواقع یک استیت مشترک بین چند فانکشن داریم که فقط میشه چشمی دنبالش کرد... قبل اینکه پست بعدیو بخونید یکم بهش فکر کنید ببینید راه حلی داره این موضوع؟
@PyBackendHub
parent دارید. داخل این فانکشن شما باید یوزر رو بگیرید (`getUser`) و بعد سه تا فانکشن inner1 و inner2 و inner3 رو صدا بزنید و یوزر رو بهشون بدید تا یک پردازشی تو دیتابیس انجام بده.فانکشن
inner1 و inner2 یوزر آیدی میگیرن و نیاز دارن یوزر لاک باشه تو دیتابیس وگرنه ممکنه ریس کاندیشن بخوره. ولی فانکشن ۳ براش مهم نیست چون پردازشی که میکنه ریس کاندیشن نمیخوره.سوالی که پیش میاد اینه که شما چطور توابعتون رو طراحی میکنید که این مشکل به وجود نیاد؟ کدتون احتمالا این شکلیه.
def parent():
user = get_user(lock=True)
inner1(user)
inner2(user)
inner3(user)
همونطور که میبینید نحوه استفاده inner1 و inner2 کاپل شده به یوزر. من اگه حواسم نباشه lock=true رو نذارم کدم در برابر ریس کاندیشن سیف نیست. اگه یک نفر دیگه یک جای دیگه دوباره inner1 رو استفاده کنه و یادش بره یوزر رو لاک کنه بازم همین مشکلو داریم. درواقع یک استیت مشترک بین چند فانکشن داریم که فقط میشه چشمی دنبالش کرد... قبل اینکه پست بعدیو بخونید یکم بهش فکر کنید ببینید راه حلی داره این موضوع؟
@PyBackendHub
👨💻1
Forwarded from Python BackendHub (Mani)
برند تایپ یا همون New Type یعنی یه تایپ جدید بسازی رو همون تایپ قدیمی، بدون این که تو رانتایم هیچ خرجی داشته باشه. یه جورایی مثل اینه که سابکلس بسازی ولی واقعاً سابکلس نکردی.
فایدهش چیه؟ به تایپچکر میفهمونی مثلا UserId با یه string فرق داره. تو رانتایم هردوش استرینگن ولی تو تایپ دیگه یکی نیستن.
تو مثال ما، یه UserId درست میکنیم، بعد یه برند جنریک به اسم Locked<T>. اگه تو getUser(true) صدا بزنیم خروجیش میشه Locked<UserId>. حالا توابعی که میخوان یوزر لاک شده باشه فقط همینو قبول میکنن. یعنی دولوپر مجبوره قبل استفاده یوزر رو لاک کنه، وگرنه تایپچکر گیر میده و کدت دیپلوی نمیشه.
اگه اینو نداشتیم، باید تو هر تابع دوباره یوزر رو لاک میکردیم که هم تکراری میشه هم رانتایم گرونتر.
مزایا:
- جلوی خطا رو میگیره
- خودش یه جور داکیومنت زندهست
- یه بار لاک میکنی، رانتایم سریعتره
- نگه داری کدتون رو راحت تر میکنه (maintainability)
ضررش؟ فقط دو سه خط تایپ بیشتر مینویسی، همین. که البته مقایسه کنی با کدی که باید بیشتر مینوشتی چون این تایپا رو نداشتی هیچ بود.
@PyBackendHub
فایدهش چیه؟ به تایپچکر میفهمونی مثلا UserId با یه string فرق داره. تو رانتایم هردوش استرینگن ولی تو تایپ دیگه یکی نیستن.
تو مثال ما، یه UserId درست میکنیم، بعد یه برند جنریک به اسم Locked<T>. اگه تو getUser(true) صدا بزنیم خروجیش میشه Locked<UserId>. حالا توابعی که میخوان یوزر لاک شده باشه فقط همینو قبول میکنن. یعنی دولوپر مجبوره قبل استفاده یوزر رو لاک کنه، وگرنه تایپچکر گیر میده و کدت دیپلوی نمیشه.
اگه اینو نداشتیم، باید تو هر تابع دوباره یوزر رو لاک میکردیم که هم تکراری میشه هم رانتایم گرونتر.
مزایا:
- جلوی خطا رو میگیره
- خودش یه جور داکیومنت زندهست
- یه بار لاک میکنی، رانتایم سریعتره
- نگه داری کدتون رو راحت تر میکنه (maintainability)
ضررش؟ فقط دو سه خط تایپ بیشتر مینویسی، همین. که البته مقایسه کنی با کدی که باید بیشتر مینوشتی چون این تایپا رو نداشتی هیچ بود.
@PyBackendHub
❤1
خوب شرکت هم استکش رو از پایتون به گولنگ داره تغییر میده و بنده ماه آخرم و تعدیل میشم :)
here we go again
برم رزومه رو مرتب کنم
here we go again
برم رزومه رو مرتب کنم
💔45🍾4🤣3🗿1