Python for Data Science
315 subscribers
127 photos
16 videos
12 files
61 links
اطلاعات مفید جهت یادگیری پایتون برای علم داده
Download Telegram
Forwarded from Go Casts 🚀
به دنبال ساختار باشید و نه چارچوب

چند روز پیش یه مربی کودک یه حرف خیلی مهمی زد با این مفهوم: «ما اینجا برای بچه ها ساختار تعیین می کنیم نه چارچوب، چارچوب یعنی حد و مرز!»
این جمله رو باید قاب کرد و زد رو دیوار، احتمالا در ابعاد خیلی زیادی از زندگی مهم باشه. در مهندسی نرم افزار و توسعه محصول هم خیلی حرف مهمیه.
بیشتر اوقات ما دنبال چارچوب هستیم در مهندسی نرم افزار، به همین دلیل وقتی خودمون رو به یه چارچوب خاص محدود می کنیم با چالش های زیادی روبرو میشیم. در حالیکه بهتره ما برای توسعه محصول ساختار داشته باشیم و طبق اصول ساختاری کار رو پیش ببریم، اینطوری چالش مون کمتر میشه.
اجازه بدید برداشت خودم از چارچوب و ساختار رو کمی بیشتر باز کنم. ساختار میشه مجموعه از قواعد رفتاری که باید سعی کنیم در توسعه محصول بهشون پایبند باشیم، در مقابل، چارچوب میشه تعیین کردن یه سری حد و مرز مشخص به شیوه ای سختگیرانه.
مثلا اگه بخوام برای توسعه یک سرویس ساختار تعیین کنم احتمالا میگم: این سرویس باید توان پاسخگویی بالایی داشته باشه، در مقابل خطا مقاوم باشه، قابلیت مقیاس پذیری داشته باشه، یک قرارداد ساده و شفاف به کلاینت ها ارائه بده و مواردی از این دست.
اما اگه بخوام چارچوب برای سرویس تعیین کنم احتمالا میگم: ما باید از ساختار کد مبتنی بر clean code یا ddd در فلان repository که خودمون یا دیگران اونو نوشتن پیروی کنیم، باید همه ورودی هارو تو پوشه port قرار بدیم، باید همه مدل هامون تو پوشه models باشه، باید از فلان روش ci/cd استفاده کنیم.

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

خیلی از practiceهایی که معروف شدند مثل clean code و ddd و tdd و غیره هم از نظر من بیشتر به دنبال این هستند که به شما کمک کنند که برای کارتون ساختار تعیین کنید. در حالیکه اشتباهی که زیاد رخ میده اینه که ما با خوندن این مطالب احتمالا بیشتر به سمت درآوردن چارچوب میریم... همه ش به دنبال این هستیم که مثلا یه boilerplate داشته باشیم که از clean code پیروی کنه و همون رو همه جا استفاده کنیم.

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

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

@gocasts
هر وقت صحبت از شیء گرایی و ارث بری میشه پای Mixin هم میاد وسط. اما دقیقا چیه؟ Mixin توی پایتون یک الگو هستش و کدهایی که از این الگو بهره می‌برند کلمه‌ی کلیدی خاصی یا چیز اضافه‌تری ندارند. فرض کنین ما می‌خواهیم یک متد جدید به یک کلاس اضافه کنیم تا کارایی یا Functionality اون رو زیاد کنیم. اینجا میشه از Mixin استفاده کرد.
مثلا کلاس‌های زیر رو در نظر بگیرید.
class Vehicle:
    pass

class Car(Vehicle):
    pass

class Van(Vehicle):
    pass

class Motorcycle(Vehicle):
    pass

حالا نیاز داریم که متد play music رو هم به این کلاس ها اضافه کنیم، دوتا راه داریم. اولیش اینه که:
class Vehicle:
    pass

class Car(Vehicle):

    def play_music(self):
        print("play_music")

class Van(Vehicle):

    def play_music(self):
        print("play_music")
   
class Motorcycle(Vehicle):
    pass

اما یک ایرادی وجود داره. اینجا خودمون رو تکرار کردیم. درواقع اومدیم دوبار یک تکه کد رو تکرار کردیم و این از نظر کدینگ وجه خوبی نداره. پس این راه حل ما نیست.
روش دوم اینه بیایم به بیس کلاسمون یعنی Vehicle یک متد تحت عنوان play_music اضافه کنیم.

class Vehicle:
    def play_music(self):
        print("play_music")

class Car(Vehicle):
    pass

