pybackendhub | Unsorted

Telegram-канал pybackendhub - Python BackendHub

-

Learning python & Backend Engineering, with Mani! Youtube: https://www.youtube.com/@GitOverHere Github: https://github.com/ManiMozaffar Linkedin: https://www.linkedin.com/in/manimozaffar Admin: @Mani_nikou لینک گروه: https://t.me/PythonFellow

Subscribe to a channel

Python BackendHub

همیشه با خودم فکر میکردم چی میشد اگه همونطوری که FastAPI ریسپانس 2xx که ریترن میکنیم و تو سواگر میاره, بقیه حالت ها رو هم بیاره. مثلا اگه احراز هویت کاربر درست انجام نشد بهش تو سواگر نشون بده چه ریسپانسی ممکنه بگیره.

برای همین پروژه ای نوشتم که اینکارو انجام میده. شما تو این پروژه فقط یک خط کد میتونید این قابلیت رو به پروژتون اضافه کنید!

لینک گیتهاب
لینک داکیومنتشن

لایبری RichAPI با استفاده از Abstract Syntax Tree کل کد FastAPI شما رو آنالیز میکنه و میبینه زیر روتر های شما چه اکسپشن هایی ممکنه رخ بده و اون رو به سواگر اضافه میکنه!

اگه این پست یا این کتابخونه برات مفید بوده، خیلی ممنون می‌شم اگه بهش یه ستاره بدی. استار گیت هاب شما به من خیلی انگیزه میده که به توسعه و بهبود فریمورک‌های متن‌باز ادامه بدم. 🙂🙏


@PyBackendHub

Читать полностью…

Python BackendHub

خیلی وقت پیش یکی تو گروه پرسید چطور با زبونای دیگه مثل rust برای پایتون لایبری مینویسن.
منم جوابشونو دادم ولی یادم رفت بفرستم تو کانال. برای همین پست بعدیو به این موضوع اختصاص میدم.

Читать полностью…

Python BackendHub

اگه اسلاید انجام میدین
برای presentation یک چیزی
https://sli.dev/

این خیلی کمکتون میکنه.
حتی میتونید استرینگ فایل رو یک جا ذخیره نکنید. به جاش تو کدتون داشته باشید. و اعداد تو اسلاید رو dynamic جنریت کنید. اینطوری میتونید همیشه یک ورژن آپدیت اسلاید داشته باشین با ران کردن یک اسکریپت.

بیشتر به درد تیم های ریسرچ میخوره که زیاد اسلاید میزنن.

@PyBackendHub

Читать полностью…

Python BackendHub

AioClock
در ماه ۴ هزار دانلود داره 🚀
یک شرکت بزرگ تو برزیل هم داره ازش استفاده میکنه و تو لینکدین ازم تشکر کردن خیلی حس خوبی داشت :))

واقعا دوست دارم فول تایم اوپن سورس کار کنم. و مثلا همین پروژه naked sqlalchemy ام حاصله دو شب کار بود.
ولی متاسفانه هنوز به نقطه ای نرسیدم که بتونم کسب درآمد کنم از پروژه اوپن سورسم
برای همین به حمایتتون نیاز دارم این حمایت میتونه یک استار گیت هاب باشه, که پروژه هام بیشتر دیده شه و به اون نقطه نزدیک تر شم 🫶

فریم ورک/لایبری های مفید اوپن سورسی که تاحالا منتشر کردم:

AioClock - A modern python scheduling framework with dependency injection and modular integration support. Alternative for Rocketry or apscheduler

Naked SQLA - A simple and lightweight object mapper around SQLAlchemy core, simple alternative to SQLAlchemy ORM.


CfCrawler - Cloudflare scraper and cralwer written in Async, In-place library for HTTPX. Crawl website that has cloudflare enabled, easier than ever!

@PyBackendHub

Читать полностью…

Python BackendHub

امروز خیلی خوشحالم که بالاخره Naked SQLAlchemy رو معرفی میکنم، یه thin wrapper روی SQLAlchemy Core که کار با دیتابیس‌ها تو پایتون رو ساده‌تر می‌کنه. بعد از اینکه با pitfallهای ORM مواجه شدم—مثل اینکه داده‌های توی حافظه با وضعیت واقعی دیتابیس یکی نبود به خاطر پیچیدگی‌هایی مثل identity mapping و dirty tracking—فهمیدم این ویژگی‌هایی که قرار بوده کار رو راحت کنن، در واقع باعث پیچیدگی و سخت‌تر شدن یادگیری می‌شن. Naked SQLAlchemy با ترویج استفاده صریح از SQL و map مستقیم نتایج کوئری به dataclassهای پایتون، این لایه‌های غیرضروری رو کنار می‌زنه.

