TGViewer
Channel Public Channel
بنیاد پایتون کاران فارسی

بنیاد پایتون کاران فارسی

@psfarsi

🔰 مقالات و اخبار مرتبط با پایتون فارسی


🎗 گروه رسمی بنیاد نرم افزار پایتون فارسی:
@PyFarsi

🎗 گروه برنامه نویسی و امنیت شبکه:
@Gozarit | @Gozaritch

🎗 گروه آفتاپیک:
@PyFarsi_offtopic | @GozarITOfftopic

🎗 تبلیغات:
@GozaritADS
Subscribers
1.89K
Photos
459
Videos
82
Links
617
Recent Posts 20 shown
Post #1477 109

Forwarded from ☁ فروش سرور مجازی | Cloud VPS 🇩🇪

🚀 هاست حرفه‌ای مخصوص ربات‌های تلگرامی

🇳🇱 سرور هلند (Leaseweb)
⚡️ تأخیر پایین و اتصال سریع به Telegram
🧠ء RAM و CPU اختصاصی
💾ء SSD NVMe پرسرعت
🐍ء Python + Terminal + SSH
🚀ء LiteSpeed | SSL رایگان
🛡 بکاپ‌گیری منظم

♾️ مناسب اجرای 24/7 ربات‌ها و پروژه‌های Python
━━━━━━━━━━━━━━

📌 مشخصات و قیمت کامل پلن‌ها در بنر بالا
📩 سفارش و مشاوره:

☁️
@ServerClouds
👨‍💻
@Hidden0612
━━━━━━━━━━━━━━

ServerClouds | زیرساخت سریع و پایدار
#هاست #هاست_تلگرام #هاست_ربات #ربات_تلگرام #سرور_هلند #Python #SSH #ServerClouds
Post #1472 589
#خارج_از_بحث

چرا چیزهایی که یاد می‌گیریم را به اشتراک بگذاریم؟

یکی از عادت‌هایی که می‌تواند تأثیر زیادی روی رشد یک برنامه‌نویس داشته باشد، این است که چیزهایی را که یاد می‌گیریم با دیگران به اشتراک بگذاریم.
اما نه صرفاً برای اینکه بگوییم:
«من اینو بلدم»

اتفاقاً بخش مهم ماجرا چیز دیگری است.
🔹 ۱. وقتی توضیح می‌دهی، واقعاً یاد می‌گیری
ممکن است یک مفهوم را هنگام خواندن کاملاً متوجه شده باشی؛ اما وقتی بخواهی همان مفهوم را برای شخص دیگری توضیح بدهی، ناگهان متوجه می‌شوی که بعضی قسمت‌هایش را فقط «حس کرده‌ای» و عمیقاً درکش نکرده‌ای.
توضیح دادن، نقاط ضعف فهم ما را آشکار می‌کند.
به همین دلیل است که نوشتن درباره‌ی یک موضوع می‌تواند خودش یک مرحله از یادگیری باشد.
🔹 ۲. مجبور می‌شوی دقیق‌تر فکر کنی
وقتی قرار است چیزی را منتشر کنی، دیگر نمی‌توانی به یک جمله‌ی مبهم مثل:
«Asyncio کلاً باعث میشه برنامه سریع‌تر بشه.»

اکتفا کنی.
باید از خودت بپرسی:
«دقیقاً چرا؟»
«در چه شرایطی؟»
«چه زمانی این اتفاق نمی‌افتد؟»
و همین سؤال‌ها باعث می‌شوند از حفظ کردن یک مفهوم، به سمت درک کردن آن بروی.
🔹 ۳. بازخورد گرفتن، یادگیری را سریع‌تر می‌کند
وقتی چیزی را منتشر می‌کنی، ممکن است کسی بیاید و بگوید:
«این قسمت دقیق نیست.»

یا حتی:
«این روش در فلان شرایط مشکل دارد.»

