🧠 KISS – Keep It Simple, Stupid
🔤 O‘zbekchasi:
“Soddaroq yoz, axmoq!” yoki “Soddalik — kalitdir!”
📌 Asosiy g‘oya:
Tizim, kod, yoki yechim imkon qadar sodda va tushunarli bo‘lishi kerak.
KISS prinsipiga ko‘ra, agar bir narsani soddaroq yo‘l bilan qilsa bo‘lsa — demak, o‘sha yo‘l tanlanishi kerak.
📎 Tarixi:
KISS atamasi 1960-yillarda Kelly Johnson (Lockheed kompaniyasida ishlagan injener) tomonidan harbiy aviatsiyada ilgari surilgan.
Harbiy mexaniklar samolyotni maydonda oddiy asboblar bilan ta’mirlashi kerak. Agar dizayn murakkab bo‘lsa — bu imkonsiz.
🧩 Dasturlashda qanday ko‘rinadi?
❌ Yomon misol (murakkab):
✅ Yaxshi (KISS prinsipiga mos):
✨ KISS qoidalari amaliyotda:
1. ❌ Keraksiz abstraksiyalar yaratmang (Har bir class/funksiya haqiqiy zarurat bilan yaralsin)
2. ❌ “Nazarimda kelajakda kerak bo‘ladi” demang (Avval hozirgi ehtiyojni bajaring, keyin refactor qilasiz)
3. ✅ Funksiyalarni kichik va aniq tuting (Har bir funksiya bitta ish qilsin (Single Responsibility))
4. ✅ Qisqa, o‘qiladigan, tushunarli kod yozing (Boshqa dasturchi kodingizni o‘qiy olsin)
📍 Qachon KISS buziladi?
• “Katta tizim bo‘ladi” deb oldindan juda murakkab arxitektura o‘ylab topilganda
• Har bir kichik ish uchun alohida klass/fayl ochilganda
• Keraksiz design patternlar noto‘g‘ri ishlatilganda
✅ Xulosa:
🔹 Sodda kod — ishonchli, test qilinadigan, o‘zgartiriladigan kod.
🔹 Har doim “Soddaroq yo‘li bormi?” deb o‘zingizga savol bering.
🔹 Murakkablik zarurat bo‘lsa — bosqichma-bosqich qo‘shiladi.
🔤 O‘zbekchasi:
“Soddaroq yoz, axmoq!” yoki “Soddalik — kalitdir!”
📌 Asosiy g‘oya:
Tizim, kod, yoki yechim imkon qadar sodda va tushunarli bo‘lishi kerak.
KISS prinsipiga ko‘ra, agar bir narsani soddaroq yo‘l bilan qilsa bo‘lsa — demak, o‘sha yo‘l tanlanishi kerak.
📎 Tarixi:
KISS atamasi 1960-yillarda Kelly Johnson (Lockheed kompaniyasida ishlagan injener) tomonidan harbiy aviatsiyada ilgari surilgan.
Harbiy mexaniklar samolyotni maydonda oddiy asboblar bilan ta’mirlashi kerak. Agar dizayn murakkab bo‘lsa — bu imkonsiz.
🧩 Dasturlashda qanday ko‘rinadi?
❌ Yomon misol (murakkab):
def is_even(n):
return True if n % 2 == 0 else False
✅ Yaxshi (KISS prinsipiga mos):
def is_even(n):
return n % 2 == 0
✨ KISS qoidalari amaliyotda:
1. ❌ Keraksiz abstraksiyalar yaratmang (Har bir class/funksiya haqiqiy zarurat bilan yaralsin)
2. ❌ “Nazarimda kelajakda kerak bo‘ladi” demang (Avval hozirgi ehtiyojni bajaring, keyin refactor qilasiz)
3. ✅ Funksiyalarni kichik va aniq tuting (Har bir funksiya bitta ish qilsin (Single Responsibility))
4. ✅ Qisqa, o‘qiladigan, tushunarli kod yozing (Boshqa dasturchi kodingizni o‘qiy olsin)
📍 Qachon KISS buziladi?
• “Katta tizim bo‘ladi” deb oldindan juda murakkab arxitektura o‘ylab topilganda
• Har bir kichik ish uchun alohida klass/fayl ochilganda
• Keraksiz design patternlar noto‘g‘ri ishlatilganda
✅ Xulosa:
🔹 Sodda kod — ishonchli, test qilinadigan, o‘zgartiriladigan kod.
🔹 Har doim “Soddaroq yo‘li bormi?” deb o‘zingizga savol bering.
🔹 Murakkablik zarurat bo‘lsa — bosqichma-bosqich qo‘shiladi.
👍1
🧠 Funksiya Ichida Funksiya — DRY va Dinamik Validatsiyalar uchun Yondashuv
Ko‘pincha kodimizda turli status, role, type kabi qiymatlarni tekshirish kerak bo‘ladi. Har birini alohida validator qilib yozish esa kodni takrorlaydi (DRY prinsipiga zid).
🎯 Yechim: funksiya ichida funksiya yaratish (higher-order function). Ya'ni, dinamik validator generatori.
🔧 Misol: Mapping validatori generatori
Bu funksiya sizga har qanday mapping uchun validator yasab beradi. Qanday ishlaydi?
⚙️ Ishlash mexanizmi
Quyidagicha chaqirasiz:
Bosqichma-bosqich:
1. check_mapping(users_status, "Status") → sizga validator funksiyasini qaytaradi, va u validator funksiyasi users_status, "Status larga ham ega.
2. (cls, v) → bu validator funksiyasiga beriladi.
Ya'ni, check_mapping(...) → funksiya qaytaradi, bu funksiyani siz keyin chaqirasiz. Oddiyroq aytganda:
🧪 Pydanticda ishlatish
Yoki qisqaroq:
✅ Foyda nima?
🔁 Takrorlanadigan kodlar yo‘q
🧱 DRY prinsipiga mos
🧩 Dinamik validator yaratish mumkin
🧼 Kodingiz ancha toza va kengayuvchan bo‘ladi
user_role, user_status kabilar statik o'zgaruvchi bo'lsa ideal tanlov
Ko‘pincha kodimizda turli status, role, type kabi qiymatlarni tekshirish kerak bo‘ladi. Har birini alohida validator qilib yozish esa kodni takrorlaydi (DRY prinsipiga zid).
🎯 Yechim: funksiya ichida funksiya yaratish (higher-order function). Ya'ni, dinamik validator generatori.
🔧 Misol: Mapping validatori generatori
def check_mapping(mapping: dict, field_name: str):
def validator(cls, v):
if v not in mapping:
raise ValueError(f"{field_name} '{v}' noto‘g‘ri.")
return v
return validator
Bu funksiya sizga har qanday mapping uchun validator yasab beradi. Qanday ishlaydi?
⚙️ Ishlash mexanizmi
Quyidagicha chaqirasiz:
check_mapping(users_status, "Status")(cls, v)
Bosqichma-bosqich:
1. check_mapping(users_status, "Status") → sizga validator funksiyasini qaytaradi, va u validator funksiyasi users_status, "Status larga ham ega.
2. (cls, v) → bu validator funksiyasiga beriladi.
Ya'ni, check_mapping(...) → funksiya qaytaradi, bu funksiyani siz keyin chaqirasiz. Oddiyroq aytganda:
status_validator = check_mapping(users_status, "Status")
status_validator(cls, v)
🧪 Pydanticda ishlatish
@field_validator("status_id")
def validate_status(cls, v):
return check_mapping(users_status, "Status")(cls, v)
Yoki qisqaroq:
validate_status = field_validator("status_id")(
lambda cls, v: check_mapping(users_status, "Status")(cls, v)
)
✅ Foyda nima?
🔁 Takrorlanadigan kodlar yo‘q
🧱 DRY prinsipiga mos
🧩 Dinamik validator yaratish mumkin
🧼 Kodingiz ancha toza va kengayuvchan bo‘ladi
user_role, user_status kabilar statik o'zgaruvchi bo'lsa ideal tanlov
🔍 _value, __value, __value__ – farqlari nimada?
Ko‘p ko‘rasiz, lekin chalkashasizmi? Keling, tushunarli qilib ajratamiz 👇
1️⃣ _value — bitta pastki chiziq
👉 Ichki foydalanish uchun degan ishora.
🚫 Ammo hech qanday taqiqlov yo‘q.
📌 from module import * qilganda import qilinmaydi.
2️⃣ __value — ikkita pastki chiziq
👉 Bu nomlar klass ichida yashirinadi.
🔐 Python bu nomni avtomatik tarzda _<ClassName>__value ga o‘zgartiradi (name mangling).
📌 Bu encapsulation (ma’lumotni yashirish) uchun ishlatiladi.
3️⃣ __value__ — ikkala tomonda chiziq
👉 Bu Python’ning maxsus metodlari va atributlari.
🧠 Masalan: __init__, __str__, __len__, __dict__ va hokazo.
📌 Bunday nomlardan o‘zingiz foydalanmang, ular Pythonga tegishli!
Ko‘p ko‘rasiz, lekin chalkashasizmi? Keling, tushunarli qilib ajratamiz 👇
1️⃣ _value — bitta pastki chiziq
👉 Ichki foydalanish uchun degan ishora.
🚫 Ammo hech qanday taqiqlov yo‘q.
_value = 42 # "Bu ichki o‘zgaruvchi" degan signal
📌 from module import * qilganda import qilinmaydi.
2️⃣ __value — ikkita pastki chiziq
👉 Bu nomlar klass ichida yashirinadi.
🔐 Python bu nomni avtomatik tarzda _<ClassName>__value ga o‘zgartiradi (name mangling).
class MyClass:
def __init(self):
self.__secret = "sir"
obj = MyClass()
print(obj.__secret) #❌ AttributeError
print(obj._MyClass__secret) # ✅
📌 Bu encapsulation (ma’lumotni yashirish) uchun ishlatiladi.
3️⃣ __value__ — ikkala tomonda chiziq
👉 Bu Python’ning maxsus metodlari va atributlari.
🧠 Masalan: __init__, __str__, __len__, __dict__ va hokazo.
print(len("salom")) # Aslida bu str.__len__() chaqiradi
📌 Bunday nomlardan o‘zingiz foydalanmang, ular Pythonga tegishli!
🧠 __slots__ — Python klasslarida xotira va atributlarni boshqarish quroli
✳️ __slots__ nima?
Pythonda klassga istalgancha atribut qo‘shish mumkin — bu qulay, lekin xotiradan ko‘p foydalanadi.
Yuqoridagi kod har bir obyekt uchun Python __dict__ deb ataladigan lug‘at (dictionary) yaratadi. Bu lug‘at obyektning atributlarini saqlaydi. Har bir atribut — kalit/qiymat jufti sifatida joylashadi. Bu esa:
• ❌ Ko‘p xotira egallaydi
• ❌ Yangi atributlar istalgan paytda qo‘shilishi mumkin — bu xavfsizlikni kamaytiradi
✅ __slots__ bilan yechim:
Agar siz klassda faqat aniq belgilangan atributlargina bo‘lishini istasangiz va xotirani tejash ni xohlasangiz, __slots__ dan foydalaning:
🔒 Natija:
• Faqat name va age mavjud bo‘ladi
• Boshqa atribut qo‘shilsa, AttributeError chiqadi
• __dict__ yaratilmaydi ⇒ kamroq xotira ishlatiladi
📊 Taqqoslash:
Siz aytishingiz mumkin slots ham joy egallaydiku deb, sys.getsizeof(b.dict) desak bu attributlar ro'yxatining hajmini qaytaradi shunga bu ifoda chiqargan qiymat slots egallagan joy emas.
📌 slots bu sinf (class) darajasidagi statik belgidir, har bir obyekt uchun xotirada saqlanmaydi.
⚠️ Cheklovlar:
1. __slots__ bilan obyektga istalgancha atribut qo‘shib bo‘lmaydi:
2. __slots__ faqat klass darajasida ishlaydi. Meros bo‘lsa, ehtiyot bo‘ling:
3. Agar __slots__ ichida __dict__ yoki __weakref__ ni qo‘shsangiz, u holda istisnoga ruxsat:
🧩 Qachon ishlatish kerak?
1. Ko‘p obyekt yaratilsa (✅ Ha)
2. RAM cheklangan muhitlarda (✅ Ha)
3. Dinamik atributlar kerak bo‘lsa (❌ Yo‘q)
4. Debug qilishda qulaylik kerak (❌ Yo‘q)
🔚 Xulosa
• __slots__ yordamida klassdagi atributlar oldindan cheklanadi
• Bu esa xotirani tejash va atributlar ustidan nazorat beradi
• Lekin __slots__ — hamma holatga mos emas, shuning uchun aniq zarurat bo‘lsa qo‘llang
✳️ __slots__ nima?
Pythonda klassga istalgancha atribut qo‘shish mumkin — bu qulay, lekin xotiradan ko‘p foydalanadi.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
Yuqoridagi kod har bir obyekt uchun Python __dict__ deb ataladigan lug‘at (dictionary) yaratadi. Bu lug‘at obyektning atributlarini saqlaydi. Har bir atribut — kalit/qiymat jufti sifatida joylashadi. Bu esa:
• ❌ Ko‘p xotira egallaydi
• ❌ Yangi atributlar istalgan paytda qo‘shilishi mumkin — bu xavfsizlikni kamaytiradi
✅ __slots__ bilan yechim:
Agar siz klassda faqat aniq belgilangan atributlargina bo‘lishini istasangiz va xotirani tejash ni xohlasangiz, __slots__ dan foydalaning:
class Person:
__slots__ = ['name', 'age'] # faqat shu atributlarga ruxsat
def __init__(self, name, age):
self.name = name
self.age = age
🔒 Natija:
• Faqat name va age mavjud bo‘ladi
• Boshqa atribut qo‘shilsa, AttributeError chiqadi
• __dict__ yaratilmaydi ⇒ kamroq xotira ishlatiladi
📊 Taqqoslash:
import sys
class A:
def __init__(self):
self.x = 1
self.y = 2
class B:
__slots__ = ['x', 'y']
def __init__(self):
self.x = 1
self.y = 2
a = A()
b = B()
print("a:", sys.getsizeof(a) + sys.getsizeof(a.__dict__)) # umumiy hajm
print("b:", sys.getsizeof(b)) # faqat o'zining hajmi chunki b __dict__ ga ega emas
Siz aytishingiz mumkin slots ham joy egallaydiku deb, sys.getsizeof(b.dict) desak bu attributlar ro'yxatining hajmini qaytaradi shunga bu ifoda chiqargan qiymat slots egallagan joy emas.
📌 slots bu sinf (class) darajasidagi statik belgidir, har bir obyekt uchun xotirada saqlanmaydi.
⚠️ Cheklovlar:
1. __slots__ bilan obyektga istalgancha atribut qo‘shib bo‘lmaydi:
p = Person("Ali", 25)
p.email = "ali@example.com" # ❌ AttributeError
2. __slots__ faqat klass darajasida ishlaydi. Meros bo‘lsa, ehtiyot bo‘ling:
class A:
__slots__ = ['x']
class B(A):
pass # B uchun __dict__ mavjud bo'ladi (slots yo'q)
3. Agar __slots__ ichida __dict__ yoki __weakref__ ni qo‘shsangiz, u holda istisnoga ruxsat:
__slots__ = ['x', '__dict__']
🧩 Qachon ishlatish kerak?
1. Ko‘p obyekt yaratilsa (✅ Ha)
2. RAM cheklangan muhitlarda (✅ Ha)
3. Dinamik atributlar kerak bo‘lsa (❌ Yo‘q)
4. Debug qilishda qulaylik kerak (❌ Yo‘q)
🔚 Xulosa
• __slots__ yordamida klassdagi atributlar oldindan cheklanadi
• Bu esa xotirani tejash va atributlar ustidan nazorat beradi
• Lekin __slots__ — hamma holatga mos emas, shuning uchun aniq zarurat bo‘lsa qo‘llang
Sizga postlarning qanday formatda bo'lishi yoqadi
Anonymous Poll
44%
Qisqa, lo‘nda postlar (tez o‘qiladigan, konspekt)
33%
Batafsil tushuntiruvchi postlar (asosli tushuncha va kod)
22%
Ikkalasi aralash bo‘lsa yaxshi
0%
Menga farqi yo‘q, foydali bo‘lsa bo‘ldi
👍1
🔐 Maxfiy maʼlumotni .env da saqlayapsizmi? To‘xtang. Bu xavfli.
Pythonda token, parol, API kalitlarini xavfsiz saqlashning to‘g‘ri yo‘li — keyring kutubxonasi.
🛡 U nima qiladi?
• Parollarni tizim keychain ida saqlaydi
• Himoyalangan tarzda o‘qiydi va o‘chiradi
• Kodda parol qoldirishga ehtiyoj qolmaydi
💡 keyring — bu .env emas. Bu real xavfsizlik.
👉 Batafsil: kommentda tushuntiraman 👇
Pythonda token, parol, API kalitlarini xavfsiz saqlashning to‘g‘ri yo‘li — keyring kutubxonasi.
🛡 U nima qiladi?
• Parollarni tizim keychain ida saqlaydi
• Himoyalangan tarzda o‘qiydi va o‘chiradi
• Kodda parol qoldirishga ehtiyoj qolmaydi
💡 keyring — bu .env emas. Bu real xavfsizlik.
👉 Batafsil: kommentda tushuntiraman 👇
Yuqoridagi kabi kanalni o'zida qisqa post, komentariyasida batafsil post bo'lsa hammaga maqulmi
Anonymous Poll
86%
Ha shu yaxshi
14%
Bu unchalik maqul yo'l emas
#lambda
⚡️ Python lambda funksiyasi — qisqa, lekin qudratli
Pythonda funksiyalarni tez va oddiy yozish kerak bo‘lsa, lambda sizga yordam beradi. Lekin ko‘pchilik lambda faqat qisqalik uchun deb o‘ylaydi. Aslida u higher-order function, callback, va FP (Functional Programming) konseptlarida muhim rol o‘ynaydi.
🧠 lambda nima?
lambda — bu anonim (nomi yo‘q) funksiya. Ya'ni, def bilan alohida yozmasdan, bitta qator ichida oddiy funksiyani e'lon qilish usuli:
📌 Oddiy misollar:
Batafsil: komentda tushuntiriladi!👇
⚡️ Python lambda funksiyasi — qisqa, lekin qudratli
Pythonda funksiyalarni tez va oddiy yozish kerak bo‘lsa, lambda sizga yordam beradi. Lekin ko‘pchilik lambda faqat qisqalik uchun deb o‘ylaydi. Aslida u higher-order function, callback, va FP (Functional Programming) konseptlarida muhim rol o‘ynaydi.
🧠 lambda nima?
lambda — bu anonim (nomi yo‘q) funksiya. Ya'ni, def bilan alohida yozmasdan, bitta qator ichida oddiy funksiyani e'lon qilish usuli:
lambda argumentlar: natija
📌 Oddiy misollar:
square = lambda x: x * x
print(square(5)) # ➜ 25
add = lambda x, y: x + y
print(add(3, 4)) # ➜ 7
Batafsil: komentda tushuntiriladi!👇
👍1
#HigherOrderFunction(HOF)
1. 🔁 Higher-Order Function (HOF) nima?
Bu — funksiyani argument sifatida qabul qiladigan yoki natija sifatida qaytaradigan funksiyadir.
✅ Misol:
• lambda x: x * 2 — bu funksiya.
• apply() esa funksiyani argument sifatida qabul qildi ➝ bu higher-order function.
Batafsil: komentda tushuntiriladi!👇
1. 🔁 Higher-Order Function (HOF) nima?
Bu — funksiyani argument sifatida qabul qiladigan yoki natija sifatida qaytaradigan funksiyadir.
✅ Misol:
def apply(func, value):
return func(value)
result = apply(lambda x: x * 2, 10)
print(result) # 20
• lambda x: x * 2 — bu funksiya.
• apply() esa funksiyani argument sifatida qabul qildi ➝ bu higher-order function.
Batafsil: komentda tushuntiriladi!👇
#Callback
2. 🔄 Callback nima?
Bu — biror funksiya ichida boshqa bir funksiyani qayta chaqirish (callback).
✅ Misol:
• lambda: print("Done!") — callback funksiya sifatida uzatilmoqda.
• Odatda GUI, async, yoki event-based tizimlarda ishlatiladi.
Batafsil: komentda tushuntiriladi!👇
2. 🔄 Callback nima?
Bu — biror funksiya ichida boshqa bir funksiyani qayta chaqirish (callback).
✅ Misol:
def process_data(callback):
print("Processing...")
callback()
process_data(lambda: print("Done!"))
• lambda: print("Done!") — callback funksiya sifatida uzatilmoqda.
• Odatda GUI, async, yoki event-based tizimlarda ishlatiladi.
Batafsil: komentda tushuntiriladi!👇
#FunctionalProgramming
3. 🧠 Functional Programming (FP) nima?
Bu — dasturlashdagi yondashuv bo‘lib:
• funksiya — asosiy birlik
• kod — funksiyalar orqali yoziladi
• o‘zgaruvchan holatlar yo‘q yoki kamroq bo‘ladi
lambda, map(), filter(), reduce() kabi funksiyalar — FP yondashuvida juda muhim.
✅ Misol:
Bu yerda lambda funksiyasi — FP stilida ishlatilmoqda.
Batafsil: komentda tushuntiriladi!👇
3. 🧠 Functional Programming (FP) nima?
Bu — dasturlashdagi yondashuv bo‘lib:
• funksiya — asosiy birlik
• kod — funksiyalar orqali yoziladi
• o‘zgaruvchan holatlar yo‘q yoki kamroq bo‘ladi
lambda, map(), filter(), reduce() kabi funksiyalar — FP yondashuvida juda muhim.
✅ Misol:
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # [1, 4, 9, 16]
Bu yerda lambda funksiyasi — FP stilida ishlatilmoqda.
Batafsil: komentda tushuntiriladi!👇
#lifespan #fastapi
🚀 lifespan – FastAPI ilovasining hayot aylanishi
FastAPI'da lifespan bu — ilova ishga tushganda va to‘xtaganda avtomatik bajarilishi kerak bo‘lgan kodlar to‘plami.
🔧 Misol
Quyidagi misolda ilova ishga tushganda fayl ochiladi, to‘xtaganda esa yopiladi:
🔍 Nima bo‘ladi bu yerda?
• lifespan funktsiyasi app = FastAPI(lifespan=lifespan) ga uzatiladi
• yielddan oldingi kodlar startup paytida bajariladi
• yielddan keyingi kodlar shutdown vaqtida bajariladi
Batafsil: komentda tushuntiriladi!👇
🚀 lifespan – FastAPI ilovasining hayot aylanishi
FastAPI'da lifespan bu — ilova ishga tushganda va to‘xtaganda avtomatik bajarilishi kerak bo‘lgan kodlar to‘plami.
🔧 Misol
Quyidagi misolda ilova ishga tushganda fayl ochiladi, to‘xtaganda esa yopiladi:
from fastapi import FastAPI
from contextlib import asynccontextmanager
log_file = None
@asynccontextmanager
async def lifespan(app: FastAPI):
global log_file
log_file = open("server.log", "a")
log_file.write("🔵 Server started\n")
log_file.flush()
yield # Ilova shu yerda ishlaydi
log_file.write("🔴 Server stopped\n")
log_file.close()
app = FastAPI(lifespan=lifespan)
@app.get("/")
def read_root():
return {"message": "Hello from FastAPI!"}
🔍 Nima bo‘ladi bu yerda?
• lifespan funktsiyasi app = FastAPI(lifespan=lifespan) ga uzatiladi
• yielddan oldingi kodlar startup paytida bajariladi
• yielddan keyingi kodlar shutdown vaqtida bajariladi
Batafsil: komentda tushuntiriladi!👇
#rateLimit #fastapi
📌 FastAPI ilovasida API'ga rate limit qo‘yish (slowapi bilan)
Agar sizning API'ingizda haddan tashqari ko‘p so‘rov bo‘lishini oldini olish va qanchadir vaqtdagi so'rov soniga cheklov qo'ymoqchi bo'lsangiz, slowapi kutubxonasi aynan shuning uchun kerak. 😎
⚙️ FastAPI bilan ishlatish
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
📌 FastAPI ilovasida API'ga rate limit qo‘yish (slowapi bilan)
Agar sizning API'ingizda haddan tashqari ko‘p so‘rov bo‘lishini oldini olish va qanchadir vaqtdagi so'rov soniga cheklov qo'ymoqchi bo'lsangiz, slowapi kutubxonasi aynan shuning uchun kerak. 😎
⚙️ FastAPI bilan ishlatish
from fastapi import FastAPI, Request
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
app = FastAPI()
# Limiter IP manzilga qarab ishlaydi
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
@app.get("/ping")
@limiter.limit("5/minute") # Har IP dan daqiqasiga 5 ta so‘rovgacha
async def ping(request: Request):
return {"message": "pong"}
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
#dependencyInjection_DI
📌 Dependency Injection (DI) — nima?
🧩 DI — oddiy tushuntirish
“Kerakli narsa funksiyaning ichida yaratilmaydi, balki tashqaridan uzatiladi.”
Bu yondashuvn natijasida:
✅ Kod aniq va soddalashadi
✅ Test qilish osonlashadi
✅ Har bir modul mustaqil bo‘ladi
❌ Qattiq bog‘liq kod:
✅ DI bilan:
Shunday qilib, funksiyani o‘zgartirmasdan turli variantlar bilan ishlatish mumkin.
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
📌 Dependency Injection (DI) — nima?
🧩 DI — oddiy tushuntirish
“Kerakli narsa funksiyaning ichida yaratilmaydi, balki tashqaridan uzatiladi.”
Bu yondashuvn natijasida:
✅ Kod aniq va soddalashadi
✅ Test qilish osonlashadi
✅ Har bir modul mustaqil bo‘ladi
❌ Qattiq bog‘liq kod:
def print_invoice():
printer = HPPrinter() # bu yerda printer turi qattiq belgilangan
printer.print()
✅ DI bilan:
def print_invoice(printer):
printer.print()
# So‘ngra istalgan printerni uzatamiz:
print_invoice(HPPrinter())
print_invoice(EpsonPrinter())
Shunday qilib, funksiyani o‘zgartirmasdan turli variantlar bilan ishlatish mumkin.
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
🔍 DI qayerlarda ishlatiladi?
✅ Python:
• FastAPI — Depends() orqali
• Flask — o‘zida yo‘q, lekin Flask-Injector, Flask-DI orqali qo‘shish mumkin
• Django — ichki DI yo‘q, lekin Class-based Views, middleware orqali modullashtirish mumkin
✅ Java / Kotlin:
• Spring Framework — dunyodagi eng mashhur DI tizimlaridan biri, @Autowired, @Service bilan ishlaydi
✅ .NET (C#):
• ASP.NET Core — AddTransient, AddScoped, AddSingleton orqali DI konteyner ishlaydi
✅ JavaScript / TypeScript:
• NestJS — Angular'dan ilhomlangan, DI markaziy qismida joylashgan
• Angular — frontendda lekin kuchli DI tizimi bor
✅ Go (Golang):
• Ichki DI yo‘q, lekin wire, fx, dig kabi kutubxonalar orqali amalga oshiriladi
🧠 Aslida DI nima uchun muhim?
• Katta loyihalarda kod ajratilishi va soddaligi uchun
• Har bir qismni alohida test qilish uchun
• Kodni o‘zgartirmasdan moslashtirish uchun (ya’ni plug-and-play logika)
📌 Xulosa:
❗️ **Dependency Injection — bu frameworkga emas, toza va professional dasturlashga tegishli yondashuvdir.
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Komentda misol keltiriladi tushuntiriladi!👇
✅ Python:
• FastAPI — Depends() orqali
• Flask — o‘zida yo‘q, lekin Flask-Injector, Flask-DI orqali qo‘shish mumkin
• Django — ichki DI yo‘q, lekin Class-based Views, middleware orqali modullashtirish mumkin
✅ Java / Kotlin:
• Spring Framework — dunyodagi eng mashhur DI tizimlaridan biri, @Autowired, @Service bilan ishlaydi
✅ .NET (C#):
• ASP.NET Core — AddTransient, AddScoped, AddSingleton orqali DI konteyner ishlaydi
✅ JavaScript / TypeScript:
• NestJS — Angular'dan ilhomlangan, DI markaziy qismida joylashgan
• Angular — frontendda lekin kuchli DI tizimi bor
✅ Go (Golang):
• Ichki DI yo‘q, lekin wire, fx, dig kabi kutubxonalar orqali amalga oshiriladi
🧠 Aslida DI nima uchun muhim?
• Katta loyihalarda kod ajratilishi va soddaligi uchun
• Har bir qismni alohida test qilish uchun
• Kodni o‘zgartirmasdan moslashtirish uchun (ya’ni plug-and-play logika)
📌 Xulosa:
❗️ **Dependency Injection — bu frameworkga emas, toza va professional dasturlashga tegishli yondashuvdir.
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Komentda misol keltiriladi tushuntiriladi!👇
🧩 Interface — bu nima?
Interface — bu dasturda qanday funksiyalar bo‘lishi kerakligini belgilovchi shartnoma (contract). Ya'ni:
🔹 "Bu klassda falon-falon metodlar bo'lishi shart, lekin bu metodlar qanday ishlashi muhim emas."
🧠 Sodda qilib tushuntirsak:
Interface — bu "nimalar qilish kerakligini" belgilaydi, "qanday qilishini" esa subklass hal qiladi.
🔒 Nega kerak?
1. Katta loyihalarda strukturani qat’iy ushlab turadi
2. Polimorfizmni qo‘llaydi — bir xil metodlar bilan turli obyektlarni boshqarish.
3. Har xil implementatsiyalarni ajratib beradi
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
Interface — bu dasturda qanday funksiyalar bo‘lishi kerakligini belgilovchi shartnoma (contract). Ya'ni:
🔹 "Bu klassda falon-falon metodlar bo'lishi shart, lekin bu metodlar qanday ishlashi muhim emas."
🧠 Sodda qilib tushuntirsak:
Interface — bu "nimalar qilish kerakligini" belgilaydi, "qanday qilishini" esa subklass hal qiladi.
🔒 Nega kerak?
1. Katta loyihalarda strukturani qat’iy ushlab turadi
2. Polimorfizmni qo‘llaydi — bir xil metodlar bilan turli obyektlarni boshqarish.
3. Har xil implementatsiyalarni ajratib beradi
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
🔥1
🔹 map() funksiyasi nima qiladi?
map() — bu Higher-Order Function bo‘lib, biror funksiyani har bir elementga qo‘llab, yangi natijalar ketma-ketligini (iterable) hosil qiladi.
📌 Sintaksisi:
• function — har bir elementga qo‘llaniladigan funksiya (masalan: lambda, yoki oldindan yozilgan funksiya)
• iterable — ro‘yxat (list), to‘plam (tuple), va hokazo
✅ Misol:
Nima bo‘ldi bu yerda?
• lambda x: x**2 — bu funksiya har bir sonni kvadrat qiladi
• map(...) — bu funksiyani ro‘yxatdagi har bir elementga qo‘lladi
• list(...) — map obyekti iterable bo‘lgani uchun, uni listga aylantirdik
💡 Qachon ishlatiladi?
• Ro‘yxatdagi har bir elementni o‘zgartirmoqchi bo‘lsangiz
• Kodni toza va ixcham yozmoqchi bo‘lsangiz
• for sikliga alternativ sifatida
map() — bu Higher-Order Function bo‘lib, biror funksiyani har bir elementga qo‘llab, yangi natijalar ketma-ketligini (iterable) hosil qiladi.
📌 Sintaksisi:
map(function, iterable)
• function — har bir elementga qo‘llaniladigan funksiya (masalan: lambda, yoki oldindan yozilgan funksiya)
• iterable — ro‘yxat (list), to‘plam (tuple), va hokazo
✅ Misol:
numbers = [1, 2, 3, 4]
squared = map(lambda x: x**2, numbers)
print(list(squared)) # [1, 4, 9, 16]
Nima bo‘ldi bu yerda?
• lambda x: x**2 — bu funksiya har bir sonni kvadrat qiladi
• map(...) — bu funksiyani ro‘yxatdagi har bir elementga qo‘lladi
• list(...) — map obyekti iterable bo‘lgani uchun, uni listga aylantirdik
💡 Qachon ishlatiladi?
• Ro‘yxatdagi har bir elementni o‘zgartirmoqchi bo‘lsangiz
• Kodni toza va ixcham yozmoqchi bo‘lsangiz
• for sikliga alternativ sifatida
🧠 tracemalloc — Pythonda xotira sarfini kuzatish vositasi
Python dasturingizda qaysi joy eng ko‘p RAM yeyapti?
Yoki memory leak borligini qanday aniqlaysiz?
🎯 Javob: tracemalloc bilan!
🔍 tracemalloc bu nima?
tracemalloc — bu Python standarti ichidagi (🔹 built-in) modul bo‘lib, u dastur ishlayotganda obyektlar xotiraga qanday joylashayotganini aniqlab beradi.
Python 3.4+ versiyalarida mavjud.
⚙️ Asosiy imkoniyatlari:
✅ Xotira sarfini qadam-baqadam kuzatish
✅ Har bir obyektni qayerda yaratilganini aniqlash
✅ Snapshotlar (xotira "suratlari") orqali farqni ko‘rish
✅ Debug va profiling paytida memory leakni aniqlash
🔎 Real foydalanish holati
📈 Shu orqali siz kodni optimallashtirishga zarurat bor-yo‘qligini bilasiz.
📊 Natijada siz quyidagiga o'xshash ma’lumot olasiz (bu misol tariqasida):
✅ Har bir qator (line) nechta obyekt va qancha xotira ishlatayotgani ko‘rsatiladi.
🔐 Foydali xususiyatlar:
🔹 tracemalloc.get_traced_memory() — hozirgi va maksimal xotira ishlatish
🔹 filter_traces() — keraksiz modul yoki fayllarni chiqarib tashlash
🔹 traceback.format() — obyektlar qaerdan kelganini aniqlash
Python dasturingizda qaysi joy eng ko‘p RAM yeyapti?
Yoki memory leak borligini qanday aniqlaysiz?
🎯 Javob: tracemalloc bilan!
🔍 tracemalloc bu nima?
tracemalloc — bu Python standarti ichidagi (🔹 built-in) modul bo‘lib, u dastur ishlayotganda obyektlar xotiraga qanday joylashayotganini aniqlab beradi.
Python 3.4+ versiyalarida mavjud.
⚙️ Asosiy imkoniyatlari:
✅ Xotira sarfini qadam-baqadam kuzatish
✅ Har bir obyektni qayerda yaratilganini aniqlash
✅ Snapshotlar (xotira "suratlari") orqali farqni ko‘rish
✅ Debug va profiling paytida memory leakni aniqlash
🔎 Real foydalanish holati
import tracemalloc
tracemalloc.start()
def build_list():
return [i for i in range(100000)]
build_list()
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
for stat in top_stats[:3]:
print(stat)
📈 Shu orqali siz kodni optimallashtirishga zarurat bor-yo‘qligini bilasiz.
📊 Natijada siz quyidagiga o'xshash ma’lumot olasiz (bu misol tariqasida):
/home/user/my_script.py:23: size=2.4 MiB, count=30000, average=84 B
/home/user/lib/utils.py:89: size=1.1 MiB, count=14000, average=80 B
...
✅ Har bir qator (line) nechta obyekt va qancha xotira ishlatayotgani ko‘rsatiladi.
🔐 Foydali xususiyatlar:
🔹 tracemalloc.get_traced_memory() — hozirgi va maksimal xotira ishlatish
🔹 filter_traces() — keraksiz modul yoki fayllarni chiqarib tashlash
🔹 traceback.format() — obyektlar qaerdan kelganini aniqlash
❤1👍1
#singleton_design_pattern
📌 Singleton Design Pattern (Python misolida)
💡 Asosiy g‘oya:
Bir sinfdan faqat bitta obyekt yaratiladi va unga butun dastur bo‘ylab nazoratli kirish ta’minlanadi.
✅ Foydalari:
• Nazoratli kirish — faqat bitta obyekt yaratiladi va unga boshqaruv markazlashgan bo‘ladi.
• Global o‘zgaruvchilarni kamaytiradi — nomlar bo‘shlig‘ini toza saqlaydi.
• Moslashuvchanlik — kerak bo‘lsa, sinfni meros qilib kengaytirish va runtime’da kerakli versiyasini ishlatish mumkin.
• Instansiyalar sonini boshqarish — dastlab bitta obyekt bo‘lishi mumkin, keyin istasangiz ko‘proq nusxalarga ruxsat berish oson.
• Statik metodlardan ko‘ra moslashuvchan — oson meros olish va polymorphism qo‘llash mumkin.
Python misoli (thread-safe singleton):
Qisqacha:
Singleton — bu resurslarni tejaydigan va markazlashgan boshqaruv beradigan dizayn patterndir.
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇
📌 Singleton Design Pattern (Python misolida)
💡 Asosiy g‘oya:
Bir sinfdan faqat bitta obyekt yaratiladi va unga butun dastur bo‘ylab nazoratli kirish ta’minlanadi.
✅ Foydalari:
• Nazoratli kirish — faqat bitta obyekt yaratiladi va unga boshqaruv markazlashgan bo‘ladi.
• Global o‘zgaruvchilarni kamaytiradi — nomlar bo‘shlig‘ini toza saqlaydi.
• Moslashuvchanlik — kerak bo‘lsa, sinfni meros qilib kengaytirish va runtime’da kerakli versiyasini ishlatish mumkin.
• Instansiyalar sonini boshqarish — dastlab bitta obyekt bo‘lishi mumkin, keyin istasangiz ko‘proq nusxalarga ruxsat berish oson.
• Statik metodlardan ko‘ra moslashuvchan — oson meros olish va polymorphism qo‘llash mumkin.
Python misoli (thread-safe singleton):
import threading
class SingletonMeta(type):
_instance = None
_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__call__(*args, **kwargs)
return cls._instance
class Config(metaclass=SingletonMeta):
def __init__(self):
self.settings = {}
# Foydalanish
c1 = Config()
c2 = Config()
print(c1 is c2) # True — faqat bitta obyekt
Qisqacha:
Singleton — bu resurslarni tejaydigan va markazlashgan boshqaruv beradigan dizayn patterndir.
Foydali bo'lgan postlarda reaksiya qoldirish va ularni do'stlarga ulashishni unutmang😁!
Batafsil: komentda tushuntiriladi!👇