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

یکی از دلایلی که از ORM بدم میاد اینه که خیلی وقتا خیلی implicit میشه. و یکی از دلایلی که خوشم میاد از SQLAlchemy اینه که نسبت به ORM های دیگه تا حد زیادی میشه ازش به عنوان query builder استفاده کرد با کمی چاشنی orm. که همون چاشنی یک وقتا مشکل ایجاد میکنه :)) وقتی دارین با SQLAlchemy کار میکنید باید حواستون باشه به state آبجکت. یعنی چی؟


async with session_maker.begin() as transaction:
query = sa.select(User).where(User.id == 1).limit(1)
user = await session.scalar(query)
user.name = "Mani"
await transaction.rollback()

print(user.name) # Mani ?

وقتی دارم آبجکت ORM رو mutate میکنم و بعد session رو فلاش میکنم درواقع میاد یک query میزنه و فقط اون تغییری که دادم رو تو دیتابیس اعمال میکنه. (به این کار میگن dirty tracking و تو orm های دیگه مثل جنگو میاد کل state آبجکت رو اعمال میکنه تو دیتابیس. نمیاد بگه فقط name رو تغییر بده).

اولین مشکل اینجاست که وقتی به پراپرتی name تو خط آخر برای user دارم دسترسی پیدا میکنم, ران تایم ارور میخورم. خوده sqlalchemy یک ستینگی داره که آبجکت هارو وقتی session بسته میشه expire میکنه. این expire کردن یعنی دیگه اون آبجکت اون property رو نداره. که البته میشه گفت expire_on_commit=False. یعنی اگه من کامیت کردم شما این آبجکت رو اکسپایر نکن. دیگه نباید ران تایم ارور بخورم.
اما نه , همچنان ران تایم ارور میخورم. چرا؟ چون rollback دارم میکنم transaction رو. درواقع ستینگی وجود نداره تو sqlalchemy که بگه expire_on_rollback. اگه رول بک نمیکردم مشکلی نداشت.
این دقیقا برعکس کانسپت type stateعه. تایپینگ داره به من میگه مشکلی نداره از این پراپرتی استفاده کنی. ولی ران تایم یک جور دیگه داره به من میگه.

که خیلیم منطقیه! چون شما فکر کنید من دارم میگم name رو بذار Mani. بعد بهش میگم رول بک کن. خب طبیعتا تو دیتابیس name دیگه mani نیست. نیم همون چیزیه که قبل از مانی بوده. پس تو درستی رفتارش شکی نیست. ولی با یک جمله موافقم
ORM is conceptually wrong
چرا اینقدر پیچیده کردم سناریو رو؟ و تبدیلش کردم به یک محیط implicit که درک و دیباگش اینقدر سخته؟ چرا نمیشد سادش کرد و آپدیت کردن state آبجکت رو گذاشت به عهده برنامه نویس؟ چرا اصلا یک دیتاکلس باید استیت داشته باشه؟

راه حل خودم چیه؟ راه حل خیلی منطقی ندارم ولی:
۱. سعی میکنم هیچوقت آبجکتی رو mutate نکنم. به جاش یک query میزنم که هم UPDATE کنه و هم RETURNING میکنم با خوده SQL آبجکت جدید رو.
۲. خوده transaction یک متودی داره به اسم expunge_all(). من begin رو overwrite کردم و اونو همیشه صدا زدم. اینطوری بهم گارانتی میده که اون آبجکت همیشه قابل دسترسیه. متاسفانه تنظیماتی نداره sqlalchemy که همیشه بای دیفالت اینکارو انجام بده. ولی میتونید اون کانتکس منیجر رو اوررایت کنید که همیشه اون expunge انجام شه.




@asynccontextmanager
async def my_begin(session_maker):
async with session_maker() as transaction:
try:
yield transaction
except Exception as exc:
transaction.expunge_all()
raise exc

async with my_begin() as transaction:
query = sa.select(User).where(User.id == 1).limit(1)
user = await session.scalar(query)
user = sa.update(User).where(User.id == user.id).values({User.name: "Mani"}).returning(User)
await transaction.rollback()

print(user.name) # No runtime issue -> Mani


@PyBackendHub

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

Python BackendHub

چهار روزه تو خونه نت ندارم، نت گوشیم کار میکنه، که خب شارژ گوشیم تموم میشه و فقط تو بالکن آنتن میده، برای همین دو سوم تایمی که میخوام کد بزنم نه استک اورفلویی هست نه داکیومنت آنلاینی نه گوگلی 😂

اولش سخت بود مخصوصا برای من که زیاد سرچ میکنم، ولی الان عادت کردم خیلی بهتر شده و دستم سریعتر شده :))