اگر درست برخورد کنیم، این اتفاق یک فرصت فوق‌العاده است.
چون ممکن است یک اشتباه کوچک، باعث شود چیزی را یاد بگیری که شاید بدون آن بازخورد هفته‌ها بعد متوجهش می‌شدی.
🔹 ۴. دانش ما تبدیل به یک آرشیو قابل جستجو می‌شود
فرض کن امروز درباره‌ی asyncio.gather مطالعه کردی و یک ماه بعد دوباره به همان موضوع نیاز پیدا کردی.
اگر فقط خوانده باشی، احتمالاً باید دوباره جستجو کنی.
اما اگر درباره‌اش نوشته باشی، یک یادداشت شخصی داری که دقیقاً با زبان و مثال‌های خودت نوشته شده.
در واقع:
Content = External Memory 🧠
🔹 ۵. به دیگران کمک می‌کنی
شاید موضوعی که برای تو ساده شده، برای شخص دیگری دقیقاً همان چیزی باشد که ساعت‌ها دنبالش می‌گشته.
یک مثال ساده، یک توضیح فارسی یا حتی یک تجربه‌ی شخصی می‌تواند مسیر یادگیری شخص دیگری را کوتاه‌تر کند.
و این یکی از زیباترین بخش‌های یادگیری در جامعه‌ی برنامه‌نویسی است:
ما از دانش دیگران یاد می‌گیریم و با به اشتراک گذاشتن دانش خودمان، به نفر بعدی کمک می‌کنیم.
🔹 ۶. لازم نیست متخصص باشی
یکی از بزرگ‌ترین اشتباهات این است که فکر کنیم:
«وقتی حرفه‌ای شدم شروع به تولید محتوا می‌کنم.»

نه.
لازم نیست درباره‌ی چیزی که تازه یاد گرفته‌ای مثل یک متخصص صحبت کنی.
می‌توانی خیلی ساده بگویی:
«امروز

asyncio.create_task
را یاد گرفتم و این چیزی بود که فهمیدم...»

این حتی می‌تواند ارزشمندتر باشد، چون شخصی که یک قدم عقب‌تر از توست، احتمالاً دقیقاً به همان توضیح نیاز دارد.
فقط یک اصل مهم وجود دارد:
چیزی را که مطمئن نیستی، با قطعیت آموزش نده.
اگر هنوز در حال یادگیری هستی، همان را شفاف بگو.
در نهایت، به اشتراک گذاشتن چیزی که یاد گرفته‌ای فقط کمک به دیگران نیست.
باعث می‌شود:
📌 بهتر بفهمی
📌 دقیق‌تر فکر کنی
📌 اشتباهاتت را پیدا کنی
📌 بازخورد بگیری
📌 یک آرشیو شخصی بسازی
📌 و بخشی از دانش جامعه‌ی برنامه‌نویسی باشی
پس لازم نیست منتظر باشیم تا «خیلی حرفه‌ای» شویم.

🔰Group: @PyFarsi
🔰Channel: @PSFarsi
  • 👍 3
  • ❤ 1
  • 🔥 1
Post #1464 624
بنیاد پایتون کاران فارسی فرض کنید ما این Schema رو داریم: class PostBase(BaseModel): title: str content: str category_id: int | None = None class PostCreate(PostBase): pass class PostResponse(PostBase): id: int slug: str author_id: int created_at:…
خب پس از همکاری و بحث و گفتگوی فوق العاده ای که درباره این سوال شد بریم سراغ جوابش
همونطور که آقا سروش اشاره کرد، اینجا یک اشتباه سهوی به وجود اومده.

این قسمت:
category_id: int | None = None


نمیگه:

اگر category_id مقدار 0 داشت، اون را به None تبدیل کن.


بلکه میگه:

category_id

میتونه یک

int
یا

None
باشه و اگر فیلد اصلا ارسال نشد، مقدار پیش‌فرض

None
خواهد بود.


بنابراین:

اگه category_id اصلا ارسال نشه، مقدار پیش‌فرض که None هست به category_id اختصاص داده میشه

و اگه :
{
"category_id": null
}


ارسال بشه بازم None میشه.

اما اگه بنویسیم :
{
"category_id": 0
}


و ارسالش کنیم، category_id = 0 میشه. تا اینجا همه چی ساده و مشخص بود. اما پس مشکل اصلی کجاست؟

