Python BackendHub
ویدیو خیلی خوبی بود، توصیه میکنم حتما ببینید. من داخل یک جایی دیدم دوستان متاسفانه برداشت کردن که امیربهادر گفته <کلا جنگو بدرد نمیخوره> 😂 خودم کارایی که میکنم و واقعا به قدرت حل مسئله ام جواب داده: ۰. اولین و مهم ترین نکته: همیشه query رو روی دیتابیس مینویسم،…
مورد صفر سوال پرسیدن:
من هم جاهایی که میبینم کوئری ممکنه یکم پیچیده بشه معمولا اولا میرم sqlش رو مینویسم بعد همونو میذارم توی کد و اکزکیوتش میکنم چون orm ی وقتایی ناخوانا میشه چنتا اگرگیشن و اینا میاد توش گیج میشم. منظورت همینه؟
پاسخ: نه. منظورم این نیست. منظورم اینه که شما هر query که میخوای بنویسی باید مایندست SQL Query رو داشته باشید. یعنی اینقدر تمرین کرده باشین که بدونید چیو رو چی جوین بزنید و چطور query بنویسید که ران تایم queryتون به شکل عجیبی بالا نباشه. (کاری به ایندکس و اینا ندارما خود query رو دارم میگم) و با کمترین هیت به دیتایی که میخواین برسید. خیلی از دوستان دقیقا مسیر رو برعکس میرن یعنی اول میرن سراغ اینکه orm چطور اون اکشن رو عمل میکنه نگاه میکنن query که orm زده چطور شده. خیلیام اصلا اون چک رو نمیکنن که دیگه فاجعه رخ میده..😁
برای query نویسی من همیشه اول دیتابیس رو با سمپل دیتا جلوم باز میکنم. شروع میکنم به query زدن. دیباگش میکنم و ران تایمشو کم میکنم. بهینش میکنم و در نهایت میرسم مثلا به یک query که شده ۱۵ خط مثلا. بعد میام تو orm میگردم ببینم چیزایی که استفاده کردم چطور تو orm استفاده میشه. در نهایت تبدیلش میکنم به کد پایتونی. اینطوری orm هیچوقت برای من query بد نمیسازه. orm جای من تصمیم نمیگیره. من وابستگی ندارم به orm صرفا یک تولزه که دارم ازش استفاده میکنم برای راحت تر شدن maintain کدم و نداشتن sql injection
اتفاقی که تو جنگو ممکنه براتون یک وقتا رخ بده اینه که query که نوشتید مثلا چیزی داره که جنگو ساپورت نمیکنه. مثل outer join (قبلا نمیکرد الان شاید کنه). اون موقع مجبورین query raw بنویسید. اگه دیدین query raw هاتون داره زیاد میشه باید حواستون باشه یا orm رو تغییر بدید یا raw query هاتون رو maintainable بنویسید. یعنی مثلا به جای اینکه تو پایتون بنویسید
query = "SELECT User.username FROM Users"
بنویسید
query = f"SELECT {User.__table_name__}.{User.id.field_name} From {User.__table_name__}"
که اگه اسم فلان فیلد یا تیبل روتو دیتابیستون تغییر دادین یا اگه اصلا حذفش کردین queryتون آپدیت شه.
میتونید از repository pattern هم استفاده کنید که raw query هاتون همه یک جا باشه که بتونید راحت maintain اش کنید.
البته این مثاله ها.. اگه یوزر اینپوت دارین حتما باید از پارامتر استفاده کنید که sql injection نخورید.
پی نوشت:برای query خیلی ساده در حد یک where دیگه نمیام همچین کاری کنما... منظورم query هایی هست که یکم پیچیده ترن از اون query های خیلی ساده.
@ManiFoldsPython
من هم جاهایی که میبینم کوئری ممکنه یکم پیچیده بشه معمولا اولا میرم sqlش رو مینویسم بعد همونو میذارم توی کد و اکزکیوتش میکنم چون orm ی وقتایی ناخوانا میشه چنتا اگرگیشن و اینا میاد توش گیج میشم. منظورت همینه؟
پاسخ: نه. منظورم این نیست. منظورم اینه که شما هر query که میخوای بنویسی باید مایندست SQL Query رو داشته باشید. یعنی اینقدر تمرین کرده باشین که بدونید چیو رو چی جوین بزنید و چطور query بنویسید که ران تایم queryتون به شکل عجیبی بالا نباشه. (کاری به ایندکس و اینا ندارما خود query رو دارم میگم) و با کمترین هیت به دیتایی که میخواین برسید. خیلی از دوستان دقیقا مسیر رو برعکس میرن یعنی اول میرن سراغ اینکه orm چطور اون اکشن رو عمل میکنه نگاه میکنن query که orm زده چطور شده. خیلیام اصلا اون چک رو نمیکنن که دیگه فاجعه رخ میده..😁
برای query نویسی من همیشه اول دیتابیس رو با سمپل دیتا جلوم باز میکنم. شروع میکنم به query زدن. دیباگش میکنم و ران تایمشو کم میکنم. بهینش میکنم و در نهایت میرسم مثلا به یک query که شده ۱۵ خط مثلا. بعد میام تو orm میگردم ببینم چیزایی که استفاده کردم چطور تو orm استفاده میشه. در نهایت تبدیلش میکنم به کد پایتونی. اینطوری orm هیچوقت برای من query بد نمیسازه. orm جای من تصمیم نمیگیره. من وابستگی ندارم به orm صرفا یک تولزه که دارم ازش استفاده میکنم برای راحت تر شدن maintain کدم و نداشتن sql injection
اتفاقی که تو جنگو ممکنه براتون یک وقتا رخ بده اینه که query که نوشتید مثلا چیزی داره که جنگو ساپورت نمیکنه. مثل outer join (قبلا نمیکرد الان شاید کنه). اون موقع مجبورین query raw بنویسید. اگه دیدین query raw هاتون داره زیاد میشه باید حواستون باشه یا orm رو تغییر بدید یا raw query هاتون رو maintainable بنویسید. یعنی مثلا به جای اینکه تو پایتون بنویسید
query = "SELECT User.username FROM Users"
بنویسید
query = f"SELECT {User.__table_name__}.{User.id.field_name} From {User.__table_name__}"
که اگه اسم فلان فیلد یا تیبل روتو دیتابیستون تغییر دادین یا اگه اصلا حذفش کردین queryتون آپدیت شه.
میتونید از repository pattern هم استفاده کنید که raw query هاتون همه یک جا باشه که بتونید راحت maintain اش کنید.
البته این مثاله ها.. اگه یوزر اینپوت دارین حتما باید از پارامتر استفاده کنید که sql injection نخورید.
پی نوشت:برای query خیلی ساده در حد یک where دیگه نمیام همچین کاری کنما... منظورم query هایی هست که یکم پیچیده ترن از اون query های خیلی ساده.
@ManiFoldsPython
👍10
Forwarded from Python BackendHub
یکی از دوره هایی که هر بک اند کاری باید ببینه :)
https://git.ir/p/xnEZB
این تیکه ای که تو عکس گذاشتم رو اصلا فراموش نکنید. مخصوصا قسمت 229. واقعا جذابه 👌
@ManifoldsPython
https://git.ir/p/xnEZB
این تیکه ای که تو عکس گذاشتم رو اصلا فراموش نکنید. مخصوصا قسمت 229. واقعا جذابه 👌
@ManifoldsPython
👍8❤3🔥2
Python BackendHub
یکی از دوره هایی که هر بک اند کاری باید ببینه :) https://git.ir/p/xnEZB این تیکه ای که تو عکس گذاشتم رو اصلا فراموش نکنید. مخصوصا قسمت 229. واقعا جذابه 👌 @ManifoldsPython
دوستان یک چیز بگم امروز چند نفر پرسیدن.. میشه کلا raw query زد و از orm استفاده نکرد و sql injection نداشت؟
بله چرا نشه. ولی منطقی نیست. چرا؟
۱. هر orm ای که استفاده کنیم به ما تایپینگ میده. سرعتمون رو سریعتر میکنه
۲. کدمون رو maintainable تر میکنه. تو دنیایی که orm استفاده نمیکنیم در اخر باید اون models.py رو بسازیم و مثلا اسم یک فیلدو همه جا تکرار نکنیم و ... . در نهایت یک چیزی شبیه ORM میشه بازم.
۳. خطای انسانی رو به شدت کاهش میده
پس orm استفاده نمیکنیم که sql ننویسیم یا فقط SQL Injection نداشته باشیم. اگه ملاک اینا بود که از stored procedure به جای ORM استفاده میکردیم. ولی بازم دلیل نمیشه چون از orm استفاده میکنیم پس ندونیم sql injection چیه و چطور هندل میشه و یا sql نتونیم بنویسیم.
@ManiFoldsPython
بله چرا نشه. ولی منطقی نیست. چرا؟
۱. هر orm ای که استفاده کنیم به ما تایپینگ میده. سرعتمون رو سریعتر میکنه
۲. کدمون رو maintainable تر میکنه. تو دنیایی که orm استفاده نمیکنیم در اخر باید اون models.py رو بسازیم و مثلا اسم یک فیلدو همه جا تکرار نکنیم و ... . در نهایت یک چیزی شبیه ORM میشه بازم.
۳. خطای انسانی رو به شدت کاهش میده
پس orm استفاده نمیکنیم که sql ننویسیم یا فقط SQL Injection نداشته باشیم. اگه ملاک اینا بود که از stored procedure به جای ORM استفاده میکردیم. ولی بازم دلیل نمیشه چون از orm استفاده میکنیم پس ندونیم sql injection چیه و چطور هندل میشه و یا sql نتونیم بنویسیم.
@ManiFoldsPython
👍4
ازتون یک سوال دارم،
https://roadmap.sh/backend
این سایت پره رودمپ خفنه، که مال بک اند رو گذاشتم، منتهی ته رودمپ میخوره به بحث های دوآپسی
بنظر شما یک بک اند کار چقدر باید مفاهیم زیرم بلد باشه؟
۱. لینوکس
۲. instrumentation
۳. monitoring
۴. کوبر
۵. Web server
۶. داکر و سوارم
۷. تلمتری
مواردیه که همگی اشاره شدن تو رودمپ بجز مورد اول، خودم شخصا جز ۱ و ۴ بقیشو تا حدی سعی کردم یاد بگیرم این چند وفت. قبل اینکه یاد بگیرم واقعا درک نمیکردم چرا، ولی الان خیلی مفهوم میده چون مثلا prometheus instrumentation یا telemtry اپلیکیشن فست رو مثلا باید کسی کنه که فست بلد باشه، طبیعتا یک دواپس کار نمیتونه اینکارو کنه.
اما مرز یادگیریش تا چه حد باید باشه؟ من سعی کردم در حدی یاد بگیرم که سرویس خودمو جمع و جور کنم، و کمک دست devops کاره باشم جایی که اورلپ داره با کدای خودم، مثلا یک دوره prometheus داشتم میدیدم که تهش میرسید به auto scaling با k8s و دیگه سعی نکردم اونو یاد بگیرم چون حس کردم از تایتل شغلیمن خارجه
نظرتون چیه؟
@ManiFoldsPython
https://roadmap.sh/backend
این سایت پره رودمپ خفنه، که مال بک اند رو گذاشتم، منتهی ته رودمپ میخوره به بحث های دوآپسی
بنظر شما یک بک اند کار چقدر باید مفاهیم زیرم بلد باشه؟
۱. لینوکس
۲. instrumentation
۳. monitoring
۴. کوبر
۵. Web server
۶. داکر و سوارم
۷. تلمتری
مواردیه که همگی اشاره شدن تو رودمپ بجز مورد اول، خودم شخصا جز ۱ و ۴ بقیشو تا حدی سعی کردم یاد بگیرم این چند وفت. قبل اینکه یاد بگیرم واقعا درک نمیکردم چرا، ولی الان خیلی مفهوم میده چون مثلا prometheus instrumentation یا telemtry اپلیکیشن فست رو مثلا باید کسی کنه که فست بلد باشه، طبیعتا یک دواپس کار نمیتونه اینکارو کنه.
اما مرز یادگیریش تا چه حد باید باشه؟ من سعی کردم در حدی یاد بگیرم که سرویس خودمو جمع و جور کنم، و کمک دست devops کاره باشم جایی که اورلپ داره با کدای خودم، مثلا یک دوره prometheus داشتم میدیدم که تهش میرسید به auto scaling با k8s و دیگه سعی نکردم اونو یاد بگیرم چون حس کردم از تایتل شغلیمن خارجه
نظرتون چیه؟
@ManiFoldsPython
roadmap.sh
Backend Developer Roadmap: What is Backend Development
Step by step guide to becoming a modern backend developer in 2025
👍14❤1
Forwarded from Sadra Codes
یه عده کانتنت کریتور هستن، سمیان. از اینا دوری کنید. 😂
اگه با این تفکر قرار بود جلو بریم، الان داشتیم سیکوئنس کدماشین پانچ میکردیم.
اصلا چه اصراریه اینقدر بولد کنی یه ابزار یا زبان رو؟
(خدا نکنه بیزینسی بیوفته دست این نوع طرز تفکر)
اگه با این تفکر قرار بود جلو بریم، الان داشتیم سیکوئنس کدماشین پانچ میکردیم.
اصلا چه اصراریه اینقدر بولد کنی یه ابزار یا زبان رو؟
(خدا نکنه بیزینسی بیوفته دست این نوع طرز تفکر)
👍28
یک نکته بگم تو آداپتور نویسی (Adaptor pattern)
شما هرجایی تو آداپتور که I/O داشتین حتی اگه sync بود بازم با async بنویسید. یعنی مثل async باهاش برخورد کنید حتی با وجود اینکه sync عه! دلیل دارم اینو میگم;
ممکنه امروز لایبری نباشه ساپورت کنه async اون I/O رو. ولی فردا ممکنه بیاد. پس وقتی میاد ریفکتور خیلی بزرگی نخواهید داشت و کافیه چند خط رو ریفکتور کنید تا کدتون async شه.
به این کار میگن future-proof code
یعنی کدی که میتونید رانش کنید به محض بیرون اومدن تکنولوژی جدید بدون اینکه مجبور باشید ریفکتور بزرگی کنید.
منتهی نباید over-do کنید اینکارو. فقط جایی که لازم دارین واقعا اینکارو انجام بدید. پروژه ای که میدونید این تیکش اگه async بشه خیلی عالی میشه. زیاد انجام دادنش باعث پیچیدگی بیخود کد میشه زمانی که اون کد اصلا کارایی نداشته. خلاصه YAGNI رو نقض نکنید :))
@ManiFoldsPython
شما هرجایی تو آداپتور که I/O داشتین حتی اگه sync بود بازم با async بنویسید. یعنی مثل async باهاش برخورد کنید حتی با وجود اینکه sync عه! دلیل دارم اینو میگم;
ممکنه امروز لایبری نباشه ساپورت کنه async اون I/O رو. ولی فردا ممکنه بیاد. پس وقتی میاد ریفکتور خیلی بزرگی نخواهید داشت و کافیه چند خط رو ریفکتور کنید تا کدتون async شه.
به این کار میگن future-proof code
یعنی کدی که میتونید رانش کنید به محض بیرون اومدن تکنولوژی جدید بدون اینکه مجبور باشید ریفکتور بزرگی کنید.
منتهی نباید over-do کنید اینکارو. فقط جایی که لازم دارین واقعا اینکارو انجام بدید. پروژه ای که میدونید این تیکش اگه async بشه خیلی عالی میشه. زیاد انجام دادنش باعث پیچیدگی بیخود کد میشه زمانی که اون کد اصلا کارایی نداشته. خلاصه YAGNI رو نقض نکنید :))
@ManiFoldsPython
👍10
This media is not supported in your browser
VIEW IN TELEGRAM
شش مدل API مختلف
کاربردشون هم زیرش توضیح داده که بنظرم خوبه بدونید چیو کجا استفاده کنید
@ManiFoldsPython
کاربردشون هم زیرش توضیح داده که بنظرم خوبه بدونید چیو کجا استفاده کنید
@ManiFoldsPython
👍22🔥4
ویدیو بعدی راجب DI Container و نحوه پیاده سازیش
چقدر از این کد و دلیل پیاده سازیشو رو متوجه میشین؟
پی نوشت:سورس کد تمام دوره رو گیتهابه
https://github.com/ManiMozaffar/testing-101
@ManiFoldsPython
چقدر از این کد و دلیل پیاده سازیشو رو متوجه میشین؟
پی نوشت:سورس کد تمام دوره رو گیتهابه
https://github.com/ManiMozaffar/testing-101
@ManiFoldsPython
👍3
داشتم ویدیو رو آپلود میکردم که یوتیوب تو ساجسشن برام یک ویدیو خیلی جالب اورد
توصیه میکنم حتما ببینید
https://www.youtube.com/watch?v=1KiItzAHDpM
نمیشه گفت <همه نکات> ولی نکات خیلی خوبی رو اشاره کردن
یک ریسورس هم معرفی کردن که خیلی خوب بنظر میان:
https://www.manning.com/books/the-art-of-unit-testing-second-edition
و البته مرد همیشه در صحنه Martin Fowler و بلاگ خوبش راجب تست نویسی
https://martinfowler.com/bliki/UnitTest.html
@ManiFoldsPython
توصیه میکنم حتما ببینید
https://www.youtube.com/watch?v=1KiItzAHDpM
نمیشه گفت <همه نکات> ولی نکات خیلی خوبی رو اشاره کردن
یک ریسورس هم معرفی کردن که خیلی خوب بنظر میان:
https://www.manning.com/books/the-art-of-unit-testing-second-edition
و البته مرد همیشه در صحنه Martin Fowler و بلاگ خوبش راجب تست نویسی
https://martinfowler.com/bliki/UnitTest.html
@ManiFoldsPython
YouTube
همه چیز راجع به یونیت تست - تست نرم افزار
این ویدئو شروع مجموعه ویدئوهایی پیرامون تست نرم افزار هست
نوشتن یونیت تست یکی از فاکتورهای مهم و از اصول تست نرم افزار است که اگر به درستی انجام شود، نقش زیادی در بالا رفتن کیفیت نرمافزارهای تولید شده دارد
در این ویدئو، هر آنچیزی که لازم است در رابطه با…
نوشتن یونیت تست یکی از فاکتورهای مهم و از اصول تست نرم افزار است که اگر به درستی انجام شود، نقش زیادی در بالا رفتن کیفیت نرمافزارهای تولید شده دارد
در این ویدئو، هر آنچیزی که لازم است در رابطه با…
👍5
تو قسمت هفتم از پلی لیست اصول تست نویسی در مهندسی نرم افزار، بررسی کردم DI Container یعنی چی و Depends تو FastAPI چطور پیاده میشه و یک فریم ورک پایتونی به نام dependency injector هم بررسی کردم و در اخر یک کانیتر هم خودمون نوشتیم ✌️
https://www.youtube.com/watch?v=mKUNGuBIgKc&list=PLEQ3RnweNGA6v7qTMrDCcpgr9u91zvpq_&index=7
سوال یا فیدبکی داشتین حتما زیر ویدیو کامنت کنید
@ManiFoldsPython
https://www.youtube.com/watch?v=mKUNGuBIgKc&list=PLEQ3RnweNGA6v7qTMrDCcpgr9u91zvpq_&index=7
سوال یا فیدبکی داشتین حتما زیر ویدیو کامنت کنید
@ManiFoldsPython
YouTube
صفر تا صد در مورد DI Container ها
تو این ویدیو میخوام توضیح بدم چطور DI Container بسازیم؟ و اینکه مفهوم DI Container یعنی چی
✍️ https://github.com/ManiMozaffar/testing-101
🌍LinkedIn: https://www.linkedin.com/in/manimozaffar
👨💻 Github: https://github.com/ManiMozaffar
🔖 Chapters:
00:00…
✍️ https://github.com/ManiMozaffar/testing-101
🌍LinkedIn: https://www.linkedin.com/in/manimozaffar
👨💻 Github: https://github.com/ManiMozaffar
🔖 Chapters:
00:00…
👍7
چه اتفاق هایی میفته بنظرتون؟ ۱. اکسپشن میده ۲. لیست تو تاپل اپدیت میشه ۳. ایدی تاپل تغییر میکنه ۴. ایدی تاپل تغییر نمیکنه
Final Results
21%
۱ و ۴
9%
۱ و ۲ و ۴
38%
۲ و ۴
12%
۱ و ۳
12%
۲ و ۳
9%
۱ و ۲ و ۳
🤔8
Python BackendHub
تو قسمت هفتم از پلی لیست اصول تست نویسی در مهندسی نرم افزار، بررسی کردم DI Container یعنی چی و Depends تو FastAPI چطور پیاده میشه و یک فریم ورک پایتونی به نام dependency injector هم بررسی کردم و در اخر یک کانیتر هم خودمون نوشتیم ✌️ https://www.youtube.co…
هرچقدر تست نویسی مهمه, ولی بیایم قبول کنیم واقعا تست نویسی حوصله سربره 😂🤝
چیزی خلق نمیکنیم. فقط باگ پیدا میکنیم. به عنوان QA حتی اون باگم نمیتونید برطرفش کنید 😁
@ManiFoldsPython
چیزی خلق نمیکنیم. فقط باگ پیدا میکنیم. به عنوان QA حتی اون باگم نمیتونید برطرفش کنید 😁
@ManiFoldsPython
👍13👎2🥴2😁1
Python BackendHub
چه اتفاق هایی میفته بنظرتون؟ ۱. اکسپشن میده ۲. لیست تو تاپل اپدیت میشه ۳. ایدی تاپل تغییر میکنه ۴. ایدی تاپل تغییر نمیکنه
اما بپردازیم به این سوال... جواب گزینه ۱ و ۲و ۴ هست. این کد در صورتی که اکسپشن میده ولی کار میکنه! دلیلش چیه؟ چرا اینطور شد؟
اول نیازه که ساختمان داده رو خوب بشناسید. وقتی میگیم آبجکتی immutable هست یعنی چی؟ اگه اینو متوجه میشدین اصلا گزینه هایی که ۳ توشون بود رو انتخاب نمیکردین.
پس تو پارت یک میپردازم به تفاوت بین immutable ها و mutable ها.
کانسپت immutable یعنی آبجکتی که تو مموری memory id اش تغییر نمیکنه و ثابته. قابل تغییر نیست. پس شما مثلا یک تاپلو به یک تاپل دیگه اضافه کنید چه اتفاقی میفته؟ id تاپل تغییر میکنه. یعنی پایتون براتون یک تاپل جدید میسازه از روی دو تاپل قبلی, و یک جای دیگه مموری ذخیرش میکنه. و دو تاپل قبلی رو پاک میکنه از مموری (اگه رفرنسشون صفر شده باشه و باقی شروط gc collection رعایت شده باشه). برای همینه که عملیات اضافه کردن دو تاپل به هم عملیات پر هزینه ای هست. اما چرا اینجا id اش تغییر نکرد؟ آبجکت immutable وقتی id اش تغییر میکنه که آبجکتی داخلش id اش تغییر کنه. اینجا تاپلی داریم که داره مثلا به لیستی از ایدی یک داخلش رفرنس میده. بنابراین اگه لیست تغییر کنه دلیل نمیشه تاپل هم تغییر کنه. ایدی لیست ثابت میمونه. پس تاپل میتونه داخلش mutable هایی داشته باشه که تغییر کنند بدون اینکه هزینه اضافه و جا به جایی تو مموری داشته باشه
داریم:
پس مشکلی نداره تغییر محتوایی داخل تاپل که mutable باشه. ولی اگه immutable باشه طبیعتا آبجکت توش باقی میمونه. مثال زیرو ببینید ->
چه اتفاقی افتاد؟ string تغییر کرده ولی تاپلمون تغییر نکرده. چرا؟ اگه id استرینگ رو بگیرین و مقایسه کنید متوجه میشین که پایتون برامون یک string object جدید ساخته به نام hello world با یک id دیگه. چون استرینگ immutable هست. ولی آبجکت قبلی که فقط hello بود همچنان همون آیدی رو داره و تاپل به همون آبجکت رفرنس زده بود. برای همینه که توی تاپل تغییر نمیکنه string چون رفرنسی هست به آبجکتی که تو خط اول ساخته بودیم.
@ManiFoldsPython
اول نیازه که ساختمان داده رو خوب بشناسید. وقتی میگیم آبجکتی immutable هست یعنی چی؟ اگه اینو متوجه میشدین اصلا گزینه هایی که ۳ توشون بود رو انتخاب نمیکردین.
پس تو پارت یک میپردازم به تفاوت بین immutable ها و mutable ها.
کانسپت immutable یعنی آبجکتی که تو مموری memory id اش تغییر نمیکنه و ثابته. قابل تغییر نیست. پس شما مثلا یک تاپلو به یک تاپل دیگه اضافه کنید چه اتفاقی میفته؟ id تاپل تغییر میکنه. یعنی پایتون براتون یک تاپل جدید میسازه از روی دو تاپل قبلی, و یک جای دیگه مموری ذخیرش میکنه. و دو تاپل قبلی رو پاک میکنه از مموری (اگه رفرنسشون صفر شده باشه و باقی شروط gc collection رعایت شده باشه). برای همینه که عملیات اضافه کردن دو تاپل به هم عملیات پر هزینه ای هست. اما چرا اینجا id اش تغییر نکرد؟ آبجکت immutable وقتی id اش تغییر میکنه که آبجکتی داخلش id اش تغییر کنه. اینجا تاپلی داریم که داره مثلا به لیستی از ایدی یک داخلش رفرنس میده. بنابراین اگه لیست تغییر کنه دلیل نمیشه تاپل هم تغییر کنه. ایدی لیست ثابت میمونه. پس تاپل میتونه داخلش mutable هایی داشته باشه که تغییر کنند بدون اینکه هزینه اضافه و جا به جایی تو مموری داشته باشه
داریم:
lst = [1, 2]
tpl = (lst, 1)
id_1 = id(tpl)
lst.append(3)
id_2 = id(tpl)
assert id_1 == id_2
پس مشکلی نداره تغییر محتوایی داخل تاپل که mutable باشه. ولی اگه immutable باشه طبیعتا آبجکت توش باقی میمونه. مثال زیرو ببینید ->
string = "Hello"
tpl = (string, 1)
id_1 = id(tpl)
string += " World"
id_2 = id(tpl)
assert id_1 == id_2
print (tpl) # ('Hello', 1)
print(string) # 'Hello World'
چه اتفاقی افتاد؟ string تغییر کرده ولی تاپلمون تغییر نکرده. چرا؟ اگه id استرینگ رو بگیرین و مقایسه کنید متوجه میشین که پایتون برامون یک string object جدید ساخته به نام hello world با یک id دیگه. چون استرینگ immutable هست. ولی آبجکت قبلی که فقط hello بود همچنان همون آیدی رو داره و تاپل به همون آبجکت رفرنس زده بود. برای همینه که توی تاپل تغییر نمیکنه string چون رفرنسی هست به آبجکتی که تو خط اول ساخته بودیم.
@ManiFoldsPython
👍11❤🔥1🤡1
Python BackendHub
چه اتفاق هایی میفته بنظرتون؟ ۱. اکسپشن میده ۲. لیست تو تاپل اپدیت میشه ۳. ایدی تاپل تغییر میکنه ۴. ایدی تاپل تغییر نمیکنه
تو پارت دوم میپردازم به اینکه چرا اصلا اکسپشن خورد ولی کد کار کرد؟
پس فهمیدیم که میشه توی تاپل رو تغییر داد به شرطی که mutable باشه. وقتی از سینتکس += استفاده میکنیم تو پایتون داندر مجیک متود iadd رو صدا میزنیم. ابتدا میاد لیست رو append میکنه و طبیعتا آیدیش یکسان میمونه چون mutable هست. .تو قدم بعدی پایتون میاد رو سطح آبجکت tuple و اونجا اکسپشن میده. چرا؟ چون ابجکتی که اپدیت شده رو میخواد assign کنه به ایندکسی از تاپل. این موضوع خطا میده چرا؟ چون نمیتونه یک تاپل (بدون اینکه یک تاپل جدید بسازه) آبجکتی توش تغییر کنه. در صورتی که tuple همچنان داره رفرنس میزنه به آیدی لیستی که قبلا وجود داشته. و چون توی اون مموری آدرس لیست تغییر کرده پس تاپل آپدیت میشه.
یعنی همچین اتفاقی میفته:
tpl[0].__iadd__("Awesome")ا
۱. یعنی فکر کنید اول داره لیست append میشه. اونجا اکسپشن نمیخوره.
۲. توی خود آبجکت تاپل داره اکسپشن میخوره که داره سعی میکنه به ایندکس دسترسی پیدا کنه و آبجکت جدید رو بهش assign کنه.
پس کلا
tpl[...] +=
اکسپشن میخوره. بدون توجه به اینکه ایا واقعا id خود اون ایندکس تغییر کرده بود یا نه.
همین مثال رو شما با دیتا immutable چک کنید جوابش میشه گزینه ۱ و ۴.
@ManiFoldsPython
پس فهمیدیم که میشه توی تاپل رو تغییر داد به شرطی که mutable باشه. وقتی از سینتکس += استفاده میکنیم تو پایتون داندر مجیک متود iadd رو صدا میزنیم. ابتدا میاد لیست رو append میکنه و طبیعتا آیدیش یکسان میمونه چون mutable هست. .تو قدم بعدی پایتون میاد رو سطح آبجکت tuple و اونجا اکسپشن میده. چرا؟ چون ابجکتی که اپدیت شده رو میخواد assign کنه به ایندکسی از تاپل. این موضوع خطا میده چرا؟ چون نمیتونه یک تاپل (بدون اینکه یک تاپل جدید بسازه) آبجکتی توش تغییر کنه. در صورتی که tuple همچنان داره رفرنس میزنه به آیدی لیستی که قبلا وجود داشته. و چون توی اون مموری آدرس لیست تغییر کرده پس تاپل آپدیت میشه.
یعنی همچین اتفاقی میفته:
tpl[0].__iadd__("Awesome")ا
۱. یعنی فکر کنید اول داره لیست append میشه. اونجا اکسپشن نمیخوره.
۲. توی خود آبجکت تاپل داره اکسپشن میخوره که داره سعی میکنه به ایندکس دسترسی پیدا کنه و آبجکت جدید رو بهش assign کنه.
پس کلا
tpl[...] +=
اکسپشن میخوره. بدون توجه به اینکه ایا واقعا id خود اون ایندکس تغییر کرده بود یا نه.
همین مثال رو شما با دیتا immutable چک کنید جوابش میشه گزینه ۱ و ۴.
@ManiFoldsPython
👍5
متوجه شدید فرق بین mutable و immutable رو و چرا این اتفاق افتاد یا ویدیو بگیرم بعدا؟
Anonymous Poll
51%
اره متوجه شدم
49%
نه ویدیو بگیر
Python BackendHub
تو قسمت هفتم از پلی لیست اصول تست نویسی در مهندسی نرم افزار، بررسی کردم DI Container یعنی چی و Depends تو FastAPI چطور پیاده میشه و یک فریم ورک پایتونی به نام dependency injector هم بررسی کردم و در اخر یک کانیتر هم خودمون نوشتیم ✌️ https://www.youtube.co…
نیاز به یک فیدبک هم دارم تو تولید محتوام, معمولا خودم بدم میاد از ویدیو های توتوریالی که خیلی تند تند همه چیزو نشون میدن انگار که مخاطب هم مثل خودشون اون مطلبو بلده! هی باید pause کنم ببینم چی نوشته و چرا اینکارو کرده.اما از طرفی میزان دقیقه رو به شدت بالا میبره اگه بخوام همیشه کامل توضیح بدم.
من با ویدیو های arjan خیلی حال میکنم چون در عین حالی که کوتاهه, ولی خیلی توضیح داره.
کسایی که حداقل یک ویدیو دیدن, بنظرتون من دارم کم توضیح میدم؟یا به اندازه توضیح میدم؟یا زیاد توضیح میدم. مثلا فیلم DI Container رو واقعا میشد تو ۷ دقیقه هم جمعش کرد.
@ManiFoldsPython
من با ویدیو های arjan خیلی حال میکنم چون در عین حالی که کوتاهه, ولی خیلی توضیح داره.
کسایی که حداقل یک ویدیو دیدن, بنظرتون من دارم کم توضیح میدم؟یا به اندازه توضیح میدم؟یا زیاد توضیح میدم. مثلا فیلم DI Container رو واقعا میشد تو ۷ دقیقه هم جمعش کرد.
@ManiFoldsPython
👍15
مصاحبه بابی ۹ روز دیگست با tech immigrant تو calendarتون بذارین که از دستش ندید🔥🔥
https://www.youtube.com/watch?v=dg5cliosE5w
به شخصه خیلی از بابی یاد گرفتم و واقعا ممنونشم🙌 خیلی به کامینیتی کمک های زیادی کرده
مصاحبه کنندشو نمیشناسم ولی میگن سوالات چالشی میپرسه 👀 ایده داشتین کامنت کنید شاید مصاحبه کننده کامنتتون رو دید :)))
@ManiFoldsPython
https://www.youtube.com/watch?v=dg5cliosE5w
به شخصه خیلی از بابی یاد گرفتم و واقعا ممنونشم🙌 خیلی به کامینیتی کمک های زیادی کرده
مصاحبه کنندشو نمیشناسم ولی میگن سوالات چالشی میپرسه 👀 ایده داشتین کامنت کنید شاید مصاحبه کننده کامنتتون رو دید :)))
@ManiFoldsPython
YouTube
🚀🇳🇱 لایو تجربه مهاجرت کاری بابی کلاود به هلند
سلام، من بابی هستم و تقریبا ۱۲ ساله که در حوزه مهندسی نرم افزار فعالیت میکنم، بیشتر سابقه کاریم در ایران به عنوان مهندس نرم افزار استک Python و DevOps بود، بعدش یک سال در ترکیه کار کردم و در حال حاضر هم یک سال میشه که در هلند به عنوان Master Data Engineer…
🔥14👍7❤1🥰1🤡1
Forwarded from Python BackendHub
The software mindset
قیمت این کورس از ۲۳۰ دلار شروع میشه تا ۷۰۰ دلار که Arjan میفروشه. حالا به هر طریقی دانلود کردیم (با تشکر از سایه بابت معرفی اون طریق 😁)
گذاشتم تو کانال زیر. داره اپلود میشه کامل نشده.
https://news.1rj.ru/str/+wHLS0yl7y_M4Yzdk
این کورس رو حتمااااا ببینید (البته اگه با غیر قانونی دیدنش مشکل ندارین)
مباحثش به شدت مهمه! تو عکس تایتل هاشو گذاشتم.
خودمم دیروز دانلودش کردم که ببینم.
@ManiFoldsPython
قیمت این کورس از ۲۳۰ دلار شروع میشه تا ۷۰۰ دلار که Arjan میفروشه. حالا به هر طریقی دانلود کردیم (با تشکر از سایه بابت معرفی اون طریق 😁)
گذاشتم تو کانال زیر. داره اپلود میشه کامل نشده.
https://news.1rj.ru/str/+wHLS0yl7y_M4Yzdk
این کورس رو حتمااااا ببینید (البته اگه با غیر قانونی دیدنش مشکل ندارین)
مباحثش به شدت مهمه! تو عکس تایتل هاشو گذاشتم.
خودمم دیروز دانلودش کردم که ببینم.
@ManiFoldsPython
👍11❤2