class Van(Vehicle):
    pass

class Motorcycle(Vehicle):
    pass

اما در این صورت کلاس موتورسیکلت هم دارای رفتار پخش موزیک خواهد شد و این اشتباه است. اینجا است که Mixin خودش رو نشون می‌ده. به کد زیر توجه کنید.
class Vehicle:
    pass

class PlayMusicMixin:
    def play_music(self):
        print("play_music")

class Car(Vehicle, PlayMusicMixin):
    pass

class Van(Vehicle, PlayMusicMixin):
    pass

class Motorcycle(Vehicle):
    pass

درواقع از کلاس PlayMusicMixin قرار نیست هیچ شیٔ ای ساخته شود و صرفا مهم این است که کارایی کلاس‌های خاصی را افزایش شود.
پ.ن: اون کلمه‌ی Mixin انتهای اسم کلاس هم قراردادیه، بهتره نوشته بشه ولی اجبار نداره.
Forwarded from Python BackendHub (Mani)
یک سری نکاتی که بنظرم تو ویدیو جا مونده بود

@PyBackendHub
Forwarded from Python BackendHub (Mani)
چیزی که من متعجب شدم اکثرا میگن این <خیلی پیچیدست>. ولی حقیقتا اصلا پیچیده نیست. کامیونیتی پایتون خیلی گارد زیادی نسبت به تایپینگ داره که تو دراز مدت قطعا ضربه میخورین چون پایتون الان هر نسخه ریلیز میده ۸۰ درصدش تایپینگ improvement هست و شما اگه الان typing بلد نباشین عملا از خیلی از لایبری های جدید نمیتونید استفاده کنید.
تو این مثال حتی یک خط نشده. و شما اینکار رو برای آیدی ها انجام میدی. تو یک سرویس پرحجم که شما ۲۰۰ تیبل داری نهایتا میشه ۲۰۰ خط NewType. و باعث میشه signature همه کد های شما قابل خوانا باشه.
این tip به درد شما میخوره اگه کد میزنی. لزوما به بک اند هیچ ربطی نداره. الان شما یک تابع بنویسید که یک سری‌آیدی موزیک و آیدی یوزر بگیره و بعد بگه برای هر موزیک هر یوزر پیش بینی کنه از صفر تا صد چقدر ممکنه دوست داشته باشه

این ۳ مثال رو ببینید, مثال اول تایپینگ خوبی داره. مثال دوم تایپینگ داره ولی به درد بخور نیست خیلی. و مثال سوم تایپینگ نداره.

# WITH GOOD TYPING
Percentage: TypeAlias = int # from 0 to 100.
def calculate_music_populatiry(person_ids: list[PersonId], music_ids: list[MusicId]) -> dict[PersonId, list[tuple[MusicId, Percentage]]

# WITH BAD TYPING
def calculate_music_populatiry(person_ids: list[UUID], music_ids: list[UUID]) -> dict[UUID, list[tuple[UUID, int]]


# WITHOUT TYPING
def calculate_music_populatiry(person_ids, music_ids)


من میتونم بدونه اینکه کدو ببینم از فانکشن اولی استفاده کنم. فانکشن دومی معلوم نیست چی به چی لینک شده. پس باید حواسم باشه موقع استفاده ازش. و بعدا ریفکتورش هم کردم باید ۱۰۰درصد حواسم باشه signature اش تغییر نکنه. و فانکشن سوم که کلا فاجعست. اصلا maintainable نیست. قضاوت رو میذارم با خودتون.

@PyBackendHub
🏴 عاشورای حسینی تسلیت باد 🏴


🔎 @py4ds
Forwarded from Python BackendHub (Mani)
Python BackendHub
بخاطر یک ریلیز جدید setuptools که برکینگ چنج داشته، کل ابزارا مثل uv و poetry و pdm از کار افتادن از امروز فیکسش اینجاست موقتا https://github.com/pypa/setuptools/issues/4519#issuecomment-2254983472 @PyBackendHub
داستان چی بود؟
دیشب maintainer لایبری setuptools قبل اینکه بخوابه، یک ریلیز داد که بیلد قدیمی پایتون رو کلا دیگه ساپورت نمیکرد. ۵ ساله که deprecate شده بود و الان باید از PEP 571 استفاده کنید.

خیلی پکیج ها هنوز اینو اعمال نکرده بودن، درنتیجه pip install با نسخه اخر setuptool فیل میشد واسه اون پکیجا.

تو گیتهاب هم به شدت شلوغ شد! منتینر بعد ۱۰ ساعت بلند شد دید یک ایشو ساخته شده ۱۵۰ تام کامنت خورده 😁 در نتیجه ریلیز رو yank کرد.

نکته جالب اینجاست که اون warningای که میداد رو کنسول خیلی وقتا نمایش داده نمیشد، و برای همین خیلیا ندیده بودن اصلا.

خوده maintainer هم فرض کرده بود که مشکل زیادی پیش نمیاد.

خلاصه که درس شد:
۱. قبل از خواب ریلیز ندید 😂 اخرین روز هفته هم همینطور :))
۲. فرضیات همیشه با واقعیت فرق دارن، چیزایی که فکر میکنید قطعا کار میکنن درواقع ممکنه کار نکنند (مثل depreciation message). همیشه فرضیات رو زیرسوال ببرید و دوباره چک کنید وقتی دارین یک کار مهمی انجام میدین

