Ninja Learn | نینجا لرن
💣 بکگراند تسک در برنامهنویسی وب 💣 #پست_جدید بکگراند تسکها یا وظایف پسزمینهای، عملیاتهایی هستن که خارج از پراسس یا ترد اصلی اجرای برنامه (main thread) اجرا میشن. این عملیاتها به گونهای طراحی شدن که بدون تداخل در پاسخدهی برنامه به کاربرا، وظایف خاصی…
برای مثال، فایل/ماژول تنظیمات پروژه جنگویی ممکنه شامل این موارد باشه:
فایل settings.py:
در عوض میتونید آبجکت تنظیمات رو مستقیماً ارسال کنید، اما استفاده از یک رشته بهتره چون ورکر (Worker) مجبور نیست آبجکت رو سریالایز کنه. نیم اسپیس CELERY_ هم اختیاریه، اما توصیه می شه (برای جلوگیری از overlap با تنظیمات دیگه جنگو).
در مرحله بعدی، یک روش معمول برای برنامه های قابل استفاده مجدد (Reusable) این هست که همه وظایف رو در یک ماژول tasks.py جداگونه تعریف کنن و Celery راهی برای کشف خودکار این ماژول ها داره:
با خط بالا، Celery بهطور خودکار وظایف/تسک های همه برنامههای نصبشده شما رو با پیروی از قرارداد tasks.py کشف میکنه:
- app1/
- tasks.py
- models.py
- app2/
- tasks.py
- models.py
به این ترتیب شما مجبور نیستید به صورت دستی ماژول های جداگونه رو به تنظیمات CELERY_IMPORTS اضافه کنید.
در نهایت، مثال debug_task تسکی هست که از گزینه bind=True task جدید معرفی شده در Celery 3.1 استفاده می کنه تا به راحتی به نمونه (Instance) جاب (Job) فعلی مراجعه کنه.
3️⃣ استفاده از دکوریتور shared_task decorator@:
تسک هایی که می نویسین احتمالاً در برنامه های قابل استفاده مجدد (reusable apps) زندگی می کنن و برنامه های قابل استفاده مجدد نمی تونن به خود پروژه وابسته باشند، بنابراین شما همچنین نمی تونید نمونه (instance) برنامه خودتون را مستقیماً ایمپورت کنید.
دکوریتور @shared_task به شما این امکان میده که بدون داشتن نمونه برنامه مشخص، Job ها رو ایجاد کنید:
فایل demoapp/tasks.py:
⭕️ به جای demoapp اسم app خودتون رو بنویسید ⭕️
4️⃣ صدا زدن تسک ها:
در نهایت با متد delay میتونید تسک خودتون رو اجرا کنید:
⭕️ توی این مثال اسم تابعی که تسک ما رو اجرا میکنه add هست ⭕️
5️⃣ اجرای سلری برای هندل کردن تسکا:
❗️برای اجرای سلری پیشنهاد میکنم پروژتون رو داکرایز کنید و از داکر استفاده کنید چرا که امکان اجرای سلری مستقیما روی سیستم عامل ویندوز وجود نداره (فقط کافیه یه سرویس به اسم celery داخل فایل compose ایجاد کنید و CMD اون سرویس رو به دستوری که در ادامه نوشته شده تغییر بدید)❗️
در نهایت با این دستور میتونید سلری رو اجرا کنید تا تسک ها رو هندل کنه:
⭕️ به جای proj اسم پروژه خودتون رو بنویسید ⭕️
🌹 امیدوارم خوشتون اومده باشه 🌹
🎁 به زودی یه ویدیو آموزشی جامع برای کار با سلری ضبط میکنیم 🎁
#جنگو #سلری #celery
@ninja_learn_ir
فایل settings.py:
CELERY_TIMEZONE = "Asia/tehran"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
در عوض میتونید آبجکت تنظیمات رو مستقیماً ارسال کنید، اما استفاده از یک رشته بهتره چون ورکر (Worker) مجبور نیست آبجکت رو سریالایز کنه. نیم اسپیس CELERY_ هم اختیاریه، اما توصیه می شه (برای جلوگیری از overlap با تنظیمات دیگه جنگو).
در مرحله بعدی، یک روش معمول برای برنامه های قابل استفاده مجدد (Reusable) این هست که همه وظایف رو در یک ماژول tasks.py جداگونه تعریف کنن و Celery راهی برای کشف خودکار این ماژول ها داره:
app.autodiscover_tasks()
با خط بالا، Celery بهطور خودکار وظایف/تسک های همه برنامههای نصبشده شما رو با پیروی از قرارداد tasks.py کشف میکنه:
- app1/
- tasks.py
- models.py
- app2/
- tasks.py
- models.py
به این ترتیب شما مجبور نیستید به صورت دستی ماژول های جداگونه رو به تنظیمات CELERY_IMPORTS اضافه کنید.
در نهایت، مثال debug_task تسکی هست که از گزینه bind=True task جدید معرفی شده در Celery 3.1 استفاده می کنه تا به راحتی به نمونه (Instance) جاب (Job) فعلی مراجعه کنه.
3️⃣ استفاده از دکوریتور shared_task decorator@:
تسک هایی که می نویسین احتمالاً در برنامه های قابل استفاده مجدد (reusable apps) زندگی می کنن و برنامه های قابل استفاده مجدد نمی تونن به خود پروژه وابسته باشند، بنابراین شما همچنین نمی تونید نمونه (instance) برنامه خودتون را مستقیماً ایمپورت کنید.
دکوریتور @shared_task به شما این امکان میده که بدون داشتن نمونه برنامه مشخص، Job ها رو ایجاد کنید:
فایل demoapp/tasks.py:
from demoapp.models import Widget
from celery import shared_task
@shared_task
def add(x, y):
return x + y
@shared_task
def mul(x, y):
return x * y
@shared_task
def xsum(numbers):
return sum(numbers)
@shared_task
def count_widgets():
return Widget.objects.count()
@shared_task
def rename_widget(widget_id, name):
w = Widget.objects.get(id=widget_id)
w.name = name
w.save()
⭕️ به جای demoapp اسم app خودتون رو بنویسید ⭕️
4️⃣ صدا زدن تسک ها:
در نهایت با متد delay میتونید تسک خودتون رو اجرا کنید:
add.delay(2, 4)
⭕️ توی این مثال اسم تابعی که تسک ما رو اجرا میکنه add هست ⭕️
5️⃣ اجرای سلری برای هندل کردن تسکا:
❗️برای اجرای سلری پیشنهاد میکنم پروژتون رو داکرایز کنید و از داکر استفاده کنید چرا که امکان اجرای سلری مستقیما روی سیستم عامل ویندوز وجود نداره (فقط کافیه یه سرویس به اسم celery داخل فایل compose ایجاد کنید و CMD اون سرویس رو به دستوری که در ادامه نوشته شده تغییر بدید)❗️
در نهایت با این دستور میتونید سلری رو اجرا کنید تا تسک ها رو هندل کنه:
celery -A proj worker -l INFO
⭕️ به جای proj اسم پروژه خودتون رو بنویسید ⭕️
🌹 امیدوارم خوشتون اومده باشه 🌹
🎁 به زودی یه ویدیو آموزشی جامع برای کار با سلری ضبط میکنیم 🎁
#جنگو #سلری #celery
@ninja_learn_ir
Docker
Docker: Accelerated Container Application Development
Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.
👍13
سلام به همگی 👋
خیلی خوش اومدید 🌹
🎥 کانال آپاراتمون رو داشته باشید 🎥
قراره کلی دوره رایگان و پیشرفته توی آپارات منتشر کنیم 💣🧨
https://aparat.com/ninjalearn
خیلی خوش اومدید 🌹
🎥 کانال آپاراتمون رو داشته باشید 🎥
قراره کلی دوره رایگان و پیشرفته توی آپارات منتشر کنیم 💣🧨
https://aparat.com/ninjalearn
آپارات - سرویس اشتراک ویدیو
آپارات | نینجالرن
دورههای جامع و عملی برنامهنویسی وب برای تمامی سطوح – از مبتدی تا پیشرفته. به جمع نینجاهای برنامهن
👍8🔥2
Ninja Learn | نینجا لرن pinned «سلام به همگی 👋 خیلی خوش اومدید 🌹 🎥 کانال آپاراتمون رو داشته باشید 🎥 قراره کلی دوره رایگان و پیشرفته توی آپارات منتشر کنیم 💣🧨 https://aparat.com/ninjalearn»
رفقا پیج اینستاگراممون رو هم فالو کنید 🫶
قراره کلی پست آموزشی و پرسش و پاسخ بذاریم با question box و هر سوالی داشته باشید جواب میدیم
مهم نیست ابتدای راه باشید و تازه شروع کرده باشید یا حرفه ای تر باشید و سوالای advanced و پیشرفته بپرسید
همرو جواب میدیم
باتشکر 🌹
https://www.instagram.com/ninjalearn.ir/
قراره کلی پست آموزشی و پرسش و پاسخ بذاریم با question box و هر سوالی داشته باشید جواب میدیم
مهم نیست ابتدای راه باشید و تازه شروع کرده باشید یا حرفه ای تر باشید و سوالای advanced و پیشرفته بپرسید
همرو جواب میدیم
باتشکر 🌹
https://www.instagram.com/ninjalearn.ir/
👍5
#پست_جدید
حتما شنیدید که کوری ست ها در جنگو تنبل/lazy هستند 🤔
⭕تواین پست میخوایم درموردش صحبت کنیم⭕
منظور ازاینکه کوری ها تنبل هستند دقیقا چیه؟ ❓
منظور از این حرف اینه که تا وقتی که واقعا به داده ها نیاز پیدا نشه ارزیابی نمیشن (کوری ست evaluate نمیشن)
و این ویژگی به پرفورمنس خیلی کمک میکنه
به مثال زیر توجه کنید👇
خب همینجور که میبینید ما کوری رو نوشتیم ولی اگه ریکوست های سرور رو چک کنیم میبینم هیچ ریکوستی به دیتابیس نمیخوره
ولی دراین مثال👇
در اینجا چون ما از شرط (if) استفاده کردیم کوری ست evaluate میشه و میاد بررسی میکنه ایا کاربری وجود داره یانه و پس از اون میاد نام همه کاربرارو بر میگردونه
❓شاید براتون سوال شده باشه evaluate یعنی چی؟ ❓
یعنی کوری ست ها درجنگو وقتی اجرا میشن همینجوری به دیتابیس فرستاده نمیشن اول تبدیل به کد sql میشن و اون کد sql ایجاد شده به دیتابیس فرستاده میشه
درپست های اینده بیشتر درموردش توضیح میدم
#جنگو #کوری_ست #lazy_querysets
@ninja_learn_ir
حتما شنیدید که کوری ست ها در جنگو تنبل/lazy هستند 🤔
⭕تواین پست میخوایم درموردش صحبت کنیم⭕
منظور ازاینکه کوری ها تنبل هستند دقیقا چیه؟ ❓
منظور از این حرف اینه که تا وقتی که واقعا به داده ها نیاز پیدا نشه ارزیابی نمیشن (کوری ست evaluate نمیشن)
و این ویژگی به پرفورمنس خیلی کمک میکنه
به مثال زیر توجه کنید👇
users = User.objects.all()
خب همینجور که میبینید ما کوری رو نوشتیم ولی اگه ریکوست های سرور رو چک کنیم میبینم هیچ ریکوستی به دیتابیس نمیخوره
ولی دراین مثال👇
users = User.objects.all()
if users:
for user in users:
print(user.name)
در اینجا چون ما از شرط (if) استفاده کردیم کوری ست evaluate میشه و میاد بررسی میکنه ایا کاربری وجود داره یانه و پس از اون میاد نام همه کاربرارو بر میگردونه
❓شاید براتون سوال شده باشه evaluate یعنی چی؟ ❓
یعنی کوری ست ها درجنگو وقتی اجرا میشن همینجوری به دیتابیس فرستاده نمیشن اول تبدیل به کد sql میشن و اون کد sql ایجاد شده به دیتابیس فرستاده میشه
درپست های اینده بیشتر درموردش توضیح میدم
#جنگو #کوری_ست #lazy_querysets
@ninja_learn_ir
❤7👍3🔥1
سلام دوستان 👋 از کدوم گزینه بیشتر پست بذاریم واستون؟
Final Results
76%
Django
12%
Python
7%
JavaScript
2%
Node.js
0%
Express.js
0%
Next.js
2%
همه گزینه ها🫡
❤1
#پست_جدید
توی پست قبلی درمورد lazy بودن کوری ست ها صحبت کردیم
⭕ توی این پست میخوایم درموردش عمیق تر بشیم
توجه❗️
تمام مثال های این پست با توجه به معماری MVT در نظر گرفته شده است.
به مثال زیر توجه کنید 👇
خب بنظرتون توی این مرحله کوری ست evaluate میشه؟ ❓
خیر هیچوقت در این مرحله evaluate نمیشه و توی تمپلیت وقتی که داریم روش یه عملیتای انجام میدیم evaluate میشه ( جلوتر توضیح میدم)
به این مثال توجه کنید 👇
همونطور که میبینید دراین کد ما اومدیم درون تمپلیت روی users حلقه for زدیم و اسامی کاربران رو گرفتیم
با توجه به lazy بودن کوری ست ها که در پست قبل توضیح دادم در مرحله حلقه زدن عملیات evaluation صورت میگیره و کوری ست تبدیل به کد sql میشه و به دیتا بیس فرستاده میشه و ریزالت رو برمیگردونه
پس بازم اینجا اثبات شد فقط وقتی کوری ست اجرا میشه که بهش نیاز پیدا کنیم
#جنگو #کوری_ست #lazy_querysets
@ninja_learn_ir
توی پست قبلی درمورد lazy بودن کوری ست ها صحبت کردیم
⭕ توی این پست میخوایم درموردش عمیق تر بشیم
توجه❗️
تمام مثال های این پست با توجه به معماری MVT در نظر گرفته شده است.
به مثال زیر توجه کنید 👇
def get_users_list(request):
users = User.objects.all()
return render(request, "panel/ users.html", {"users": users})
خب بنظرتون توی این مرحله کوری ست evaluate میشه؟ ❓
خیر هیچوقت در این مرحله evaluate نمیشه و توی تمپلیت وقتی که داریم روش یه عملیتای انجام میدیم evaluate میشه ( جلوتر توضیح میدم)
به این مثال توجه کنید 👇
{% for user in users %}
<h1> {{user.name}} </h1>
{% endfor %}
همونطور که میبینید دراین کد ما اومدیم درون تمپلیت روی users حلقه for زدیم و اسامی کاربران رو گرفتیم
با توجه به lazy بودن کوری ست ها که در پست قبل توضیح دادم در مرحله حلقه زدن عملیات evaluation صورت میگیره و کوری ست تبدیل به کد sql میشه و به دیتا بیس فرستاده میشه و ریزالت رو برمیگردونه
پس بازم اینجا اثبات شد فقط وقتی کوری ست اجرا میشه که بهش نیاز پیدا کنیم
#جنگو #کوری_ست #lazy_querysets
@ninja_learn_ir
Telegram
Ninja Learn | نینجا لرن 🥷
#پست_جدید
حتما شنیدید که کوری ست ها در جنگو تنبل/lazy هستند 🤔
⭕تواین پست میخوایم درموردش صحبت کنیم⭕
منظور ازاینکه کوری ها تنبل هستند دقیقا چیه؟ ❓
منظور از این حرف اینه که تا وقتی که واقعا به داده ها نیاز پیدا نشه ارزیابی نمیشن (کوری ست evaluate…
حتما شنیدید که کوری ست ها در جنگو تنبل/lazy هستند 🤔
⭕تواین پست میخوایم درموردش صحبت کنیم⭕
منظور ازاینکه کوری ها تنبل هستند دقیقا چیه؟ ❓
منظور از این حرف اینه که تا وقتی که واقعا به داده ها نیاز پیدا نشه ارزیابی نمیشن (کوری ست evaluate…
👍18
بچه ها پست جدید تو اینستا منتشر شد 😁
خیلی ممنون میشم با حمایتاتون به ما انرژی بدید❤️
لینک پست 👇
https://www.instagram.com/p/C9uwDy7owe6/?igsh=YjM2MHltYzRvaWoz
@ninja_learn_ir
خیلی ممنون میشم با حمایتاتون به ما انرژی بدید❤️
لینک پست 👇
https://www.instagram.com/p/C9uwDy7owe6/?igsh=YjM2MHltYzRvaWoz
@ninja_learn_ir
👍4🔥1
سلام رفقا 👋
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
Final Results
7%
مینی دوره جنگو
22%
امنیت در برنامه نویسی وب
17%
مقدمه ای بر SQL و دیتابیس
2%
مینی دوره پایتون
7%
مینی دوره جاوااسکریپت
12%
مینی دوره آموزش ORM جنگو
32%
مینی دوره آموزش DRF
👍6
#پست_جدید
🔒 تراکنش (transaction) در فریمورک جنگو 🔒
دراین پست میخوام درمورد یک بحث جالب که اکثرا نمیدونند و یا در اون مشکل دارند صحبت کنم
حالا اون چیه؟ 🤔
❗ عملیات
بریم درموردش داخل جنگو توضیح بدیم
درجنگو قابلیت transaction برای مدیریت تراکنش ها در پایگاه داده استفاده میشه.
این قابلیت به شما اجازه میده تا یک گروه از عملیات رو بصورت atomic انجام بدید.
منظور از atomic یعنی همه عملیاتی که ما میخوایم روی دیتابیس انجام بدیم باید با موفقیت انجام بشن و حتی اگه یکیشون موفقیت آمیز نباشه بقیشونم به حالت قبلی برمیگردن یا به عبارتی rollback میشن
✅ حالا بیاید با یک مثال بهتر درکش کنیم ✅
فرض کنید یک سایت وبلاگ مثل ویرگول دارید که موجودیت های (Entities) Blog و BlogStatus داره. میدونیم که
روال کار اینجوریه وقتی که یه Blog درست میشه همزمان با اون یک
اگه در این مراحل خطایی رخ بده (مثلا قبل از ایجاد BlogStatus رکورد Blog در دیتابیس ذخیره نشده باشه) میخوایم تراکنش را بصورت اتمیک لغو کنیم.
در اینجا transaction.atomic به کمکمون میاد. با استفاده از این دکوریتور، اگه هر یک از مراحل ایجاد Blogو BlogStatus با مشکل مواجه بشه، تراکنش به صورت اتمیک لغو میشه و تغییرات در دیتابیس انجام نمیشه.
به مثال زیر توجه کنید 👇
در این مثال، اگر هر کدوم از دستورات create با مشکل مواجه بشه، تراکنش به صورت اتمیک لغو میشه و هیچ تغییری در دیتابیس صورت نمیگیره. این به ما کمک میکنه تا دادههای ناقص در دیتابیس ذخیره نشند.
برای استفاده از transaction.atomic کافیه که این دکوریتور رو بالای تابعهایی که تراکنشها را انجام میدند، قرار بدیم. این دکوریتور به طور خودکار تراکنش
ها را مدیریت میکنه و در صورت بروز خطا
امید وارم مفید بوده باشه :)
#django #جنگو #transactions
@ninja_learn_ir
🔒 تراکنش (transaction) در فریمورک جنگو 🔒
دراین پست میخوام درمورد یک بحث جالب که اکثرا نمیدونند و یا در اون مشکل دارند صحبت کنم
حالا اون چیه؟ 🤔
❗ عملیات
transaction
❗ بریم درموردش داخل جنگو توضیح بدیم
درجنگو قابلیت transaction برای مدیریت تراکنش ها در پایگاه داده استفاده میشه.
این قابلیت به شما اجازه میده تا یک گروه از عملیات رو بصورت atomic انجام بدید.
منظور از atomic یعنی همه عملیاتی که ما میخوایم روی دیتابیس انجام بدیم باید با موفقیت انجام بشن و حتی اگه یکیشون موفقیت آمیز نباشه بقیشونم به حالت قبلی برمیگردن یا به عبارتی rollback میشن
✅ حالا بیاید با یک مثال بهتر درکش کنیم ✅
فرض کنید یک سایت وبلاگ مثل ویرگول دارید که موجودیت های (Entities) Blog و BlogStatus داره. میدونیم که
BlogStatus
وضعیت انتشار Blogهستش. روال کار اینجوریه وقتی که یه Blog درست میشه همزمان با اون یک
BlogStatus
هم درست میشه تا ادمین بیاد با استفاده از BlogStatusاون بلاگ رو تایید کنه یا تایید نکنهاگه در این مراحل خطایی رخ بده (مثلا قبل از ایجاد BlogStatus رکورد Blog در دیتابیس ذخیره نشده باشه) میخوایم تراکنش را بصورت اتمیک لغو کنیم.
در اینجا transaction.atomic به کمکمون میاد. با استفاده از این دکوریتور، اگه هر یک از مراحل ایجاد Blogو BlogStatus با مشکل مواجه بشه، تراکنش به صورت اتمیک لغو میشه و تغییرات در دیتابیس انجام نمیشه.
به مثال زیر توجه کنید 👇
from django.db import transaction
from .models import Blog, BlogStatus
@transaction.atomic
def create_blog_status(title, description, blog_status_data):
blog = Blog.objects.create(title=title, description=description, ... )
blog_status= BlogStatus.objects.create(blog=blog, status=PENDING)
# Other operations related to blog status creation
در این مثال، اگر هر کدوم از دستورات create با مشکل مواجه بشه، تراکنش به صورت اتمیک لغو میشه و هیچ تغییری در دیتابیس صورت نمیگیره. این به ما کمک میکنه تا دادههای ناقص در دیتابیس ذخیره نشند.
برای استفاده از transaction.atomic کافیه که این دکوریتور رو بالای تابعهایی که تراکنشها را انجام میدند، قرار بدیم. این دکوریتور به طور خودکار تراکنش
ها را مدیریت میکنه و در صورت بروز خطا
،
تغییرات رو لغو میکنه. امید وارم مفید بوده باشه :)
#django #جنگو #transactions
@ninja_learn_ir
❤12👍4🔥1
سلام رفقا 👋
تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏
کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه
همه رو جواب میدیم ☺️
https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6
تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏
کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه
همه رو جواب میدیم ☺️
https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6
🔥8
#پست_جدید
💎 تایپ هینت (Type Hint) در پایتون 💎
تایپ هینت (Type Hint) یا "نشانهگذاری نوع" در پایتون، روشی برای مشخص کردن نوع دادههایی هست که یه تابع میتونه بپذیره و برگردونه. این قابلیت از نسخه 3.5 به بعد به پایتون اضافه شده و به بهبود خوانایی و فهم کد کمک میکنه.
✅ مثالهای پایهای از Type Hint: ✅
در ادامه به برخی مثالهای ساده و کاربردی اشاره میکنیم:
1️⃣ نشانهگذاری نوع آرگومانها و نوع بازگشتی توابع
در این مثال، تابع
2️⃣ استفاده از انواع داده پیچیدهتر
در اینجا،
3️⃣ استفاده از Optional
گاهی ممکنه یه تابع مقداری را برگردونه یا مقدار
تابع
4️⃣ استفاده از Union
زمانی که یه متغیر یا آرگومان میتونه چندین نوع داده مختلف داشته باشه، از
در اینجا، آرگومان
5️⃣ استفاده از Any
اگر نوع داده مشخص نیست یا میتونه هر نوع دادهای باشه، از
✅ جمعبندی
تایپ هینت ها در پایتون به شما کمک میکنن تا کدهای خواناتری بنویسین و با استفاده از ابزارهای بررسی تایپ خطاهای تایپ رو قبل از اجرای کد پیدا کنید. این قابلیت میتونه به ویژه در پروژههای بزرگ و تیمهای توسعه نرمافزار مفید باشه. با استفاده از type hint ها، میتونید کدهای خودتون رو مستندسازی کنید و اون ها رو قابل فهمتر کنید و آسونتر نگهداری کنید.
#پایتون #python
@ninja_learn_ir
💎 تایپ هینت (Type Hint) در پایتون 💎
تایپ هینت (Type Hint) یا "نشانهگذاری نوع" در پایتون، روشی برای مشخص کردن نوع دادههایی هست که یه تابع میتونه بپذیره و برگردونه. این قابلیت از نسخه 3.5 به بعد به پایتون اضافه شده و به بهبود خوانایی و فهم کد کمک میکنه.
✅ مثالهای پایهای از Type Hint: ✅
در ادامه به برخی مثالهای ساده و کاربردی اشاره میکنیم:
1️⃣ نشانهگذاری نوع آرگومانها و نوع بازگشتی توابع
def greet(name: str) -> str:
return f"Hello, {name}"
def add(a: int, b: int) -> int:
return a + b
در این مثال، تابع
greet
یک آرگومان از نوع str
میگیره و یه str
برمیگردونه. تابع add
دو آرگومان از نوع int
میگیره و یک int
برمیگردونه.2️⃣ استفاده از انواع داده پیچیدهتر
from typing import List, Dict
def get_names() -> List[str]:
return ["Alice", "Bob", "Charlie"]
def get_ages() -> Dict[str, int]:
return {"Alice": 30, "Bob": 25}
در اینجا،
List[str]
نشاندهنده لیستی از رشتهها و Dict[str, int]
نشاندهنده دیکشنریای هست که کلیدهاش رشته و مقادیرش عدد صحیح هستن.3️⃣ استفاده از Optional
گاهی ممکنه یه تابع مقداری را برگردونه یا مقدار
None
برگردونه. در این مواقع از Optional
استفاده میکنیم:from typing import Optional
def find_item(items: List[str], item: str) -> Optional[int]:
try:
return items.index(item)
except ValueError:
return None
تابع
find_item
ممکنه یک عدد صحیح (int
) یا None
برگردونه.4️⃣ استفاده از Union
زمانی که یه متغیر یا آرگومان میتونه چندین نوع داده مختلف داشته باشه، از
Union
استفاده میکنیم:from typing import Union
def get_value(value: Union[int, str]) -> str:
if isinstance(value, int):
return f"The number is {value}"
else:
return f"The string is {value}"
در اینجا، آرگومان
value
میتونه از نوع int
یا str
باشه.5️⃣ استفاده از Any
اگر نوع داده مشخص نیست یا میتونه هر نوع دادهای باشه، از
Any
استفاده میکنیم:from typing import Any
def print_value(value: Any) -> None:
print(f"The value is {value}")
✅ جمعبندی
تایپ هینت ها در پایتون به شما کمک میکنن تا کدهای خواناتری بنویسین و با استفاده از ابزارهای بررسی تایپ خطاهای تایپ رو قبل از اجرای کد پیدا کنید. این قابلیت میتونه به ویژه در پروژههای بزرگ و تیمهای توسعه نرمافزار مفید باشه. با استفاده از type hint ها، میتونید کدهای خودتون رو مستندسازی کنید و اون ها رو قابل فهمتر کنید و آسونتر نگهداری کنید.
#پایتون #python
@ninja_learn_ir
🔥13
Ninja Learn | نینجا لرن pinned «سلام رفقا 👋 تو اینستا پست جدید گذاشتیم بیاید حمایت کنید لطفا 🙏 کوئسشن باکس هم گذاشتیم هر کی هر سوالی داره بیاد بپرسه همه رو جواب میدیم ☺️ https://www.instagram.com/ninjalearn.ir?igsh=ZDk5bDBmNXBudnl6»
Ninja Learn | نینجا لرن
سلام رفقا 👋
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
صبح تون بخیر
کدوم دوره آموزشی رو بیشتر از همه دوست دارید واستون ضبط کنیم؟ 🆓️ دوره به صورت کاملا رایگان تو آپارت منتشر خواهد شد 🆓️
خب رفقا
اکثرتون دوره DRF خواستید
بزودی یه دوره کاربردی و Practical از DRF واستون ضبط میکنیم ✌️
منتظر خبرای خوب باشید 😊
شبتون بخیر 🌹
اکثرتون دوره DRF خواستید
بزودی یه دوره کاربردی و Practical از DRF واستون ضبط میکنیم ✌️
منتظر خبرای خوب باشید 😊
شبتون بخیر 🌹
👍14
دوستان برای دوره drf دوست دارید به عنوان تمرین چه پروژه ای بزنیم؟👀
Final Results
30%
سایت اگهی (مثل دیوار)
7%
وبلاگ
41%
سیستم ازمون انلاین
22%
سوشیال مدیا
🔥7
#پست_جدید
💎 فرق بین let ،const و var در جاوااسکریپت برای تعریف متغیر 💎
تو جاوااسکریپت، سه نوع کلیدواژه (Keyword) برای تعریف متغیرها استفاده میشه: var، let و const.
هر کدوم از این کلیدواژهها رفتار و ویژگیهای خاص خودشون رو دارن که در ادامه به توضیح و مقایسه اون ها با مثالهای مختلف میپردازیم.
1️⃣ کلمه کلیدی var:
کلمه کلیدی var قدیمیترین روش برای تعریف متغیرها در جاوااسکریپته. متغیرهایی که با var تعریف میشن دارای این ویژگی ها هستن:
✅ دامنه (Scope):
کلمه کلیدی var به صورت "function scope" هست، به این معنی که اگه داخل یک تابع تعریف بشه، فقط در داخل همون تابع قابل دسترسیه. خارج از توابع، متغیرهای var در سطح Global تعریف میشن.
در block scope (داخل {})، متغیرهای var به صورت local عمل نمیکنن و همچنان در سطح تابع یا Global تعریف میشن.
✅ Hoisting:
متغیرهای var به بالای محدوده (scope) خودشون هوست میشن، به این معنی که میشه قبل از تعریف اونها ازشون استفاده کرد.
مثال:
2️⃣ کلمه کلیدی let:
کلمه کلیدی let یکی از دو روش جدیدتر (ES6) برای تعریف متغیر هاست. متغیرهایی که با let تعریف میشن دارای این ویژگیها هستن:
✅ دامنه (Scope):
کلمه کلیدی let دارای "block scope" هست، به این معنی که فقط در داخل بلاکی (بین {}) که داخلش تعریف شدن قابل دسترسی هستن.
✅ Hoisting:
متغیرهای let هویست نمیشن و در محدودهی temporal dead zone (TDZ) تا زمانی که تعریف نشدن قابل دسترسی نیستند.
مثال:
3️⃣ کلمه کلیدی const:
کلمه کلیدی const یک روش جدیدتر (ES6) دیگه برای تعریف متغیر هاست. متغیرهایی که با const تعریف میشن دارای این ویژگی ها هستن:
✅ دامنه (Scope):
متغیر های const هم مشابه let دارای "block scope" هستن.
✅ Hoisting:
متغیر های const مشابه let هویست نمیشن و در TDZ تا زمانی که تعریف نشدن قابل دسترسی نیستن.
✅ تغییر مقدار (Reassignment):
متغیرهای const نمیتونن دوباره مقداردهی بشن، به این معنیه که پس از تعریف، نمیشه مقدار جدیدی بهشون داد. این نکته برای آبجکت ها و آرایهها به معنای تغییرناپذیریشون نیست بلکه فقط به معنای تغییرناپذیری رفرنس (Reference) اونهاست.
مثال:
✅ جمعبندی
var:
دارای function scope، متغیرها به بالای scope هویست میشن.
let:
دارای block scope، متغیرها در محدودهی TDZ هستن و هویست نمیشن.
const:
دارای block scope، متغیرها در محدودهی TDZ هستن و هوست نمیشن، قابل تغییر نیستن پس از
تعریف.
⭕️ استفاده از let و const به دلیل رفتارهای مدرنتر و قابل پیشبینیترشون نسبت به var توصیه میشه. ⭕️
#جاوااسکریپت #javascript
@ninja_learn_ir
💎 فرق بین let ،const و var در جاوااسکریپت برای تعریف متغیر 💎
تو جاوااسکریپت، سه نوع کلیدواژه (Keyword) برای تعریف متغیرها استفاده میشه: var، let و const.
هر کدوم از این کلیدواژهها رفتار و ویژگیهای خاص خودشون رو دارن که در ادامه به توضیح و مقایسه اون ها با مثالهای مختلف میپردازیم.
1️⃣ کلمه کلیدی var:
کلمه کلیدی var قدیمیترین روش برای تعریف متغیرها در جاوااسکریپته. متغیرهایی که با var تعریف میشن دارای این ویژگی ها هستن:
✅ دامنه (Scope):
کلمه کلیدی var به صورت "function scope" هست، به این معنی که اگه داخل یک تابع تعریف بشه، فقط در داخل همون تابع قابل دسترسیه. خارج از توابع، متغیرهای var در سطح Global تعریف میشن.
در block scope (داخل {})، متغیرهای var به صورت local عمل نمیکنن و همچنان در سطح تابع یا Global تعریف میشن.
✅ Hoisting:
متغیرهای var به بالای محدوده (scope) خودشون هوست میشن، به این معنی که میشه قبل از تعریف اونها ازشون استفاده کرد.
مثال:
console.log(a); // undefined
var a = 5;
console.log(a); // 5
if (true) {
var b = 10;
}
console.log(b); // 10
2️⃣ کلمه کلیدی let:
کلمه کلیدی let یکی از دو روش جدیدتر (ES6) برای تعریف متغیر هاست. متغیرهایی که با let تعریف میشن دارای این ویژگیها هستن:
✅ دامنه (Scope):
کلمه کلیدی let دارای "block scope" هست، به این معنی که فقط در داخل بلاکی (بین {}) که داخلش تعریف شدن قابل دسترسی هستن.
✅ Hoisting:
متغیرهای let هویست نمیشن و در محدودهی temporal dead zone (TDZ) تا زمانی که تعریف نشدن قابل دسترسی نیستند.
مثال:
if (true) {
let x = 10;
console.log(x); // 10
}
// console.log(x); // ReferenceError: x is not defined
console.log(y); // ReferenceError: y is not defined
let y = 5;
console.log(y); // 5
3️⃣ کلمه کلیدی const:
کلمه کلیدی const یک روش جدیدتر (ES6) دیگه برای تعریف متغیر هاست. متغیرهایی که با const تعریف میشن دارای این ویژگی ها هستن:
✅ دامنه (Scope):
متغیر های const هم مشابه let دارای "block scope" هستن.
✅ Hoisting:
متغیر های const مشابه let هویست نمیشن و در TDZ تا زمانی که تعریف نشدن قابل دسترسی نیستن.
✅ تغییر مقدار (Reassignment):
متغیرهای const نمیتونن دوباره مقداردهی بشن، به این معنیه که پس از تعریف، نمیشه مقدار جدیدی بهشون داد. این نکته برای آبجکت ها و آرایهها به معنای تغییرناپذیریشون نیست بلکه فقط به معنای تغییرناپذیری رفرنس (Reference) اونهاست.
مثال:
const pi = 3.14;
console.log(pi); // 3.14
// pi = 3.15; // TypeError: Assignment to constant variable
if (true) {
const y = 10;
console.log(y); // 10
}
// console.log(y); // ReferenceError: y is not defined
const arr = [1, 2, 3];
arr.push(4); // این مجاز ه چون ما مرجع آرایه رو تغییر نمیدیم بلکه مقدار داخلش رو تغییر میدیم
console.log(arr); // [1, 2, 3, 4]
// arr = [5, 6, 7]; // TypeError: Assignment to constant variable
✅ جمعبندی
var:
دارای function scope، متغیرها به بالای scope هویست میشن.
let:
دارای block scope، متغیرها در محدودهی TDZ هستن و هویست نمیشن.
const:
دارای block scope، متغیرها در محدودهی TDZ هستن و هوست نمیشن، قابل تغییر نیستن پس از
تعریف.
⭕️ استفاده از let و const به دلیل رفتارهای مدرنتر و قابل پیشبینیترشون نسبت به var توصیه میشه. ⭕️
#جاوااسکریپت #javascript
@ninja_learn_ir
❤7
سلام مجدد رفقا 👋
امروزم پست جدید تو اینستا گذاشتیم بیاید حمایت کنید لطفا 🙏
دمتون گرم 🌹
https://www.instagram.com/p/C9zyG7COigf/
امروزم پست جدید تو اینستا گذاشتیم بیاید حمایت کنید لطفا 🙏
دمتون گرم 🌹
https://www.instagram.com/p/C9zyG7COigf/
❤4
Ninja Learn | نینجا لرن pinned «سلام مجدد رفقا 👋 امروزم پست جدید تو اینستا گذاشتیم بیاید حمایت کنید لطفا 🙏 دمتون گرم 🌹 https://www.instagram.com/p/C9zyG7COigf/»
🎥 رفقا دوره DRF ای که خواستید در حال ضبط هست و بزودی منتشر میشه و کلی چیز جدید و پیشرفته قراره بگیرید 👌
دومین دوره ای که بیشترین رای رو آورده دوره امنیت توی برنامه نویسی وبه به نظرتون دوره بعدی دوره امنیت توی برنامه نویسی وب باشه؟ 🤔
دومین دوره ای که بیشترین رای رو آورده دوره امنیت توی برنامه نویسی وبه به نظرتون دوره بعدی دوره امنیت توی برنامه نویسی وب باشه؟ 🤔
Final Results
62%
بله، دوره امنیت باشه
38%
خیر، یه دوره دیگه باشه
👍4
سلام رفقا 👋
صبحتون بخیر
بازم مثل هر روز پست جدید داریم تو اینستا راجب پایتون 🐍
ممنون میشم بیاید حمایت کنید
واقعا بهمون انرژی میده آموزش های بیشتری بذاریم 🌹
https://www.instagram.com/p/C91mSFVuGKv/?igsh=OGJjN3I2dW56bmI1
صبحتون بخیر
بازم مثل هر روز پست جدید داریم تو اینستا راجب پایتون 🐍
ممنون میشم بیاید حمایت کنید
واقعا بهمون انرژی میده آموزش های بیشتری بذاریم 🌹
https://www.instagram.com/p/C91mSFVuGKv/?igsh=OGJjN3I2dW56bmI1
❤5
#پست_جدید
💎 فیکسچر (fixure) در جنگو 💎
❓ فیکسچر چیه؟
فیکسچر یه جور دادهی از پیش تعریف شدهس که قبل از اجرای تستهامون به دیتابیس اضافه میشه. این دادهها میتونن هر چیزی باشن؛ از یه کاربر ساده گرفته تا یه محصول پیچیده توی فروشگاه آنلاینمون.
❓ چرا بهش نیاز داریم؟
1️⃣ تستهای دقیقتر: با داشتن دادههای مشخص، میتونیم تستهای دقیقتری بنویسیم و مطمئن بشیم که همه چیز طبق انتظار کار میکنه.
2️⃣ تستهای سریعتر: به جای اینکه هر بار قبل از اجرای تستها، دادههای مورد نیازمون رو به صورت دستی وارد دیتابیس کنیم، با استفاده از فیکسچر این کار رو یک بار انجام میدیم و در تستهای بعدی از همون دادهها استفاده میکنیم.
3️⃣ تکرارپذیری تستها: با استفاده از فیکسچر، میتونیم مطمئن باشیم که هر بار که تستهامون رو اجرا میکنیم، نتیجه یکسانی خواهیم داشت.
✅ ساختن یه فیکسچر
برای ساختن یه فیکسچر، یه فایل با پسوند json یا yaml ایجاد میکنیم و دادههای مورد نظرمون رو به صورت ساختیافته در اون تعریف میکنیم.
مثال با فرمت JSON:
در این مثال، ما دو رکورد برای مدلهای Product و Category تعریف کردیم.
✅ استفاده از فیکسچر در تستها
در این مثال، ما به کلاس تستمون گفتیم که قبل از اجرای هر تستی، فیکسچر products.json رو لود کنه. بعد، در تست test_product_detail، محصول با id برابر با ۱ رو پیدا میکنیم و مطمئن میشیم که نام محصول درسته.
✅ دستورات لازم و ساخت و لود کردن فیکسچر
1️⃣ ساختن یه فیکسچر با دستور dumpdata
دستور dumpdata بهت اجازه میده که دادههای موجود در دیتابیس رو به صورت یک فایل JSON یا YAML خروجی بگیری. این فایل خروجی رو میتونی به عنوان فیکسچر استفاده کنی.
2️⃣ استفاده از فیکسچر با دستور loaddata
دستور loaddata بهت اجازه میده که دادههای موجود در یک فایل فیکسچر رو به دیتابیس اضافه کنی.
✅ مثال عملی
فرض کن یه وبسایت فروشگاهی داریم و میخوایم یه تست بنویسیم که بررسی کنه آیا محصولی با نام خاص در دیتابیس وجود داره یا نه. اول از همه، با استفاده از دستور dumpdata از مدل Product یه فیکسچر میگیریم:
سپس، در تستمون، این فیکسچر رو لود میکنیم و محصول مورد نظر رو جستجو میکنیم:
⭕️ نکات کلیدی فیکسچر به زبان ساده
ساختار فیکسچر: فیکسچرت باید شبیه به همون چیزی باشه که توی دیتابیس داری. مثلاً اگه یه مدل محصول داری، فیکسچرت هم باید یه محصول رو تعریف کنه.
اسمگذاری فیکسچر: به فیکسچرت یه اسم بامعنا بده تا بفهمی توش چه دادههایی داری. مثلاً products.json یعنی توش اطلاعات محصولها هست.
مدیریت فیکسچر: وقتی تستهای زیادی مینویسی، باید یه جوری فیکسچرهات رو مرتب کنی تا گم نشی. میتونی از فولدرهای مختلف یا ابزارهای مخصوص استفاده کنی.
✅ جمعبندی
فیکسچر یه ابزار خیلی خفنه که بهت کمک میکنه تستهای بهتری بنویسی. با فیکسچر، میتونی دادههای از پیش تعریف شدهای رو به دیتابیس اضافه کنی و تست کنی که همه چیز درست کار میکنه. انگار داری یه محیط آزمایشی برای برنامهت میسازی.
⭕️ توجه: برای اطلاعات بیشتر و مثال های عملی تر، میتونید به مستندات رسمی جنگو مراجعه کنین.
#جنگو #تست #فیکسچر #برنامه_نویسی
💎 فیکسچر (fixure) در جنگو 💎
❓ فیکسچر چیه؟
فیکسچر یه جور دادهی از پیش تعریف شدهس که قبل از اجرای تستهامون به دیتابیس اضافه میشه. این دادهها میتونن هر چیزی باشن؛ از یه کاربر ساده گرفته تا یه محصول پیچیده توی فروشگاه آنلاینمون.
❓ چرا بهش نیاز داریم؟
1️⃣ تستهای دقیقتر: با داشتن دادههای مشخص، میتونیم تستهای دقیقتری بنویسیم و مطمئن بشیم که همه چیز طبق انتظار کار میکنه.
2️⃣ تستهای سریعتر: به جای اینکه هر بار قبل از اجرای تستها، دادههای مورد نیازمون رو به صورت دستی وارد دیتابیس کنیم، با استفاده از فیکسچر این کار رو یک بار انجام میدیم و در تستهای بعدی از همون دادهها استفاده میکنیم.
3️⃣ تکرارپذیری تستها: با استفاده از فیکسچر، میتونیم مطمئن باشیم که هر بار که تستهامون رو اجرا میکنیم، نتیجه یکسانی خواهیم داشت.
✅ ساختن یه فیکسچر
برای ساختن یه فیکسچر، یه فایل با پسوند json یا yaml ایجاد میکنیم و دادههای مورد نظرمون رو به صورت ساختیافته در اون تعریف میکنیم.
مثال با فرمت JSON:
[
{
"model": "myapp.Product",
"pk": 1,
"fields": {
"name": "گوشی موبایل سامسونگ",
"price": 5000000
}
},
{
"model": "myapp.Category",
"pk": 1,
"fields": {
"name": "گوشی موبایل"
}
}
]
در این مثال، ما دو رکورد برای مدلهای Product و Category تعریف کردیم.
✅ استفاده از فیکسچر در تستها
from django.test import TestCase
from .models import Product
class ProductTestCase(TestCase):
fixtures = ['products.json']
def test_product_detail(self):
product = Product.objects.get(pk=1)
self.assertEqual(product.name, 'گوشی موبایل سامسونگ')
در این مثال، ما به کلاس تستمون گفتیم که قبل از اجرای هر تستی، فیکسچر products.json رو لود کنه. بعد، در تست test_product_detail، محصول با id برابر با ۱ رو پیدا میکنیم و مطمئن میشیم که نام محصول درسته.
✅ دستورات لازم و ساخت و لود کردن فیکسچر
1️⃣ ساختن یه فیکسچر با دستور dumpdata
دستور dumpdata بهت اجازه میده که دادههای موجود در دیتابیس رو به صورت یک فایل JSON یا YAML خروجی بگیری. این فایل خروجی رو میتونی به عنوان فیکسچر استفاده کنی.
# برای خروجی گرفتن از همه مدلها به صورت JSON:Bash
python manage.py dumpdata app_name.ModelName --format json --indent 2 --output my_fixture.json
# برای خروجی گرفتن از یک مدل خاص به صورت YAML:
python manage.py dumpdata app_name.ModelName --format yaml--indent 2 --output my_fixture.yaml
2️⃣ استفاده از فیکسچر با دستور loaddata
دستور loaddata بهت اجازه میده که دادههای موجود در یک فایل فیکسچر رو به دیتابیس اضافه کنی.
# برای بارگذاری دادههای یک فایل JSON:
python manage.py loaddata my_fixture.json
# برای بارگذاری دادههای یک فایل YAML:
python manage.py loaddata products.yaml
✅ مثال عملی
فرض کن یه وبسایت فروشگاهی داریم و میخوایم یه تست بنویسیم که بررسی کنه آیا محصولی با نام خاص در دیتابیس وجود داره یا نه. اول از همه، با استفاده از دستور dumpdata از مدل Product یه فیکسچر میگیریم:
python manage.py dumpdata app_name.Product --format json --indent 2 --output product.json
سپس، در تستمون، این فیکسچر رو لود میکنیم و محصول مورد نظر رو جستجو میکنیم:
from django.test import TestCase
from .models import Product
class ProductTestCase(TestCase):
fixtures = ['products.json']
def test_product_exists(self):
product = Product.objects.get(name='گوشی موبایل سامسونگ')
self.assertIsNotNone(product)
⭕️ نکات کلیدی فیکسچر به زبان ساده
ساختار فیکسچر: فیکسچرت باید شبیه به همون چیزی باشه که توی دیتابیس داری. مثلاً اگه یه مدل محصول داری، فیکسچرت هم باید یه محصول رو تعریف کنه.
اسمگذاری فیکسچر: به فیکسچرت یه اسم بامعنا بده تا بفهمی توش چه دادههایی داری. مثلاً products.json یعنی توش اطلاعات محصولها هست.
مدیریت فیکسچر: وقتی تستهای زیادی مینویسی، باید یه جوری فیکسچرهات رو مرتب کنی تا گم نشی. میتونی از فولدرهای مختلف یا ابزارهای مخصوص استفاده کنی.
✅ جمعبندی
فیکسچر یه ابزار خیلی خفنه که بهت کمک میکنه تستهای بهتری بنویسی. با فیکسچر، میتونی دادههای از پیش تعریف شدهای رو به دیتابیس اضافه کنی و تست کنی که همه چیز درست کار میکنه. انگار داری یه محیط آزمایشی برای برنامهت میسازی.
⭕️ توجه: برای اطلاعات بیشتر و مثال های عملی تر، میتونید به مستندات رسمی جنگو مراجعه کنین.
#جنگو #تست #فیکسچر #برنامه_نویسی
Django Project
Fixtures | Django documentation
The web framework for perfectionists with deadlines.
👍4❤2