علاوه بر بهبود سرعت قابل توجه (تقریباً دو برابر سریع‌تر از ORM)، یادگیری Naked SQLAlchemy آسونه چون بر پایه دانشی هست که احتمالاً از قبل داری. امکاناتی مثل مپ کردن dataclass، مدیریت session بدون داشتن state، و امکان تعریف SQL View رو لایه ORM. با تمرکز روی ویژگی‌های اساسی و دوری از abstractionهای پیچیده، به شما این امکان رو می‌ده که کدهای واضح و ‍explicit و قابل نگهداری بنویسن، بدون دردسرهای معمول ORM.

فلسفه من اینه که کمتر، بیشتره. با کنار گذاشتن لایه‌های غیرضروری، Naked SQLAlchemy یه راهکار قابل اعتماد، کارآمد و ساده برای دسترسی به دیتابیس تو پایتون ارائه می‌ده. اگه دنبال ابزاری هستی که از pitfallهای معمول ORM دوری کنه و از تخصص SQLی که از قبل داری استفاده کنه، دعوتت می‌کنم Naked SQLAlchemy رو امتحان کنی.

لینک ریپازیتوری
لینک مستندات

اگه این پست یا این کتابخونه برات مفید بوده، خیلی ممنون می‌شم اگه بهش یه ستاره بدی یا این پست رو بازنشر کنی. حمایت شما به من انگیزه می‌ده که به توسعه و بهبود فریمورک‌های متن‌باز ادامه بدم. مرسی 🙂🙏

@PyBackendHub

Читать полностью…

Python BackendHub

حق 👌
درواقع این همین <توهم بدن شناگر> هست. این باور جا افتاده که شناگر ها بدشون عالیه، چون شناگر هستن. درصورتی که این باور توهمه، و اگه کسی مثل شناگر ها ورزش کنه لزوما نمیتونه بدنش عالی باشه.
درواقع ریشه این مشکل اینجاست:
Correlation is not causation
که نمیتونم خوب ترجمش کنم

@PyBackendHub

Читать полностью…

Python BackendHub

سادگی همیشه خبر از پیچیدگی میده!

خیلی وقت‌ها ما از کتابخونه و فریم‌ورک‌ها استفاده میکنیم به خاطر اینکه یک کار رو ساده میشه باهاشون انجام داد، از جنگو استفاده میکنیم چون کار باهاش راحته، داخل جنگو از DRF و simple jwt استفاده میکنیم چون ساخت api و لاگین رو برامون خیلی راحت میکنن. اما اینجا یک چیزی گاهی فراموش میشه.

سادگی همیشه خبر از پیچیدگی میده که شما نمیبینیدش.
یا به عبارت دیگه
کدی که شما الان نمیزنید رو قبلا یکی دیگه زده.

و شاید بگید خوب این خوبه دیگه یارو کد برای ما زده و استفاده می‌کنیم و لذتشو میبریم. تو خیلی از مواقع این درسته، ولی امان از اون روزی که بخوایید یکچیزی رو تغییر بدید که فریم‌ورک/کتابخونه براتون انجام داده :) اونجاست که این سادگی که ازش لذت میبردید تبدیل کابوس میشه :D

این رو نگفتم که بگم از جنگو استفاده نکنید یا فلان کتابخونه بده و ...

این گفتم که بدونید همیشه هر سادگی خوب نیست، گاهی بهتره تن به کار بدید و اون کد خودتون بزنید تا با نیاز شما هماهنگ باشه نه اینکه یک کتابخونه هزارخطی نصب کنید تا از ۱۰۰ خطش استفاده کنید.

@TorhamDevCH

Читать полностью…

Python BackendHub

یک مشکلی همیشه تو تستا وجود داره وقتی دارین از container استفاده میکنید
اینم اونه که container پورت میگیره. تستون به یک سری hostname و پورت دپندنسی داره و اینا خیلی راحت میتونن باهم conflict بخورن.
و خیلی‌مشکلات دیگه

