| کانال توسعه‌دهندگان پایتون | – Telegram
| کانال توسعه‌دهندگان پایتون |
6.87K subscribers
49 photos
2 videos
4 files
52 links
⭕️ کانال توسعه‌دهندگان پایتون دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
در کد زیر سعی شده با استفاده از یک decorator ساده، تعداد دفعات صدا زده شدن هر تابع در یک دیکشنری سراسری ذخیره شود، اما به‌خاطر یک اشتباه در نحوه استفاده از global، شمارنده به‌درستی عمل نمی‌کند و ممکن است خطا یا رفتار اشتباه داشته باشد.

سوال:
در این کد چه چیزی باید اصلاح شود تا شمارندهٔ فراخوانی توابع به‌درستی کار کند و call_counts بدون خطا و به شکل صحیح به‌روزرسانی شود؟

call_counts = {}

def count_calls(func):
def wrapper(*args, **kwargs):
global call_counts
if func.__name__ not in call_counts:
call_counts = {}
call_counts[func.__name__] = call_counts.get(func.__name__, 0) + 1
return func(*args, **kwargs)
return wrapper

@count_calls
def slow_add(a, b):
return a + b

for _ in range(3):
slow_add(1, 2)

print(call_counts)


🔖 #Python #پایتون

👤 Developix

💎 Channel: @DevelopixPython
2👍1
در قطعه‌کد زیر از ویژگی late binding در closureهای پایتون و همین‌طور از عملگر is روی اعداد استفاده شده است.
خروجی اجرای این کد (خطوط چاپ‌شده در ترمینال) دقیقا چه خواهد بود؟

پاسخ را دقیقا مطابق خروجی نهایی بنویسید.

🔖 #Python #پایتون

👤 Developix

💎 Channel: @DevelopixPython
👎32🔥1
Forwarded from ابر ویراک
⭕️ ویراک کلود
زیرساختی مطمئن برای کسب و کارهای آنلاین
🎁 20% شارژ بیشتر روی اولین واریزی
⚡️با کد معرف: 10%  شارژ برای شما و 10% برای دوستتان!

🔘با IPv6 رایگان
🔘با IP مازاد
🔘تست رایگان 2 روزه
🔘فایروال اختصاصی
🔘با API برای حرفه‌ای ها
🔘پشتیبانی 24 ساعته
🔘آپلود رایگان


📞 همین حالا با ما تماس بگیرید و این فرصت فوق‌العاده رو از دست ندید!
🔻02191555530
🌐Virakcloud.com
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
FastAPI یه فریم‌ورک مدرن برای ساخت Web API تو پایتونه که کامل روی type hints سوار شده و برای ساخت سرویس‌های سریع و قابل نگه‌داری عالیه. بر پایه Starlette و Pydantic ساخته شده و روی ASGI اجرا می‌شه.

چرا مفیده؟

• سرعت خیلی بالا (نزدیک به Node و Go) 🚀
• داکیومنتیشن خودکار OpenAPI و Swagger UI بدون هیچ کار اضافه
• اعتبارسنجی ورودی‌ها با type hint و Pydantic
• پشتیبانی راحت از async / await برای I/O سنگین (DB، HTTP call و...)

نمونه‌ی استفاده:
from fastapi import FastAPI
from pydantic import BaseModel

class Item(BaseModel):
name: str
price: float

app = FastAPI()

@app.post("/items")
async def create_item(item: Item):
return {"message": f"created {item.name}", "price": item.price}


این سبک برای ساخت microserviceها، backend موبایل، سرویس داخلی شرکت، و APIهای داده‌محور خیلی جواب می‌ده؛ هم سریع توسعه می‌دی هم مستندات تمیز و قابل تست تحویل می‌دی.

Docs رسمی:
https://fastapi.tiangolo.com
GitHub:
https://github.com/tiangolo/fastapi

امتحانش کن روی یه API کوچک داخلی؛ معمولاً بعد از یه پروژه کامل بهش عادت می‌کنی 😄

🔖 #Python #پایتون #FastAPI #Python #Backend #API #Web

👤 Developix

💎 Channel: @DevelopixPython
👍8👎2
Forwarded from ابر ویراک
⭕️ ویراک کلود
زیرساختی مطمئن برای کسب و کارهای آنلاین
🎁 20% شارژ بیشتر روی اولین واریزی
⚡️با کد معرف: 10%  شارژ برای شما و 10% برای دوستتان!