مشکل اصلی در Router صورت میگیره!

اینجا ما گفتیم:
if data.category_id:


که یعنی اگه ما 0 ارسال کنیم مثل این میمونه که ما این شرط رو چک کردیم:
if 0:


و در پایتون مقدار 0 برابر با Falsy value هست.
پس وقتی:
data.category_id == 0

باشه، این شرط:
if data.category_id:

اجرا نمیشه.
در نتیجه، اصلاً این Query هم اجرا نمیشه:
select(Category).where(Category.id == data.category_id)


و Router مستقیم میره سراغ ساخت Post:
post = Post(
...
category_id=0,
)

بعد:
await db.commit()


و SQLAlchemy درخواست INSERT را به دیتابیس (در اینجا PostgreSQL) میفرسته.
PostgreSQL هم هنگام INSERT بررسی میکنه:
آیا در جدول

categories
رکوردی با

id = 0
وجود دارد؟

چون مقدار category_id=0 به رکوردی در جدول categories اشاره نمی‌کنه، Foreign Key Constraint نقض میشه و IntegrityError میگیریم.
راه حل چیه؟
در این مثال، category_id اختیاریه و میتونه None باشه. پس ما میتونیم None بودن یا نبودنش رو چک کنیم و به صراحتا بگیم :

if data.category_id is not None:
result = await db.execute(
select(Category).where(Category.id == data.category_id)
)

category = result.scalar_one_or_none()

if category is None:
raise CategoryNotFound(data.category_id)


حالا اگر:
"category_id": 0

باشه، شرط اجرا میشه و وجود Category با ID صفر بررسی میشه.
اگر وجود نداشته باشه، قبل از رسیدن به Database خطای مناسب رو raise میکنیم.
که اینجا میرسیم به یکی از اصول Zen of Python :

Explicit is better than implicit

⚠️ نکته : اگر از نظر Business Logic پروژه تون، مقدار category_id باید عددی بزرگتر از صفر باشه، بهتره که این محدودیت رو در Schema تعریف کنیم:

from pydantic import BaseModel, Field

class PostBase(BaseModel):
title: str
content: str
category_id: int | None = Field(default=None, gt=0)


حالا:
{
"category_id": 0
}


اصلاً وارد منطق Router نمیشه و Pydantic خطای Validation Error بر میگردونه.

اما:
{
"category_id": null
}


و :

{
"category_id": 5
}

مشکلی نداره.
  • 👏 2
Post #1462 452
فرض کنید ما این Schema رو داریم:
class PostBase(BaseModel):
title: str
content: str
category_id: int | None = None


class PostCreate(PostBase):
pass


class PostResponse(PostBase):
id: int
slug: str
author_id: int
created_at: datetime
updated_at: datetime

model_config = ConfigDict(from_attributes=True)

و Router ما در FastAPI اینه :
from fastapi import APIRouter

router = APIRouter(prefix="/posts", tags=["Posts"])

@router.post(
"",
status_code=status.HTTP_201_CREATED,
response_model=PostResponse,
)
async def create_post(
data: PostCreate,
current_user: Annotated[User, Depends(get_current_user)],
db: Annotated[AsyncSession, Depends(get_db)],
):
if data.category_id:
result = await db.execute(
select(Category).where(Category.id == data.category_id)
)

if not result.scalar_one():
raise CategoryNotFound(data.category_id)

post = Post(
title=data.title,
slug=data.title.lower().replace(" ", "-"),
content=data.content,
category_id=data.category_id,
author_id=current_user.id,
)

db.add(post)
await db.commit()
await db.refresh(post)

return post

حالا این Request را ارسال می‌کنیم:
{
"title": "Hello",
"content": "World",
"category_id": 0
}

و PostgreSQL این خطا رو می‌ده:
ForeignKeyViolationError:
insert or update on table "posts"
violates foreign key constraint "posts_category_id_fkey"

DETAIL:
Key (category_id)=(0) is not present in table "categories".


چرا اینجا خطا دریافت کردیم؟ (در کامنت ها پاسخ بدید)