@PyBackendHub

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

Python BackendHub

برخی از مطالبی که در خصوص رزومه نویسی تهیه کردم

دوره رزومه نویسی و رشد در مسیر شغلی

چند درصد آگهی رو خوب بلدیم رزومه بفرستیم؟‌راهنما عملکرد بهتر در مصاحبه ها

قدم های مورد نیاز برای مهاجرت

ریپازیتوری آموزش رزومه نویسی با بیش از ۲۰۰ استار

معرفی ریسورس برای مصاحبه و بهتر کردن رزومه

@PyBackendHub

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

Python BackendHub

Same question, different places 😂
@PyBackendHub

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

Python BackendHub

بنظره من دونستن type interface خیلی به دانش شما کمک میکنه و تو نحوه کد زدتون تاثیر میذاره وقتی شروع میکنید بهش فکر میکنید.

حالا quiz امروز:‌ این جفت variable ها درواقع تایپ annotation اشون یکیه. جفتشون Mapping[str,str] هستن. بنظرتون pylance (یا pyright که میشه تایپ چکر vscode من) چطور تشخیص میده که بالایی mutable هست ولی پایینی mutable نیست؟

هینت:‌این سوال لزوما مربوط به پایتون نمیشه. یک قاعده کلی تو کامپیوتر ساینس هست.
@PyBackendHub

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

Python BackendHub

مصاحبه فنی سنیور با مانی

@BenDevelop
@PyBackendHub


https://www.youtube.com/watch?v=rh3acuXS3xw&t=633s

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

Python BackendHub

ایشو زده بودم تو pyright درواقع فهمیدم که باگ نیست. درواقع دیزاین اینطوریه.
ما روش های مختلفی برای resolve کردن تایپینگ داریم. طوری که pyright کار میکنه bidirectional type inference هست. یعنی چی؟
Constructors are typed by inheritance, and so the name is available when resolving the constructor, whereas variables are typed by synthesis, and so each variable must have a unique type.

دقیقا اتفاقی که تو select افتاده . تو sqlalchemy سلکت ۹ تا اورلود داره. یعنی برای ۹ اینپوت مختلف, تایپینگ مختلف داره.
یکی از این overload ها درواقع داره تایپینگ رو satisfy میکنه. یعنی این مسیر رو برعکس میره. درواقع داره چک میکنه که آیا Select[tuple[str]] با تایپ ریترن شده از اون فانکشن satisfy میشه یا نه. و چون یکی از این اورلود ها این satisfy میکنه بنابراین تایپ چکر ارور نمیده.

ولی وقتی assign اش میکنی به یک مقدار و بعد اون مقدار رو ریترن میکنی دیگه نمیره با همه constructor ها (که میشن همون overload ها) چک کنه تایپ satisfy میشه یا نه. داره دو تا تایپ رو باهم مقایسه میکنه.

پس هر موقع شما یک constructor داشتین که بر اساس ورودی ممکن بود تایپ های مختلف بده, باید حواستون باشه که حتما assign اش کنید به یک مقدار تا bidirectional نشه.

@PyBackendHub

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

Python BackendHub

یک باگ خیلی عجیب
فهمیدین چیه؟
@PyBackendHub

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

Python BackendHub

اگه از FastAPI استفاده می‌کنید و سعی دارید MVP بیارید بالا (درحدی که منابع زیادی مورد نیاز نباشه) پلتفورم‌های زیر Free Trial دارن و بدون پرداخت می‌تونید سرویس بک‌اندتون رو روشون بالا بیارید. داکیومنت و بلاگ هم در دسترس هست کافیه سرچ کنید.


1️⃣ - https://render.com/

2️⃣ - https://www.cyclic.sh/

3️⃣ - https://fly.io/

4️⃣ - https://leapcell.io/

5️⃣ - https://vercel.com/

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

Python BackendHub

نسخه جدید aioclock هم منتشر شد 🔥

تغییرات این نسخه:
- اضافه شدن پشتیبانی برای تسک های sync . هر فانکشن sync توسط aioclock تو تردپول با anyio ران میشه. ولی این رو خوده فانکشنی که دکوریت کردین تاثیر نمیذاره و تبدیل به کوروتین نمیشه و همونطور که استفاده کردین میتونید انجام بدید.

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


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

ممنون میشم استار بدید یا contribute کنید.

@PyBackendHub

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

Python BackendHub