و خیلی‌وقتا ماک یا استفاده از SQLite پاسخگو نیاز نیست مثلا ماگریشن دارین یا functionality خاصی از دیتابیس استفاده میکنید یا … و تستاتون flaky میشه

اکثر این مشکلات رو testcontainer حلشون کرده.

https://testcontainers.com/
@PyBackendHub

Читать полностью…

Python BackendHub

Otel 🤝 Drake

@PyBackendHub

Читать полностью…

Python BackendHub

https://martinheinz.dev/blog/92

یک پست خوب از بنیامین که تو گروه گذاشته بود که چرا نباید از ایمیج Alpine استفاده کنید. سه نکته همیشه موقع تصمیم گیری یادتون باشه:

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

۲. همیشه تحقیق کنید. پیرو مورد یک, خیلی وقتا نیازه که تصمیم گیری کنید. اگه چند تا آپشن دارین, گوگل کنید که چرا اون آپشن بده. و drawback های اون آپشن چیه. درکش کنید چطور کار میکنه. همینطوری از یک توتوریال برندارین کپی پیست کنید.

۳. بهتره داکیومنت که چرا اون تصمیم رو گرفتین. تحقیق کردین, دراوبک هارو متوجه شدید, و طبق یک منطقی یک چیزی رو انتخاب کردین. سعی کنید این پروسه رو داکیومنت کنید, چون ۲ ماه دیگه ممکنه یادتون نباشه چرا اون تصمیم رو گرفتین. و یا هم تیمی هاتون ممکنه بعدا گیج بشن چرا فلان تصمیم گرفته شده. تو این مثال فکر کنید یک نفر بگه خب ما این مشکلی که تو این مقاله گفته شده رو نداریم, پس میریم از ایمیج Alpine استفاده میکنیم. ۱ سال دیگه همون مشکل پیش میاد, چون فرضیاتی که داشتین موقع تصمیم گیری دیگه درست نیست. اشتراک دانش یکی از عناصر مهم پویایی یک تیم و پروداکته.

@PyBackendHub

Читать полностью…

Python BackendHub

یک راهنمایی بزرگ:‌لاجیک کد مشکل نداره.
خروجی کنسول اینه:


Ma: Hirad
Hir: Hirad


در صورتی که باید Ma: Mani و Hir: Hirad باشه. چرا؟

@PyBackendHub

Читать полностью…

Python BackendHub

۲۷۰ هزار خط جیسون رو تو ۴ ثانیه فایل جنریت کرد.
برای همچین کاری از gpt استفاده نکنید بهتره چون:

۱. امکان خطا خیلی زیاده. جی پی تی یک LLM هست نمیتونه <فکر> کنه صرفا پترن مچ میکنه و یک ضرب و تقسیم ساده هم اشتباه میکنه. پس هیچوقت برای کد جنریت کردن ازش استفاده نکنید.

۲. سواگر یا redoc یا خانواده این ابزار ها همه از openapi استفاده میکنن. openapi یک Specification هست برای نوشتن api های rest. و داره از json schema استفاده میکنه. جیسون اسکیما هم دوباره یک Specification هست که تایپ ولیدیشن رو بین همه زبون ها استاندارد کرده. این ابزار AI نیست. چون تعداد حالت محدوده, و جیسون مشخصه چه چیزایی میتونه داخلش باشه پس میتونه به صورت static درست ‍parse کنه.
اگه از جیسون پایندنتیک بسازین احتمال اینکه یک خروجی باشه که تو اون مثالتون نبوده هست. ولی اگه از json schema پایندنتیک بسازین, دیگه امکان نداره اشتباه parse کنید.

@PyBackendHub

Читать полностью…

Python BackendHub

مدیرها، بی‌خیال تیم‌هاتون بشید! لازم نیست کارمندها رو مثل بچه‌هایی که نیاز به مراقبت دائم دارن، کنترل کنید.