🔰Group: @PyFarsi
🔰Channel: @PSFarsi

#fastapi #backend #pydantic #restapi #python
  • 👍 2
  • 👌 1
Post #1449 1.08K
در جنگو، از blank=True استفاده کنیم یا null=True ؟

یکی از اشتباهات رایج در طراحی مدل‌های Django اینه که برای فیلدهای متنی مثل EmailField یا CharField بدون دلیل از null=True استفاده کنیم.
مثلاً بین این دو:
email = models.EmailField(
max_length=100,
blank=True
)

و:
email = models.EmailField(
max_length=100,
blank=True,
null=True
)

معمولاً گزینه‌ی اول انتخاب بهتریه.
چرا؟
چون blank=True یعنی این فیلد در مرحله‌ی validation می‌تونه خالی باشه.
اما null=True یعنی دیتابیس اجازه داشته باشه مقدار NULL ذخیره کنه.
در فیلدهای متنی Django معمولاً توصیه میشه از null=True استفاده نکنیم؛ چون در این حالت برای خالی بودن دو حالت مختلف خواهیم داشت:

email = ""

و :

email = None


یعنی برای یک مفهوم ساده، دو مقدار متفاوت داریم که می‌تونه در queryها و منطق برنامه دردسر اضافه ایجاد کنه.
پس در اکثر مواقع:
email = models.EmailField(
max_length=100,
blank=True
)


انتخاب تمیزتر و اصولی‌تریه
📌 پس:
برای CharField و EmailField و سایر فیلد های متنی، معمولاً blank=True کافی است.

🔰Group: @PyFarsi
🔰Channel: @PSFarsi

#Django #Python #Backend #Programming
  • 👍 8
  • ❤ 2
Post #1425 3.73K

Forwarded from آموزش برنامه نویسی و دوره های امنیتی

// Initialization of a new chapter...
#define SUCCESS 100%
#define STABILITY 100%
#define BUGS 0

/* سال نو، فرصتی برای ریفکتور مسیر زندگی و بهینه‌سازی اهداف است */
if (NEW_YEAR)
{
  print("سال نو آغاز یک چرخه‌ی جدید از تلاش، پیشرفت و موفقیت است. امیدواریم در این سال، تمامی پردازش‌های زندگی‌تان بدون خطا اجرا شده، خروجی تلاش‌هایتان بهینه باشد و در مسیر رشد و آرامش، همیشه در حالت پایدار باقی بمانید.")
}

〰➖〰➖〰➖〰➖〰➖〰
📌 با احترام از سوی مجموعه برنامه نویسان

🛡 Programming: @Gozaritch
🔒 Network Security: @LearnSecurityIR
👨‍💻 Programming: @PSFarsi

🎮 Gift: @Persian_GiftIR
🎬 FilmBazan: @FilmBazanG
🍁 Facts: @FactsOf_Life
  • 😁 5
  • ❤ 3
Post #1424 3.51K
🚀 پشتیبانی رسمی Django از MongoDB منتشر شد!

🔹 خبر خوب برای توسعه‌دهندگان Django! تیم MongoDB به‌تازگی از بک‌اند رسمی MongoDB برای Django رونمایی کرده است که اکنون در مرحله پیش‌نمایش عمومی قرار دارد.

🔹 با این پکیج، می‌توانید مستقیماً از مدل‌های Django برای مدیریت اسناد MongoDB استفاده کنید و از قابلیت‌های قدرتمند Django مانند فرم‌ها، اعتبارسنجی، احراز هویت و حتی پنل مدیریت بهره ببرید.

🔹 اتصال به MongoDB نیز به‌راحتی از طریق تنظیمات settings.py انجام می‌شود. نسخه نهایی این پکیج در اواخر ۲۰۲۵ منتشر خواهد شد.

🔗 مطالعه بیشتر

#Django #MongoDB #Backend #توسعه_وب

🔰Group: @PyFarsi
🔰Channel: @PSFarsi
MongoDB MongoDB Django Backend Now Available In Public Preview MongoDB Django Backend is available for public preview, try it today to help drive development.
  • 🔥 8
  • 👍 1