@PyBackendHub
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
GIL Become Optional in Python 3.13

یکی از تغییرات خفن 3.13 نسبت به 3.12 اینه که میتونه GIL رو آپشنال داشته باشی و غیر فعالش کنی

هنوز توی بیلد های موجود تو سایت پایتون فعال نشده ولی توی رلیز نهایی چنین چیزی قابل استفاده هستش

اجرای برنامه قطعا سریعتر میشه اما احتمال ۹۹ درصد برای پروژه های قبلیتون غیر فعال کنید احتمالا ی عالمه باگ بخورید 😁

https://geekpython.in/gil-become-optional-in-python

@SEYED_BAX
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Python BackendHub (Mani)
آیوکلاک (AioClock) یک فریم ورک برای scheduling و یا تسک منیجمنت هست و هر چیزی که هر فریم ورکی نیاز داره رو داخلش داره, مثل دپندسی اینجکشن و startup/stop ایونت, ساپورت از ماژولار کد نوشتن و ...

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

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


@PyBackendHub
Forwarded from Sadra Codes
🚩 پایتون ۳.۱۳؛ فیچرهای جدید و دپریکیشن‌ها!


🔥 گیل (GIL) آپشنال: امکان بیلد گرفتن از CPython و غیرفعال کردن GIL. (در حالت عادی شما از GIL استفاده می‌کنید)

🔥 کامپایلر JIT: قراره در این پچ جدید، از یک کامپایلر just in time رونمایی شه که در یک سری از سناریوهای خاص، سرعت اجرای کدتون رو افزایش میده. این رو موقع بیلد گرفتن دستی از CPython میشه تنظیم‌ کرد و بصورت پیشفرض غيرفعال هست.

🔥 تایپ هینت IsType و ReadOnly: دوتا تایپ جدید به typing اضافه شده. در مقاله مثال زدم.

🔥 ساپورت از سیستم‌عامل iOS: یک رلیز قابل نصب روی iOS قراره در این پچ قرار داده بشه. هنوز خبری از رلیز اندروید نیست ولی گویا دارن روش کار می‌کنن. (چیزی که بعنوان پایتون روی دیوایس‌های اندرویدتون نصب دارید، رلیز لینوکس پایتون هست.)

🔥 بهبود Interaction: ارورها و تریس‌بک‌ها دقیق‌تر و هوشمندتر شدن. همچنین ارورها بصورت رنگی نمایش داده میشن.

🔥 بهبود REPL: کامندهای exit، help و quit تغییر کردن.

و کلی فیچر و امکانات جدید که توی ۵ دقیقه در مقاله زیر توضیح دادم به همراه مثال‌های ساده و قابل فهم:

🔗 https://blog.imsadra.me/python-313-new-features-deprecations


For more 👉 @lnxpylnxpy
👍2
Forwarded from PythoMeme🤡
😁3
Forwarded from Sadra Codes
یه مقاله خیلی جمع و جور نوشتم واستون. اگه به مبحث type hinting علاقه دارین، توی این مقاله راجع به Generic Typing توی پایتون نوشتم. دقیقا سینتکس زیر و اون [T] که گاها ممکنه گیج کننده باشه:

def function[T](...) -> T:
...


اینکه چیه و چیکار می‌کنه به همراه کلی مثال و تمرین کوچیک که درک این قضیه رو واستون ساده‌تر می‌کنه.

Read 👉 https://blog.imsadra.me/generic-typing-in-python