این بدترین طرز فکریه که یک نفر میتونه داشته باشه، اینکه یک سری الاف (علاف؟) تو گیتهاب مجانی دارن کد میزنن. جدا از اینکه اون سری افراد چه درآمدی دارن که مهم نیست، اصلا طرز فکر اشتباهه.
سوال من اینه که شما مگه از یک ابزار اوپن سورس استفاده نمیکنی؟ کمترین contribution ای که میتونی داشته باشی اینه که اگه مشکلی میبینی تو اون ابزار، یک ایشو براش بذاری. این دیگه کمترین حالته.
همین مشکلم ممکنه خودت حل کنی. میتونی با شرکت هماهنگ کنی و همونو PR بدی بشی contributer.
و در نهایت این پروموشنی هست برای خودتون. من همین چند وقت با اینکه اصلا تمایلی نداشتم شرکتمو عوض کنم، ولی ۲ شرکت پروژه aioclock من رو دیده بودن خوششون اومد، و لطف کردن منو به مصاحبه دعوت کردن.(منظورم recruiter نیست)

خلاصه کسی که پروفایل گیتهابش مثل برف سفیده، بنظرم میتونه رد فلگ باشه!

@PyBackendHub

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

Python BackendHub

یک چیزی که من خیلی زیاد میبینم مخصوصا تو community خودمون اینه که اکثر مواقع سوال ها بدون context پرسیده میشن. و این context خیلی میتونه تو جواب سوال تاثیر داشته باشه. بذارین مثال بزنم:
سلام من میخوام پایتون یاد بگیرم. میشه بهم ۵ تا کتاب معرفی کنید؟
اوکی تخصصتون چیه؟‌بک اند کار میکنید؟ ML؟ دوآپسین و دنبال یک زبون اسکریپتی هستین؟ دیتا اینجینر هستین؟ از پایتون چه یوزکیسی دارین؟! چقدر الان بلدین؟ چیا بلدین؟ این رو جواب سوال تاثیر میذاره. ممکنه جواب رو ۱۸۰ درجه بچرخونه. مثلا یک مثال دیگه.

سلام من از playwright یا سلنیوم استفاده میکنم. میخوام یک element رو سلکت کنم. بنظرتون از چه سلکتوری استفاده کنم؟‌css selector یا xpath یا .. ؟

اگه QA باشین, من میگم css selector بهتره. با پراپرتی test-id تو html که اصلا برای همین کار خلق شده. چرا؟ چون خودتون HTML رو کنترل میکنید و به فرانت میتونید بگین تغییر بده.
ولی اگه دارین اسکرپ میکنید یک سایتی رو, اون موقع xpath selector بهتره. چون احتمال تغییر یک element صفحه html ای که خودتون کنترل میکنید با xpath خیلی کمتره تا با سلکتور. مثلا اگه فرانت از Material UI استفاده میکنه اصلا استفاده از سلکتور خیلی سخت تر میشه. ولی شما با xpath میتونید query های خیلی پیشرفته و پیچیده تری بنویسید. مثلا رو دکمه ای که داخل متنش "login" هست کلیک کن! این query همیشه جواب میده تا زمانی که design ux صفحه کلا تغییر کنه.

پس همیشه بنظرم وقتی سوال میپرسین کامل context بدید. اشکال نداره سوالتون ۴-۵ خط طولانی تر شه ولی جواب درست تری دریافت خواهید کرد.
@PyBackendHub

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

Python BackendHub

یک میم پیرو بحث امشب‌ گروه😂😂😂
@PyBackendHub

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

Python BackendHub

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

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

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

https://testcontainers.com/
@PyBackendHub

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

Python BackendHub

اگه ری اکت کار میکنید یک سری بزنید به این پروژه:
https://www.locatorjs.com/

کارش اینه که شما رو component ای که تو صفحه مرورگرت میبینی کلیک میکنی و میبرتت تو کد دقیقا قسمت مربوط بهش.‌😅👌

@PyBackendHub

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

Python BackendHub

مشکل روتر درست شد. فقط یک مشکل ریز داشت اونم این بود که وای فای تقریبا هر ۲-۳ دقیقه یک بار قطع میشه و یک bash script نوشتم که اگه قطع بود وای فای سعی کنه دوباره وصل شه :))

@PyBackendHub

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

Python BackendHub

#توصیه
وقتی دارین از SQLAlchemy استفاده میکنید و دارین یک چیزی سلکت میکنید
بهتره select from رو بنویسید
چون امروز یک ساعت درگیر یک باگی‌بودم، که یک آبجکت cte نسبتا پیچیده چند بار استفاده شده بود، و تو یکی از این دفعات sqlalchemy نمیتونست به درستی متوجه شه رو کدوم مدل باید سلکت from کنه (مدل اشتباهی رو داشت سلکت میکرد) با وجود اینکه فقط یک چیزو داشتم سلکت میکردم.
یعنی به جای
sa.select(Model)
بنویسید
sa.select(Model).select_from(Model)