🔘با IPv6 رایگان
🔘با IP مازاد
🔘تست رایگان 2 روزه
🔘فایروال اختصاصی
🔘با API برای حرفه‌ای ها
🔘پشتیبانی 24 ساعته
🔘آپلود رایگان


📞 همین حالا با ما تماس بگیرید و این فرصت فوق‌العاده رو از دست ندید!
🔻02191555530
🌐Virakcloud.com
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
📌 باز و بسته کردن فایل با context manager

خیلی وقت cها توی کدهای Python دیده می cشه فایل رو با open() باز می cکنیم، ولی فراموش می cکنیم ببندیمش. این کار می cتونه باعث Memory Leak، خطاهای عجیب روی سیستم فایل و قفل شدن فایل بشه.

راه تمیز و Pythonic استفاده از کلمهٔ کلیدی with هست که خودش به cصورت خودکار فایل رو می cبنده، حتی اگر وسط کار Exception بیاد. 😎

#  روش ضعیف
f = open("data.txt", "r", encoding="utf-8")
text = f.read()
# اگر اینجا Exception بیاد، f.close() هرگز صدا زده نمی cشه
f.close()

# روش پیشنهادی با context manager
with open("data.txt", "r", encoding="utf-8") as f:
text = f.read()

print(len(text))


اینجا with تضمین می cکنه بعد از اتمام بلاک، چه کد موفق اجرا بشه چه Exception رخ بده، متد f.close() صدا زده بشه. این دقیقاً رفتاریه که برای منابع حساس مثل فایل، کانکشن دیتابیس، و ساکت cها می cخوایم. 🔐

نکتهٔ مهم دیگه اینه که with کد رو خواناتر و قابل cاعتمادتر می cکنه؛ هر کسی کد رو ببینه، فوراً متوجه scope استفاده از منبع می cشه و لازم نیست دنبال close() بگرده.

این الگو رو می cشه برای چند فایل همزمان هم استفاده کرد:

with open("input.txt", "r", encoding="utf-8") as fin, \
open("output.txt", "w", encoding="utf-8") as fout:
for line in fin:
fout.write(line.upper())


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

منبع رسمی برای جزئیات بیشتر:
Python Docs - The with statement

🔖 #Python #پایتون #Python #File_I/O #Context_Manager #Best_Practices #Code_Readability

👤 Developix

💎 Channel: @DevelopixPython
الگوی Strategy: خداحافظ if-elif-elseهای غول‌آسا 🧠

یکی از Code Smellهای رایج در پروژه‌های Python، به‌خصوص در Django / FastAPI، زنجیره‌های بزرگ if / elif برای انتخاب نوع رفتار است. این ساختارها هم سخت تست می‌شوند، هم هر تغییر کوچکی را پرریسک می‌کنند.

یک راه‌حل تمیز و شناخته‌شده در Design Patternها برای این مشکل، الگوی Strategy است. این الگو منطق‌های قابل‌جایگزین (قابل تعویض) را در آبجکت‌های جدا نگه می‌دارد و کد را قابل‌گسترش و خواناتر می‌کند. 🙌

مثال ساده: فرض کنید در یک سرویس پرداخت، بسته به نوع روش پرداخت، منطق متفاوتی دارید:

class PaymentService:
def pay(self, method: str, amount: int) -> None:
if method == "card":
print("Paying by card", amount)
elif method == "paypal":
print("Paying by PayPal", amount)
elif method == "crypto":
print("Paying by crypto", amount)
else:
raise ValueError("Unsupported method")


این کلاس هم تک‌مسئولیتی نیست، هم هر بار روش جدیدی اضافه می‌شود باید کلاس را ادیت کنیم. زیر پا گذاشتن اصل Open/Closed.

با Strategy همین منطق را تمیز می‌کنیم:

from abc import ABC, abstractmethod

class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount: int) -> None:
...


class CardPayment(PaymentStrategy):
def pay(self, amount: int) -> None:
print("Paying by card", amount)


class PaypalPayment(PaymentStrategy):
def pay(self, amount: int) -> None:
print("Paying by PayPal", amount)