اونا نباید برای داشتن زندگی شخصی بیرون از کار معذرت‌خواهی کنن.
به تیم‌تون اعتماد کنید که کار رو تحویل بدن. اینجوری یه محیط مثبت و مولد می‌سازید که همه می‌تونن توش رشد کنن.
استخدام افراد درست فقط شروع کاره. جادوی واقعی زمانی اتفاق می‌افته که بهشون اعتماد کنید و قدرت بدید.
اعتماد یعنی اینکه به تیم‌تون آزادی بدید که کارشون رو بدون دخالت مستقیم شما مدیریت کنن. این نشون می‌ده که بهشون به‌عنوان آدم‌های بالغی که می‌تونن هم زندگی کاری و هم زندگی شخصی‌شون رو مدیریت کنن، احترام می‌ذارید.
این فقط محدود به مرخصی و تعطیلات نیست.
بحث اینه که یه فرهنگ بسازید که آدم‌ها توش احساس کنن می‌تونن کارشون رو به بهترین شکل ممکن انجام بدن - چه توی دفتر باشن، چه از راه دور کار کنن، یا حتی وسط روز کارهای شخصی‌شون رو انجام بدن.
تمرکز باید روی نتیجه باشه، نه “micromanagement”.
Micromanagement خلاقیت رو می‌کشه و انگیزه رو نابود می‌کنه.
اعتماد، برعکس، آدم‌ها رو به بهترین عملکردشون تشویق می‌کنه.
وقتی به تیم‌تون مالکیت کارهاشون رو می‌دید و بهشون فضا می‌دید که موفق بشن، می‌بینید که چطور رشد می‌کنن.

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

- ارتباطات رو باز نگه دارید: فضایی ایجاد کنید که آدم‌ها احساس امنیت کنن و بتونن ایده‌ها و فیدبک‌هاشون رو راحت به اشتراک بذارن.
- موفقیت‌ها رو جشن بگیرید: دستاوردها رو بشناسید و انگیزه رو بالا نگه دارید.
- از تعادل بین کار و زندگی حمایت کنید: به تعادل سالم تشویق کنید تا رفاه و بهره‌وری بهتر بشه.
♻️ Neha K Puri

@PyBackendHub

Читать полностью…

Python BackendHub

یک مقاله خیلی خوب برای توضیح دادن این میم:
https://avestura.dev/blog/explaining-the-postgres-meme

@PyBackendHub

Читать полностью…

Python BackendHub

حق!
ایلان ماسک یک حرف قشنگ زد، گفت هرچی قدم ها کوچیک تر باشه و سریعتر باشه، بهتره تا قدم های بلند تر. این موضوع چه استارت آپ چه FAANG صدق میکنه. حالا چرا؟
۳ نقطه تصور کنید تو یک بردار مختصات، اولی میشه software requirement. چیزی که دارید کد میزنیدش. دومی میشه business requirement. چیزی که بیزنس گفته نیاز هست بهش. و سومی میشه user needs. چیزی که واقعا یوزر‌ نیاز داره.

این ۳ نقطه تو واقعیت نزدیک بهم نیستن. چون بیزنس هیچوقت درک ۱۰۰درصدی از نیاز کاربر نداره، و نرم افزار سعی میکنه چیزی که بیزنس گفته رو پیاده کنه. نیاز انسان دائم در حال تغییره، پس نقطه سوم در حال تغییره رو نمودار. حالا منطقیه شما یک مسیر خیلی بزرگ رو برید؟ اون موقع میبینید دیگه اون نیازمندی وجود نداره وقتی به مرحله shipment رسیدین! ولی‌قدم هاتونو هرچی کوچیک و سریعتر کنید اون نقطه در حال حرکت رو بهش بهش نزدیک تر میشید و دنبالش میکنید.

@PyBackendHub

Читать полностью…

Python BackendHub

ما یک لایبری داریم تو راست به اسم pyo3 که بهت اجازه میده تو راست کد binding بزنی بدون اینکه بخوای یک عالمه بویلرپلیت بنویسی. اما چطور؟ core پایتون expose شده تحت لایبری C به اسم libpython

لایبری مثل Pyo3 که اجازه میده با راست برای پایتون کد binding بزنی اینطوری کار میکنه که میاد اون لایبری libpython رو wrap میکنه ولی به صورت تایپ سیف و مموری سیف. من الان یکم داکشو خوندم فکر کنم بخوام یک ادد ساده بنویسم این شکلی میشه:


use pyo3::prelude::*;

#[pyfunction]
fn add(a: i32, b: i32) -> i32 {
a + b
}

#[pymodule]
fn my_module(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add, m)?)?;
Ok(())
}


و ظاهرا خوده ‍PyO3 برام فایل stub هم میسازه که مشخص شه اینترفیس پکیجم چطوری شده.


def add(a: int, b: int) -> int