کلا هرچی لاجیک compile کوئری رو بیرون تر بکشید و explicit تر باشه و به خوده SQL نزدیک تر باشه، بهتره، خیلی edge case وجود داره همیشه.

@PyBackendHub

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

Python BackendHub

Correlation is not causation
اشتباهی که به عنوان انسان و برنامه نویس زیاد انجام میدیم

تو این سایت همش رو نوشته. تازه نکته جالب اینجاست که خیلیاش ریسرچ و پیپیره.
https://www.tylervigen.com/spurious-correlations

@PyBackendHub

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

Python BackendHub

اما جوابش:
بحث ساب تایپ تو پایتونه (چه تو mypy چه تو pyright). که دو روش وجود داره
nominal typing
و
structural typing
وقتی من تو پایتون مینویسم
var = 2
طبق nominal typing خود تایپ چکر میفهمه تایپ var درواقع int هست. (یا حتی دقیقتر Literal 2)
و همیشه nominal به صورت strict بر پایه class hierarchy هست. و غلبه میکنه به structural type به شرطی که تو hierarchy tree اش اون تایپ رو داشته باشه. اگه نداشته باشه ارور میده (تو عکس ببین bar دقیقا همین کیسه)

برای همین شما بنویسی:
foo: int = 2

درواقع تایپ چکر به شما میگه تایپ foo اینت نیست. بلکه Literal 2 هست. تایپ چکر هم ایرادی به شما نمیگیره چون میگه int درواقع Literal 2 رو satisfy میکنه. ولی برعکسش درست نیست. یعنی ساده تر بگم literal 2 همیشه int هست. ولی int همیشه literal 2 نیست.

این موضوع رو تو عکس واضح تر نشون دادم با ۲ تایپی که خودم ساختم.

این رفتار که ایا این دو تایپینگ باید باشن یا فقط یکیش باشه یا چطوری هم دیگه رو satisfy میکنن ممکنه تو زبونا ممکنه فرق کنه ولی کانسپت language design هست.
@PyBackendHub

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

Python BackendHub

یک سری نکاتی که بنظرم تو ویدیو جا مونده بود

@PyBackendHub

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

Python BackendHub

اینم برای reproduce کردنش.

@PyBackendHub

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

Python BackendHub

کدو اول توضیح میدم چون خیلیا درک نکردن, این کد درواقع داره اینکارو میکنه
SELECT 1

شما وقتی تو sqlalchemy چیزی رو سلکت میکنی خودکار تبدیل به تاپلی از اون چیز میشه. مثلا من اگه 1 رو سلکت کنم میشه Select[Tuple[int]]
پس درواقع تایپ چیزی که دو تا فانکشن دارن ریترن میکنن تاپلی هست که فقط یک int هست.
ولی تو من signature فانکشن گفتم تاپلی از string عه. که خب تایپ اشتباهه.

حالا برگردیم به باگ:
تو فانکشن اول که correct هست تایپ چکر داره این موضوعو به من نشون میده. چون من گفتم q = ... و بعد q رو ریترن کردم.
ولی وقتی خوده فانکشن رو ریترن میکنم مستقیما تایپ چکر تشخیص نمیده. که خیلیی باگ عجیبیه 😂

@PyBackendHub

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

Python BackendHub

کسایی از chatgpt یک سوال میپرسن، یا یک کدی از استک اورفلو کپی پیست میکنن، توضیه میکنم بهشون حتما این مقاله زیر رو بخونید.
https://archive.ph/jRvwx

خلاصه بخوام بگم، کدشون رو داشتن از تایپ اسکریپت میبردن پایتون. مدل های دیتابیس رو دادن chatgpt از پریسما تبدیلش کنه به sqlalchemy. این وسط chatgpt برای یکی از مدل ها برای id مدل، به جای اینکه از دیفالت فکتوری استفاده کنه، از دیفالت استفاده میکرد. و اینطوری بود که اون مدل هروقت instance ای ازش ساخته میشد آیدی تکراری میشد. و دیتابیس ارور میداد. و این باگ باعث ضرر ۱۰ هزار دلاری به این شرکت شد. صرفا برای اینکه یکی‌نمیدونست دیتاکلس توپایتون چطور کار میکنه و به جای خوندن داک از chatgpt پرسید 🙂

@PyBackendHub

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

Python BackendHub

نسخه بعدی aioclock منتشر شد 👀