این سینتکس در ورژن ۳.۱۲ معرفی شد. در رلیزهای بعدی پایتون، خواهید دید که خیلی از این سینتکس استفاده میشه.
👍2
Sadra Codes
یه مقاله خیلی جمع و جور نوشتم واستون. اگه به مبحث type hinting علاقه دارین، توی این مقاله راجع به Generic Typing توی پایتون نوشتم. دقیقا سینتکس زیر و اون [T] که گاها ممکنه گیج کننده باشه: def function[T](...) -> T: ... اینکه چیه و چیکار می‌کنه به همراه…
یک مثال مرتبط با مقاله بالا ببینیم:
کد پایین رو میتونید با پایتون ۳.۱۲ به بعد اجرا کنید و خروجی اون رو ببینید


from typing import TypeVar, Generic, List

T = TypeVar("T")


class Stack(Generic[T]):
def __init__(self) -> None:
self._items: List[T] = []

def push(self, item: T) -> None:
self._items.append(item)

def pop(self) -> T:
if not self._items:
raise IndexError("pop from empty stack")
return self._items.pop()

def peek(self) -> T:
if not self._items:
raise IndexError("peek from empty stack")
return self._items[-1]

def is_empty(self) -> bool:
return len(self._items) == 0

def __repr__(self) -> str:
return f"Stack({self._items})"


def main() -> None:
# Stack for strings
str_stack = Stack[str]()
str_stack.push("1") # This is correct
str_stack.push(1) # This should cause a type error


if __name__ == "__main__":
main()


$ mypy ./g.py
g.py:34: error: Argument 1 to "push" of "Stack" has incompatible type "int"; expected "str" [arg-type]
Found 1 error in 1 file (checked 1 source file)



ضمن اینکه در بخش
 Stack[str]()
میتونید هرنوع دلخواهی به جای str بنویسید تا به تایپ چکر بگید میخواید توی کل اون کلاس به جای T از چه نوع داده‌ای استفاده کنید.
البته اگر چیزی ننویسید هم اجرا میشه!

🔎 @py4ds
👍4
🔺اجرای مدل‌های زبانی از طریق ابزار ollama

ابتدا ابزار ollama را از طریق لینک زیر دانلود کنید
https://github.com/ollama/ollama/releases


برای سفارشی سازی پرامپت در یک پوشه دلخواه فایل Modelfile را بسازید:
FROM llama3.2

# set the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1

# set the system message
SYSTEM """
You are Mario from Super Mario Bros. Answer as Mario, the assistant, only.
"""


شما می‌توانید در این فایل تنظیمات مختلفی برای مدل در نظر بگیرید
مثلا
این ModelFile تنظیمات زیر را مشخص می‌کند:
1️⃣ مدل زبانی مورد استفاده: از نسخه llama3.2 استفاده می‌کند.
2️⃣ پارامتر دما: روی 1 تنظیم شده است، به این معنی که پاسخ‌ها خلاقانه‌تر و متنوع‌تر خواهند بود.
3️⃣ پیام سیستمی: مدل باید به عنوان شخصیت ماریو از Super Mario Bros رفتار کند و پاسخ‌ها را در نقش این شخصیت ارائه دهد.

این فایل برای تنظیم مدل زبانی با هدف ارائه پاسخ‌های خاص و شخصیت‌محور مفید است.

در نهایت می‌توانید مدل را از طریق ترمینال سیستم اجرا کنید:
ollama create mario -f ./Modelfile
ollama run mario
>>> hi
Hello! It's your friend Mario.


همچنین برای استفاده از مدل‌ها از طریق پایتون می‌توان از نمونه کد زیر استفاده کرد:
import ollama
from ollama import Client

model = 'llama3.2'

try:
ollama.chat(model)
except ollama.ResponseError as e:
print('Error:', e.error)
if e.status_code == 404:
ollama.pull(model)

client = Client(host='https://localhost:11434')
response = client.chat(model=model, messages=[
{
'role': 'user',
'content': 'Why is the sky blue?',
},
])


🔎 @py4ds
Forwarded from Python4Finance
Media is too big
VIEW IN TELEGRAM
ویژگی های جدید پایتون 3_13

در این فیلم، ویژگی های جدید پایتون توضیح داده می شود. (زبان فایل، انگلیسی روان است)

#پایتون3_13
#python3.13
#new_features

پایتون برای مالی

🆔 @python4finance
Forwarded from PythoMeme🤡
🔥1
🍃🍃🍃🍃🍃🍃🍃🍃🍃
روز ولادت امام علی(ع) و روز مرد مبارک باشه
3