بعد با این لایبری میام کد rustمو کامپایل میکنم. میزنم maturin develop که پکیج رو کامپایل میکنه به فایل so یا dll. و خودش هم میفرسته رو pypi همون فایلو با دستور maturin publish.
بعدش پکیجمو نصب میکنم نویسم

from my_module import add
add(1,2)

و جوابش میاد میشه ۳. اما تو ران تایم چطوری اجرا میشه؟

فایل .so بهش میگن shared object.
وقتی داری یک چیزی رو کامپایل میکنی دو حالت داره:
۱. یا اینکه بیای static linking انجام بدی. یک executable میدی بیرون که اونو اجرا میکنی درجا اجرا میشه.
۲. یا اینکه بیای dynamic loading انجام بدی. یعنی نمیای executable بدی که قابل اجراست و و همه چیز داخلش هست. به جاش میای باینری کد برنامتو کمپایل میکنی به همراه یک سری symbol و executable نیست دیگه مستقیم.سیمبل میشه function ها و variable هات.و یک برنامه دیگه اونوقت میتونه بیاد با استفاده از اون سیمبل ها, به صورت داینامیک از ماشین کدت استفاده کنه.

حالا چطوری؟ تو سیستم عامل یک چیزی وجود داره به اسم dynamic loader که وظیفش اینه دقیقا همین فایل های .so رو ران کنه. اینم رفرنس لینوکیسش.

در نهایت مفسر پایتون میتونه تو ران تایم کد rust ای که تحت فایل .so داری رو با داینامیک لودر ران کنه. و اون کد so دقیقا توابعی که تو راست نوشتی ماشین کدشو به صورت callable پایتون داره و از اون جایی که libpython هم wrap شده میتونی از api های libpython استفاده کنی. مثل گرفتن GIL و ریلیز کردنش. بقیه extension های ‍C هم همینطوری کار میکنند.

@PyBackendHub

Читать полностью…

Python BackendHub

بد ترین نحوه استفاده از AI
برید یک کدی باهاش جنریت کنید، خودتونم نفهمید چی شده و همونو مستقیم تو پروداکشن استفاده کنید ✅

اگه ۴ ساعت برای نوشتن کوئری زمان میذارین یعنی‌هنوز SQL بلد نیستین و در پروسه یاد گیری هستین که مشکلیم نداره. و قطعا این روش‌از‌یک جایی به بعد جواب‌نمیده، هرچی تسک پیچیده تر شه کوئری که مینویسه ضعیف تره و اصلا ریزالتی که میخواین رو نمیده. خودتونم متوجه نمیشین و ران میکنید و اتفاقی ریزالتی مشابه اون چیزی که میخواین میگیرین و فکر میکنید کار کرده.

@PyBackendHub

Читать полностью…

Python BackendHub

Next one is loading... ⌛️🚀

@PyBackendHub

Читать полностью…

Python BackendHub

یکی از دلایل اصلی که این لایبری رو نوشتم این بود:

تو یک سناریو آپدیت نسبتا پیچیده, چیزی که ORM بعد از آپدیت از حالت آخر row برمیگردوند و چیزی که واقعا از دیتابیس برگشته بود یکی نبود

همین موضوع راجب view هم رخ میده. که دلایلش داکیومنت شده اینجا که چرا این موضوع fail میشه.

تست فیل شدن آپدیت
تست فیل شدن view

دوم خیلی نگران کننده نیست, چون همه از view استفاده نمیکنن. ولی باگ اول تقریبا تو کله سورس کدمون هست

@PyBackendHub

Читать полностью…

Python BackendHub

یک توصیه خوب برای جونیور ها و کسایی که تازه شروع کردن
@PyBackendHub

Читать полностью…

Python BackendHub

میتونید git-fame رو نصب کنید
و با وارد کردن این دستور, ببینید چند خط با یک پسوند الان رو سورس کد وجود داره که شما کامیت کردین؟ (کدایی که قبلا زده شده و پاک شده و دیگه تو سورس کد نیست رو حساب نمیکنه).


git-fame --incl '(.*)py$'


@PyBackendHub

Читать полностью…

Python BackendHub

من شروع به استفاده testcontainer کردم و واقعا خوبه.
اگه دیتابیستون رو میبرید رو pg چند آپتمایزشن میتونید انجام بدید که سرعت دیتابیستون خیلی بالا بره:

fsync=off
full_page_writes=off
shared_buffers=256MB
checkpoint_timeout=30min
checkpoint_completion_target=0.9
autovacuum=off

اینکه تک تک چی هستن رو توصیه میکنم گوگل کنید تو یک پست نمیگنجه بخوام کلش رو توضیح بدم. آف کردن این چیزا reliability دیتابیس رو به شدت پایین میاره ولی درعوض آپریشن های معمولی خیلی سریعتر انجام میشه مخصوصا fsync. و خب یک دیتابیس موقت تستی که قراره بعد تست بیاد پایین و پاک شه اصلا reliability براش معنایی نداره.

@PyBackendHub

Читать полностью…

Python BackendHub

وات د فاک
یک پکیج داریم به اسم is odd تو جاوا اسکریپت
به صورت هفتگی ۳۰۰۰ هزار دانلود داره
و سایز آنپک پکیج هم ۶ کیلو بایته 💀

@PyBackendHub

Читать полностью…

Python BackendHub

یک گاز بدید ۴۰۰ ستاره بشه 😁

برای کسایی که نمیدونن این ریپو چیه, یکی از کامل ترین گاید لاین های نوشتن رزومست.
در آینده خیلی نزدیک به همین داکیومنت گایدلاین اختصاصی برای نوشتن رزومه بدون تجربه کاری هم میذارم.

داکیومنت
خود ریپو برای ستاره دادن

با تیم Flowcv هم در ارتباطم و اگه همه چیز خوب پیش بره در آینده کمی دورتر, اینترفیسی خواهیم داشت برای بنچمارک و tailor کردن رزومتون به صورت آنلاین (و یا از طریق CLI به صورت لوکال) با استفاده از نرم افزار رایگانشون.

@PyBackendHub

Читать полностью…

Python BackendHub

برای اینکه بفهمین چطور کار می‌کنه، اول یه مثال ساده‌تر رو در نظر بگیرین:


adders = []
for x in [1, 2, 3]:
adders.append(lambda number: number + x)

for adder in adders:
print(adder(3))


قاعدتاً باید خروجی‌ها ۴، ۵ و ۶ باشن، درسته؟ چون یه لیست از تابع‌های lambda داره که هر کدوم یه عدد می‌گیرن و x رو بهش اضافه می‌کنن.
ولی در واقع خروجی‌ها ۶، ۶ و ۶ هستن! چرا این اتفاق می‌افته؟
چون این lambdaها تو این مثال closure هستن. تو پایتون، توابع closure زمانی اجرا می‌شن که صدا زده بشن، نه وقتی که تعریف می‌شن! و به متغیرهایی که تو scopeشون هست رفرنس می‌زنن.


def foo():
adders = []
for x in [1, 2, 3]:
adders.append(lambda number: number + x)
return adders


def main():
adders = foo()
x = 5
for adder in adders:
print(adder(3))


تو این مثال، x یه بار تو foo تعریف شده و یه بار تو main. وقتی تو main اون closureها رو صدا می‌زنه که تو foo تعریف شده بودن، xی که استفاده می‌کنن همونیه که تو foo بوده، نه اون x تو main.یعنی الان تو این مثال x داخل lambda عدد ۳ میشه نه ۵.
چرا؟ چون داخلش توابع ‍closure یک cell هست که arguement رو ذخیره کرده. و تو همون اسکوپی که تعریف شده اون مدام آپدیت میشه اگه تغییر کنه. بنابراین اینجا چون scope تابع main دیگه با closureمون یکی نیست پس دیگه تغییر نمیکنه.


یک مقاله برای درک بهتر این موضوع تو medium
یک بلاگ راجب اشتباهات رایج تو پایتون این شکلی

@PyBackendHub

Читать полностью…

Python BackendHub

داشتم کد مینوشتم
یک گافه خیلی بد دادم اصلا حواسم نبود.
باگه این کد کجاست؟

@PyBackendHub

Читать полностью…

Python BackendHub

https://jsontopydantic.com/
خیلی خوبه. بهش جیسون میدین, بهتون مدل pydantic اون جیسون رو میده. برای integrate کردن api عالیه که سریع یک مدل داشته باشین.

یک ابزار دیگه هم هست که advance تره. یک cli tool هست که بر اساس openapi یا json یا xml براتون مدل پایندنتیک مینویسه.

https://github.com/koxudaxi/datamodel-code-generator/