تغییرات این نسخه:
اضافه شدن تریگر Cron - با سینتکس cron میتونید راحت تریگر بنویسید.

اضافه شدن OrTrigger - میتونید تریگری بنویسید که شامل تریگر های دیگه میشه و هرکدوم زودتر نوبتشون شد اجرا میشن.

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

ممنون میشم استار بدید یا contribute کنید.

@PyBackendHub

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

Python BackendHub

یک کامنتی گذاشتن که ظاهرا سو بداشت شده بود از حرفه من،
من نگفتم کسی که فعالیت گیتهاب نداره حتما رد فلگه. گفتم میتونه رد فلگ باشه. قطعا به عوامل دیگه هم بستگی داره.

و فعال بودن گیتهاب به این منظور نیست که پروفایل شما سبزه سبز باشه. ممکنه شما سالی ۵ تا ایشو بزنید و هیچ فعالیت دیگه ای نداشته باشین، ولی همون ۵ تا ایشو رو تو ابزار هایی که استفاده کردین ازش زدید و خیلی قشنگ مشکل رو توضیح دادید. این خیلی اسکیلارو میتونه نشون بده به کسی که داره رزومتون رو میبینه. این بنظره من بیشتر ارزش داره تا اینکه صرفا پروفایلتون سبز باشه. هدف رنگی کردن پروفایل نیست

@PyBackendHub

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

Python BackendHub

#واقعی دیدم chatgpt داون شده. رفتم پیج استتوسش. نوشته رفرش کنید درست میشه. 😂
- کار نمیکنه این چرا؟
+‌رفرش کن درست میشه

@PyBackendHub

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

Python BackendHub

توضیحات در رابطه با ماک اینترویو

@BenDevelop

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

Python BackendHub

داشتم docker compose مینوشتم که یک مشکلی داشتم (رو مخم بود مشکل نبود واقعا‌:)) ) و اونم این بود که وقتی دارم YAML مینوسیم خیلی خودمو دارم تکرار میکنم. مثلا endpoint های opentelemtry ام رو باید به همه service هام بدم.
بنابراین اینطوری میشه:


services:
foo_service:
environment:
trace_endpoint: baz_url
log_endpoint: baz2_url
metric_endpoint: baz3_url
# some other env....

bar_service:
environment:
trace_endpoint: baz_url
log_endpoint: baz2_url
metric_endpoint: baz3_url
# some other env...


و خوب قانع نشدم. گشتم ببینم راه حلی برای این موضوع هست. که بله هست. و اونم استفاده از Anchor هست.



x-otel-endpoints: &default-otel-endpoints
trace_endpoint: baz_url
log_endpoint: baz2_url
metric_endpoint: baz3_url

services:
foo_service:
environment:
<<: *default-otel-endpoints
# some other env

baz_service:
environment:
<<: *default-otel-endpoints
# some other env


خیلی بهتر شد نه؟ مقاله زیر کامل توضیح داده که چیه و چطور کار میکنه. توصیه میکنم یک سری بزنید چون معمولا yaml زیاد مینویسیم.

kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd" rel="nofollow">https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd


@PyBackendHub

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

Python BackendHub

یک پارادیم که خیلی قشنگه بدونید راجبش CoC هست.
Convention over configuration
این پارادیم core خیلی از فریم ورک هایی هست که شما استفاده میکنی. و خیلی خوبه که خودت هم استفاده کنی.
حالا این پارادیم چیه؟

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

یعنی من دارم لایبری pydantic مینویسم. دیدین احتمالا که یک Field داره که شما توضیح میدی تو Field یک سری متا دیتا میدی راجب اون فیلد تو اون دیتا کلس. این فیلد کلی پارامتر میگیره. ولی همه این پارامتر ها آپشناله. و این دقیقا CoC هست. یعنی به شما این flexibility خیلی زیاد رو میده که رفتار یک component رو هرچقدر میخواین تغییر بدید, در عین حال کلی مقدار دیفالت میذاره براتون که لازم نباشه خیلی فکر کنید و تصمیم های زیادی بگیرین.

این اصل رو شما هرجایی میتونید استفاده کنید. چه تو backend چه فرانت چه devops چه هر جای دیگه ای.

@PyBackendHub

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

Python BackendHub

چقدر یک architecture میتونه پیچیده باشه؟

Sentry: YES

احساس میکنم این پیچیدگی از قصده که نخوای خودت maintain کنی اینو 😂 چون هزینه maintain کردنش به صورت self host از هزینه اینکه از نسخه کلادش استفاده کنی بیشتره :))

هنوز متوجه نمیشم چرا هم memcached هست هم ردیس. 😁

@PyBackendHub

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