Post #1421 2.19K
سوال⁉️

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

☑️ مثال :

words = [
"bird",
"apple",
"banana",
"cherry",
"dog",
"cat",
"sun",
"moon",
"star",
"fish",
"turtle",
"frog",
"elephant",
"giraffe",
"zebra",
]



☑️ خروجی :

letter='a': ['apple']
letter='b': ['banana', 'bird']
letter='c': ['cat', 'cherry']
letter='d': ['dog']
letter='e': ['elephant']
letter='f': ['fish', 'frog']
letter='g': ['giraffe']
letter='m': ['moon']
letter='s': ['star', 'sun']
letter='t': ['turtle']
letter='z': ['zebra']


〰️〰️〰️〰️〰️〰️〰️〰️〰️
🔰Group: @PyFarsi
🔰Channel: @PSFarsi
  • 👍 3
  • ❤ 1
Post #1420 1.53K

Forwarded from Learn Security | آموزش امنیت

☢️ دوره اندروید هکینگ!
قسمت دوم: مود کردن بازی‌های یونیتی ( آنلاک درون پرداختی و آیتم های پولی )

📝 در این قسمت یاد می‌گیریم چگونه ویژگی‌های پولی بازی‌ها و برنامه‌های اندرویدی را آنلاک کنیم!
💸 روش‌های عملی برای عبور از محدودیت‌های پرداختی

📱 ابزارها و ترفندهای حرفه‌ای که هیچ‌وقت به شما نگفتند!

📱 مشاهده ویدیو کامل در یوتیوب
💡 منتظر قسمت‌های بعدی باشید!

〰〰〰〰〰
🌐 Website: LearnSecurity.ir
🎓 Channel: @LearnSecurityIR
🖥 Programming: @GozarIT | @PyFarsi
〰〰〰〰〰
  • 👍 3
  • 😁 1
Post #1419 2.01K
پکیج Django Cotton یک ابزار برای ایجاد و مدیریت کامپوننت‌های مدرن در قالب‌های جنگو است. این پکیج با افزودن قابلیت‌هایی مشابه سیستم‌های کامپوننت‌محور مدرن مثل React یا Vue، به توسعه‌دهندگان کمک می‌کند تا کدهای فرانت‌اند خود را به صورت ماژولار و قابل استفاده مجدد بنویسند.

ویژگی‌های اصلی Django Cotton
1- کامپوننت‌ها با قابلیت استفاده مجدد: کامپوننت‌ها می‌توانند متغیرها و HTML دلخواه دریافت کرده و خروجی آن‌ها را قابل تنظیم کنند.
2- استفاده از c-slot: برای ارسال بلوک‌های HTML به عنوان اسلات به کامپوننت‌ها.
3- قابلیت اورراید کردن ویژگی‌های پیش‌فرض: با استفاده از <c-vars> می‌توان مقادیر پیش‌فرض را تعریف و در صورت نیاز بازنویسی کرد.
قابلیت تعریف کامپوننت‌های پویا: با استفاده از حلقه‌ها یا داده‌های پویا، می‌توان کامپوننت‌هایی را بر اساس نوع داده نمایش داد.
تلفیق با ابزارهایی مانند HTMX: برای مدیریت درخواست‌های AJAX و رفرش کردن بخش‌های مختلف صفحه.

داکیومنت رسمی
گیت‌هاب
  • 👍 3
  • ❤ 1
Post #1417 1.53K

Forwarded from Learn Security | آموزش امنیت

☢️ دوره اندروید هکینگ!
قسمت اول: مود کردن بازی‌های یونیتی

📝 در این قسمت یاد می‌گیرید که چطور بازی‌ یونیتی با ساختار mono را به راحتی مود کنید. به راحتی میتوانید بازی های دلخواه خود را دانلود و آن را به طور کامل مود و قفل های بازی را آنلاک کنید.
📱 ابزارها و ترفندهای حرفه‌ای که هیچ‌وقت به شما نگفتند!

📱 مشاهده ویدیو کامل در یوتیوب
💡 منتظر قسمت‌های بعدی باشید!