@PyBackendHub

Читать полностью…

Python BackendHub

یک پست خیلییی خوب دیدم تو لینکدین حیفم اومد باهاتون به اشتراک نذارم!

لینک پست


تو پست بعدی ترجمه شدشو با chatgpt میذارم
@PyBackendHub

Читать полностью…

Python BackendHub

این meme رو دیدم خیلی جالب بود… عمق دانشنتون از PostgreSQL تا چه حدیه؟ یکم حس بی سوادی دست داد بهم :)) تو یکی از پستا چند روز پیش راجب یکیش پرداخته بودم 😁

Every sql operator is actually a join? WTF?😂

@ManiFoldsPython

Читать полностью…

Python BackendHub

من یک پروژه رو چطور توسعه می‌دم؟ شما چطور توسعه می‌دید؟!

ابتدای کار، نه خبری از git هست، نه vscode و نه هیچ لینتر یا پلاگین خاصی. صرفا یه ایده زده به سرم و فقط می‌خوام تست کنم ببینم عملی هست یا نه. (به عبارتی، آیا پتانسیل پیشرفت یا ارزش اینو داره که زمان و انرژی بیشتری روش بذارم؟)

در حدی که کل کار توی یه main.py در میاد! 🫡

اگه پتانسیل رو داشت و به نتایج خوبی رسیدم، راجع بهش پست می‌ذارم و نظر و فیدبک می‌گیرم. رفقا.. اگه ابزار Xی وجود داشت که مشکلاتی از قبیل W و Y و Z رو حل می‌کرد، شما ازش استفاده می‌کردید؟ بنظرتون به چه صورت رلیز شه؟ چطوری در دسترس باشه؟ از قابلیت‌هایی که دوست دارید داشته باشه بگید و..

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

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

افراد زیادی هستن توی مارکت که تحت عنوان Solopreneur کار می‌کنن. یک سری از ابزارهایی که شما امروز ازش استفاده می‌کنید (یا شاید پولی بابتش می‌پردازید) توسط این افراد ساخته شدن. بارها دیدم که یه سریاشون حتی می‌گن، تمرکزشون صرفا روی دلیور کردن فیچر به هر قیمتیه. حتی از version controller هم استفاده نمی‌کنن!! فقط push می‌کنن. هیچ تستی هم ندارن! آنچنان کدبیس سنگینی ندارن و اکثر تمرکزشون روی Shipmentه.

مارک لو (Marc Lou) چند وقت پیش یه توییت زد که یکی از ابزارهایی که قبلا درست کرده بود رو بازخرید کرده. گویا ابزار رو طراحی کرده بود و بخاطر شرایط مالی مجبور شد به قیمت ۱۰ هزارتا واگذار کنه به یه تیم دیگه. چند روز پیش بعد از چند ماه دوباره پروژه رو از اون تیم خرید (رایگان) و داره روش کار می‌کنه. نکته‌ای که این وسط هست، زمانی که این پروژه دست Marc نبود، هیچ توسعه‌ای روش انجام نمی‌شد! حالا خود مارک دلیلش رو دقیق نگفت ولی من حدس می‌زدم به خاطر همون طرز تفکر تمرکز ۱۰۰ درصدی روی shipment باشه.

یعنی مارک با این طرز تفکر توسعه این ایده رو پیش برده بود و خب خروجی کار نهایتا یه تیکه کده که صرفا کار می‌کنه، پول می‌سازه و ظاهرا استیبله ولی به چه قیمت؟ نه تست داره. نه تمیزه. نه داکیومنت درستی داره و واسه onboard شدن روش چاره‌ای جز ریویو کردن کد ندارید. خب تمام این مسائل باعث میشن که توسعه این پروژه واسه یه تیم جدید یه معضل باشه. اگه قرار باشه این ایده پول بیشتری بسازه، همزمان با تغییر نیاز کاربرها باید اون ایده هم تغییر کنه و نیازها رو براورده کنه.

ولی خب اون تیم با این خرید، یه حجم خوبی از مارکت رو از وجود خودش آگاه کرد و خیلیم ضرر نکرد!

توییت مارک: https://twitter.com/marc_louvion/status/1834574006827250020

دوست دارم نظر شما رو هم بدونم. شما چیکار می‌کنید؟ فلوی توسعه شما به چه شکله؟

Читать полностью…
Subscribe to a channel