class CryptoPayment(PaymentStrategy):
def pay(self, amount: int) -> None:
print("Paying by crypto", amount)


class PaymentService:
def __init__(self, strategy: PaymentStrategy) -> None:
self._strategy = strategy

def pay(self, amount: int) -> None:
self._strategy.pay(amount)


حالا انتخاب Strategy می‌تواند در لایه‌ی وب (مثلاً FastAPI endpoint) انجام شود و PaymentService تمیز و قابل‌تست می‌ماند:

def get_strategy(method: str) -> PaymentStrategy:
mapping = {
"card": CardPayment(),
"paypal": PaypalPayment(),
"crypto": CryptoPayment(),
}
try:
return mapping[method]
except KeyError:
raise ValueError("Unsupported method")


نکته عملی قابل‌استفاده امروز
هرجا یک تابع یا view دارید که براساس یک نوع (type / method / status) با if-elifهای زیاد شاخه‌بندی می‌کند، آن منطق را به کلاس‌های کوچک‌تر Strategy تبدیل کنید و یک mapping تمیز بسازید. این کار هم خوانایی را بالا می‌برد، هم اضافه‌کردن رفتار جدید را بدون دست‌زدن به منطق قدیمی ممکن می‌کند.

برای مطالعه‌ی عمیق‌تر درباره Strategy:
refactoring.guru/design-patterns/strategy

کد تمیز با الگوهای درست، در پروژه‌های واقعی Python تفاوت جدی در سرعت توسعه و لذت کار ایجاد می‌کند. 🚀 امروز یکی از if-elifهای سنگین پروژه‌تان را به یک Strategy تمیز تبدیل کنید و نتیجه را در نگه‌داری و تست‌ها ببینید.

🔖 #Python #پایتون #python #strategy_pattern #clean_code #design_patterns #architecture #refactoring

👤 Developix

💎 Channel: @DevelopixPython
6👎2
در نمونه‌کد بالا تابع load_rows اول همه‌ی داده‌ها را یک‌جا در مموری می‌ریزد و بعد روی آن‌ها loop می‌زند؛ این کار روی فایل‌های بزرگ باعث Memory مصرفی بالا و حتی کرش برنامه می‌شود. در عوض، با برگرداندن یک generator و استفاده از yield می‌توانید خطوط را به‌صورت lazy و streamشده پردازش کنید تا هم مصرف مموری کم شود و هم عملکرد در سناریوهای پردازش فایل‌های بزرگ (مثلاً لاگ‌های چندگیگابایتی) بهتر شود. به‌خصوص در برنامه‌های ETL، پردازش لاگ و data pipelineها، این الگو نسبت به رویکرد لیست‌محور نمونه‌ی اول یک Design به‌مراتب پایدارتر و scalable محسوب می‌شود.

🔖 #Python #پایتون

👤 Developix

💎 Channel: @DevelopixPython
👍6👎1
👨‍💻 سوال برای توسعه‌دهندگان Python

خروجی اجرای کد زیر در Python چیست؟

به تفاوت بین متغیرهای سازنده (constructor) و متغیرهای کلاس و همین‌طور نحوهٔ ذخیره شدن default argumentها در حافظه دقت کنید.

class A:
cache = []

def __init__(self, items=None):
if items is None:
items = []
self.items = items
self.cache.append(len(self.items))


x = A([1, 2])
y = A()
z = A()

x.items.append(3)
y.items.extend([10, 20])

print(x.items, y.items, z.items, A.cache)


خروجی دقیق تابع print را بنویسید.

🔖 #Python #پایتون

👤 Developix

💎 Channel: @DevelopixPython
👍1
🚀 سرور اختصاصی با تنوع منابع برای هر نوع نیاز 
پورت اختصاصی
آپلود رایگان
تخفیف پلکانی ترافیک
آپتایم 99.99%
24 ساعت تست رایگان
ارائه IP مازاد 
پشتیبانی 24/7 
تحویل فوری 
ارائه سرویس Colocation 
بدون قطعی
پرداخت ماهیانه

تعداد محدود – برای استفاده از این تخفیف ویژه سریع اقدام کن!
برای اطلاعات بیشتر و سفارش، تماس بگیر:
🔺 02191555530
💻 خرید سرور اختصاصی
Please open Telegram to view this post
VIEW IN TELEGRAM
1