〰〰〰〰〰
🌐 Website: LearnSecurity.ir
🎓 Channel: @LearnSecurityIR
🖥 Programming: @GozarIT | @PyFarsi
〰〰〰〰〰
Post #1413 2.08K

Forwarded from پرشین گیفت | Persian Gifts

🎮 به دنیای بازی‌ها خوش آمدید! تجربه‌ای جدید در خرید!

💸 با خرید گیفت کارت‌های بازی و استیم از Persian Gift، دنیای جدیدی از سرگرمی‌ها را کشف کنید!

⭐️ بهترین گیفت کارت‌های بازی را با قیمت‌های مناسب پیدا کنید. با ما همراه شوید و از تجربه‌های جدید لذت ببرید.

🌟 خرید سریع و آسان گیفت کارت‌های بازی و استیم و ... با بهترین قیمت‌ها!


🎮 مجموعه خدماتی پرشین گیفت

💠 Channel: @Persian_GiftIR
🌐 Website: Persian-Gift.ir
👤 Support: @Hidden0612
Post #1410 1.44K

Forwarded from Learn Security | آموزش امنیت

📱 تست نفوذ حرفه‌ای و دسترسی کامل به گوشی‌های اندرویدی!

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

📍 دسترسی فول امکانات نظیر دسترسی به پیام ها، تماس ها، مخاطبین، تغییر والپیپر، لاک
گوشی، ریستارت، خاموش روشن کردن و...


♾ نمیدونم چرا هرکی میاد پیشم موبایلش رو دستم نمیده مثلا ی ساعت نگاه کنم، به نظرتون دلیل خاصی میتونه داشته باشه 😁


🎥 ویدیو دمو می باشد ...
🔜 ویدیو کامل به زودی ...
✅ با ما همراه باشید ...
💪 حمایت بشه ویدیو آموزشی کامل میزارم.
〰〰〰〰〰
🌐 Website: LearnSecurity.ir
🎓 Channel: @LearnSecurityIR
🖥 Programming: @GozarIT | @PyFarsi
〰〰〰〰〰
  • 👍 2
Post #1409 1.46K

Forwarded from Learn Security | آموزش امنیت

📱 تست نفوذ حرفه‌ای و دسترسی کامل به گوشی‌های اندرویدی!

🖥 یادگیری تکنیک‌های پیچیده و ابزارهای تخصصی برای تست نفوذ اندورید!

📶 در این سناریو تست نفوذ بر روی موبایل هایی که به شبکه Wi-Fi ما متصل هستند، صورت می‌گیرد.

📝 در این سناریو از دیوایس های واقعی استفاده می‌شود و از مجازی ساز ها ( مانند Nox و ... ) استفاده نمی‌شود و کاملا در محیط واقعی و کلاینت های واقعی انجام می‌شود.

⌨️ قراره یاد بگیریم با زبان پایتون دسترسی به پیامک ها و ... از موبایلی که به شبکه ما وصل هست بگیریم.

🔜 به زودی ...
✅ با ما همراه باشید ...
💪 حمایت کنید ...
〰〰〰〰〰
🌐 Website: LearnSecurity.ir
🎓 Channel: @LearnSecurityIR
🖥 Programming: @GozarIT | @PyFarsi
〰〰〰〰〰
  • ❤ 5
  • 🔥 1
Post #1405 2.76K
آیا میدونستید میتونید با استفاده از کامنت
# type: 

تو پایتون برای تعریف type annotation استفاده کنید؟😁

پ.ن: خودم شخصا برای ignore کردن یسری از خطاهای مربوط به همین type ها ازش استفاده میکردم ولی نمیدونستم این قابلیت هم داره
  • 🔥 13
  • 👍 7
Post #1404 2.53K
بنیاد پایتون کاران فارسی #سوال مشکل کد زیر از نظر type annotation چیست؟ def f(l: list[object], k: list[int]) -> None: l = k
بسیار خب بیایید به جواب این سوال بپردازیم:

جواب این سوال در واقع به سه موضوع کوواریانس (Covariance)، کونتراواریانس (Contravariance) و اینواریانس (Invariance) بر میگردد. این سه مفهوم، مفاهیم مهمی در نظریه‌ی نوع‌ها (type theory) و typing در زبان‌های برنامه‌نویسی هستند. این مفاهیم به چگونگی رابطه‌ی بین type های مختلف و subtypes های آن‌ها مربوط می‌شوند.

در ادامه مختصری از هر یک توضیح داده میشود :


1. Covariance

کوواریانس (Covariance) زمانی رخ می‌دهد که یک type از نوع B که subtype عه A است، قابل assign کردن به یک مجموعه (Collection) از نوع B باشد. به عبارت دیگر، در Covariance، اگر A یک نوع باشد و B نوعی باشد که از A ارث بری میکند، یک شیء از نوع B می‌تواند جایگزین یک شیء از نوع A شود.

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


2. Contravariance

مفهوم Contravariance برعکس Covariance است. در این حالت ما میتوانیم از نوع پایه یا base به جای subtype استفاده کنیم. به عبارت دیگر، در Contravariance، اگر A یک نوع باشد و B نوعی باشد که از A مشتق شده است، یک شیء از نوع A می‌تواند جایگزین یک شیء از نوع B شود.


3. Invariance

بر خلاف کوواریانس و کونتراواریانس، اینواریانس به این معنی است که یک نوع نمی‌تواند به یک نوع دیگری (حتی subtype یا supertype) تبدیل شود. به عبارت دیگر، اگر یک متغیر یا پارامتر از یک نوع خاص باشد، فقط می‌تواند همان نوع خاص را بپذیرد و نه نوعی دیگر.

بسیاری از ساختارهای داده در زبان‌های برنامه‌نویسی اینواریانس هستند.


حالا که این مفاهیم را فهمیدیم بیایید به سوال برگردیم:

ما تابعی به شکل زیر داریم:

def f(l: list[object], k: list[int]) -> None:
l = k


در این تابع ما دو پارامتر داریم:

- پارامتر l که لیستی از object ها است.
- پارامتر k که لیستی از int ها است.

در بدنه تابع، ما میخواهیم لیست k که از نوع [list[int است را به l که از نوع [list[object است، اختصاص دهیم.
در نگاه اول ممکن است به نظر برسد که این کد باید کار کند زیرا int نوعی object است. اما نکته ای که وجود دارد این است که لیست ها در پایتون از مفهوم Invariance بهره میبرند.

لیست‌ها و به طور کلی بیشتر نوع‌های Generic در پایتون invariance هستند.

این به این معنی است که شما نمی‌توانید [list[int را به [list[object تبدیل کنید، حتی اگر int نوعی object باشد.

* دلیل این خطا این است که اگر اجازه چنین کاری داده شود، ممکن است باعث بروز خطاهای runtime شود!
برای مثال، فرض کنید که بعد از تخصیص k به l، شما می‌خواهید یک مقدار str رو به لیست l اضافه کنید (str هم یک object هست) :

def f(l: list[object], k: list[int]) -> None:
l = k
l.append("a string")


در اینجا، l در واقع یک [list[int است (لیستی از اعداد صحیح) و اضافه کردن یک مقدار str به آن باعث خطا می‌شود.

یادگیری type annotation یکی از اون دسته بحثای جالب و گاهی پیچیده در پایتون است که پیشنهاد میشه حتما برید دنبال یادگیریش😁

موفق و پیروز باشید.
  • 👍 12
Post #1403 1.61K
#سوال

مشکل کد زیر از نظر type annotation چیست؟

def f(l: list[object], k: list[int]) -> None:
l = k
  • 👍 2
Older posts →

About this channel

How can I read @psfarsi without a Telegram account?
TGViewer shows the public web preview Telegram publishes for بنیاد پایتون کاران فارسی: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does بنیاد پایتون کاران فارسی have?
بنیاد پایتون کاران فارسی (@psfarsi) has 1.89K subscribers on Telegram, refreshed roughly every 30 minutes.
Does بنیاد پایتون کاران فارسی know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →