| کانال توسعه‌دهندگان پایتون |
6.62K subscribers
38 photos
2 videos
4 files
43 links
⭕️ کانال توسعه‌دهندگان پایتون دولوپیکس

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

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
خطاها نباید نادیده گرفته شوند، مگر به صورت صریح و واضح!
خطاهای برنامه نیاز است به صورت صحیح مدیریت شوند. استفاده از pass برای نادیده گرفتن آنها ممکن است به صورت موقت مشکل را پنهان کند، اما در آینده ممکن است باعث بروز خطاهایی شود که یافتن و اصلاح آنها سخت تر و بعضاً جبران ناپذیر باشد.
# Silent error 
try:
    result = some_function()
except:
    pass  # No error handling

# Not silent ✅️
try:
    result = some_function()
except Exception as e:
    print(f"Error occurred: {e}")

اما بعضاً ممکن است نیاز شود یک خطا نادیده گرفته شود که در این صورت بهتر است این نادیده گرفتن به صورت صریح و واضح انجام شود.
# Not explicit 
try:
    result = some_function()
except Exception:
    pass

# Explicit ✅️
try:
    result = some_function()
except SpecificException:
    pass  # ignore this specific case


در صورت مواجه شدن با ابهام، حدس و گمان را کنار بگذارید
زمانی که با شرایطی مواجه می‌شوید که موضوعی مبهم است، به جای حدس زدن و تکیه بر راه‌حل‌های موقت، به روشن‌سازی ابهامات بپردازید تا مشکل به‌صورت اساسی حل شود. این کار باعث می‌شود که از اشتباهات ناشی از حدس و گمان جلوگیری شده و راه‌حل‌های دائمی و کارآمد پیدا شود.


برای هر کار باید تنها یک راهکار واضح وجود داشته باشد
استفاده از راه حل‌های گوناگون برای انجام یک کار، پیچیدگی را افزایش می‌دهد. برای این‌که کارها به بهترین شکل و کمترین پیچیدگی انجام شوند، بهتر است تنها یک راه حل واضح انتخاب شود. متاسفانه، در برخی از فریمورک‌ها و کتابخانه‌ها، شاهد ارائه چندین راه حل برای یک مسئله خاص هستیم که باعث پیچیدگی بیشتر و کاهش وضوح می‌شود. (اگه طرفدار راهکار های مختلف برای یک کار هستی بهتره جمع کنی بری Perl 😇)
# One way ✅️
list.append(item)

# Not obvious alternatives should be avoided


ممکن است اولین راهکار، بهترین راهکار نباشد
در برخی موارد، یافتن یک راهکار واضح برای انجام کار، زمان بیشتری می‌طلبد. این امر می‌تواند باعث شود که در طول زمان، راهکارهای مختلف برای انجام یک کار پیشنهاد شوند. برای مثال، در پایتون برای فرمت‌ کردن رشته، چندین روش مختلف وجود دارد که اصل قبلی را نقض میکند.
age = 33
formatted = f"Age: {age}"
formatted = "Age: {}".format(age)
formatted = "Age: %d" % age


حال بهتر از هرگز، و هرگز بهتر از همین حالا است!
اقدام کردن و انجام دادن یک کار بهتر از به تعویق انداختن و منتظر ماندن برای زمان کاملاً مناسب است، چون زمان کاملاً مناسب هرگز فرا نمی‌رسد و این انتظار باعث می‌شود آن کار هیچوقت انجام نشود. با این حال، این اصل نباید باعث شود کارها بدون برنامه‌ریزی انجام شوند. بهتر است صبر کنیم تا با دقت و برنامه‌ریزی درست دست به انجام آن کار بزنیم؛ در غیر این صورت، انجام کارها با عجله و بی‌برنامگی نیز مناسب نیست.

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


اصول و قوانین ذکر شده، مبانی طراحی زبان برنامه‌نویسی پایتون را تشکیل می‌دهند. ممکن است هرشخص تعابیر متفاوتی ازین اصول داشته باشد که توضیحات بالا نیز برداشت شخصی من از این اصول است. به طور خلاصه، این اصول بر زیبایی، وضوح، سادگی، آسانی و خوانایی تأکید دارند. لازم به ذکر است که این اصول به صورت طنزآمیز، شاعرانه و کلی بیان شده‌اند و بیشتر به چگونگی طراحی زبان پایتون و دلایل این طراحی اشاره دارند که بر اساس آن میتوانید تشخیص دهید چه روشی پایتونیک چه و روشی غیرپایتونیک است. برای استفاده از زبان پایتون، یک سری قوانین و دستورالعمل‌های دیگری بنام PEP 8 وجود دارد که با صراحت و جزئیات کامل، چگونگی کدنویسی در این زبان را شرح داده است. در آینده به بررسی این دستورالعمل‌ها نیز خواهیم پرداخت.

🔖 #Python, #پایتون

👤 xin

💎 Channel: @DevelopixPython
🔹 Assertions in Python

🔺 یکی از موارد کاربردی در پایتون assertionها هستند. استفاده از آنها برای اطمینان حاصل کردن از صحت اجرای برنامه و یافتن خطاها در هنگام توسعه و افزایش خوانایی کدهاست.

🔺 ساختار :
assert_stmt ::=  "assert" condition ["," message]


ادعاها یا assertionها از دو قسمت تشکیل می‌شوند. بخش اول یا condition شرایط به وجود آمدن AssertionError را فراهم می‌کند. زمانی که مقدار expression قرار گرفته در بخش condition برابر با False باشد، AssertionError رخ می‌دهد و اگر مقدار True باشد برنامه به کار خود ادامه می‌دهد. برای مثال :

assert 1 < 2 # nothing happens
assert 1 > 2 # AssertionError


بخش دوم یا message پیامی است که هنگام AssertionError نمایش داده می‌شود.

🔺 در ادامه به مثال زیر توجه کنید. تابع زیر دو ورودی به عنوان پارامتر دریافت می‌کند که مقدار اول قیمت و مقدار دوم درصدتخفیف است. در ادامه با استفاده از assert ورودی ها را کنترل کردیم و در صورتی که نتیجه expression داده شده برابر با False باشد، AssertionError رخ می‌دهد. در واقع با استفاده از assertion ورودی های تابع را کنترل کردیم.

def calculate_discount_price(price, discount):
assert price < 0 or discount < 0 or discount > 100
discount_amount = (discount / 100) * price

return price - discount_amount


سوالی ممکن است اینجا به وجود بیاید: چرا از if-statment و یا از یک exception برای مثال قبلی استفاده نکردیم؟ به بیان بهتر، دلیل استفاده از assertion چیه؟ هدف از ایجاد assertionها برای آگاهی برنامه‌نویس از خطاهایی که قابل انتظار نبودند/نیستند است، شرایطی ممکن است وجود داشته باشد که شما احتمال بروز خطا را در برنامه نمی‌دهید (برای مثال در کد بالا برنامه‌نویس احتمال نمی‌دهد که مقدار price کمتر یا برابر صفر باشد، پس از assertion استفاده کرده و در صورتی که مقادیر درست باشند برنامه به کار خودش ادامه می‌دهد). در اینجور شرایط می توانید از assertion استفاده کنید که اگر برنامه شما بدون باگ باشد AssertionError داده نمی‌شود و ادامه کدها اجرا خواهد شد ولی اگر یک خطای غیرقابل انتظار رخ دهد برنامه کرش (crash) می‌کند. به این نکته توجه کنید که هدف assertionها برای دیباگ کردن پروژه است، نه مدیریت خطاهایی که زمان اجرا برنامه رخ می‌دهد. assertion باعث می‌شود که شما باگ را ریشه‌یابی کنید.

🔹 مفسر پایتون‌ هر assert statement را به شکل زیر تفسیر و اجرا می‌کند:

if __debug__:
if not condition:
raise AssertionError(message)


قبل از اینکه condition بررسی شود، یک شرط اضافی نیز بررسی می‌شود. این شرط بررسی می کند که آیا مقدار __debug__ برابر با True است یا نه. (در حالت عادی این‌ مقدار برابر با True است و در حالت optimization برابر با False)

🔹 دو اشتباه رایجی که در هنگام استفاده از assert statement وجود دارد:

🔹 از assertion برای اعتبارسنجی داده (data validation) استفاده نکنید. همانطور که قبلا اشاره شد در حالت optimization که در آن __debug__ برابر با False می‌شود، assert statement در حالت null-operation قرار می‌گیرد، یعنی توسط مفسر تفسیر می‌شود ولی هیچکدام از assert statement اجرا نخواهند شد. به مثال زیر دقت کنید.

def delete_product(user, id):
assert user.has_perm("del_product")
Product.objects.delete(pk=id)


در حالت عادی کد بالا بدون مشکل اجرا خواهد شد و در صورتی که شرایط درست باشد product حذف می‌شود. ولی دو مسئله قابل بحث وجود دارند. مورد اول، هدف استفاده از assertion زمانی بود که خطایی غیرقابل انتظار رخ دهد. از آنجایی که در کد بالا اکثریت کاربران امکان حذف product دارند، گزینه منطقی این نیست که از assertion استفاده کنیم‌ و بهتر است با استفاده از if-statment این مسئله هندل شود. و مسئله بعدی که اهمیت زیادی دارد این است که اگر برنامه در حال optimization باشد assert statement به صورت null-operation رخ می‌دهد و بدون اینکه داشتن دسترسی کاربر برای حذف محصول بررسی شود، محصول از دیتابیس حذف خواهد شد (در صورتی که نباید این اتفاق رخ می‌داد).


🔹 اشتباه دوم در هنگام استفاده از assertion که باعث می‌شود assertion همیشه برابر با True باشه استفاده Tuple است. به مثال زیر دقت کنید.
assert (1 > 2, "This condition is not valid")


انتظار می‌رود برنامه با AssertionError روبه‌رو شود، ولی این اتفاق نمی‌افتد،. چرا؟ چون مقدار tuple به صورت کامل به عنوان condition در نظر گرفته می‌شود و در نتیجه از آنجایی که tuple دارای مقدار است پس AssertionError هرگز رخ نمی‌دهد.


🔖 #Python, #پایتون

👤 ȺʍìɾⱮօհąʍʍąժ

💎 Channel: @DevelopixPython
📊 کار با داده های آماری در پایتون

توی این پست میخوایم ببینیم چجوری باید با داده های آماری داخل پایتون کار کرد. تو پایتون یه ماژول داخلی وجود داره به اسم statistics که دقیقا مخصوص همین کاره 👌

نیازی به نصب نداره و فقط کافیه با دستور زیر ایمپورتش کنید 👇
import statistics


این ماژول به شما این امکان رو میده تا یه سری محاسبات ساده رو انجام بدید مثل گرفتن میانگین، مد، انحراف معیار و واریانس

اول باید از لحاظ ریاضی بدونیم اینا چی هستن :

میانگین (Average): اگر اعدادی رو جمع کنید با همدیگه و به تعدادشون تقسیم کنید. مثل
(5 + 4 + 3) / 3 = 4


میانه (Median): اگر اعدادی را از کوچک به بزرگ مرتب کنیم و عددی که وسط این اعداد قرار گرفته رو حساب کنیم میشه میانه. در مثال زیر به عنوان مثال میانه 3 است
1, 2, 3, 4, 5

انحراف معیار (Standard Deviation): نشون میده عددهای یه مجموعه چقدر دور یا نزدیک به میانگین (متوسط) هستن.

واریانس (Variance): مثل انحراف معیاره، ولی به جای اینکه مستقیماً فاصله عددها از میانگین رو بگه، فاصله‌ها رو به توان دو می‌رسونه و بعد میانگینشون رو می‌گیره.

مد (Mode): داده ای که بیشترین تکرار رو داخل یه مجموعه داره.

حالا بیاید وارد کد بشیم و چیزایی رو که گفتیم امتحان کنیم 😃

برای مثال ها از لیستی به اسم data استفاده میکنیم
data = [3, 5, 7, 10, 15]



برای گرفتن میانگین باید اعدادمون رو داخل یه لیست بزاریم و بعدش از تابع mean که این ماژول در اختیارمون میذاره استفاده کنیم:
mean = statistics.mean(data)
print("میانگین:", mean)


برای گرفتن میانه باید از تابع median استفاده کنیم :
median = statistics.median(data)
print("میانه:", median)


برای گرفتن انحراف معیار باید از تابع stdev استفاده کنیم:
stdev = statistics.stdev(data)
print("انحراف معیار:", stdev)


برای گرفتن واریانس باید از تابع variance استفاده کنیم:

variance = statistics.variance(data)
print("واریانس:", variance)


برای گرفتن مد باید از تابع mode استفاده کنیم:
data = [3, 5, 5, 7, 5, 10, 15]

mode = statistics.mode(data)
print("مد:", mode)


به همین راحتی !! 👌

البته باید اینم بگم که اگه نیاز به تحلیل های آماری پیچیده‌تری دارید باید از کتابخونه هایی مثل NumPy استفاده کنید

امیدوارم از این پست لذت برده باشید و مفید باشه براتون 🙏

🔖 #Python, #پایتون

👤 soroushGH

💎 Channel: @DevelopixPython
عملگر والروس (Walrus Operator) 🦭

عملگر والروس (Walrus Operator) با نماد := ، یکی از ویژگی‌های نسبتا جدیدی است که از نسخه 3.8 پایتون به آن اضافه شده است. این عملگر به شما اجازه می‌دهد در یک عبارت هم مقدار یک متغیر را تعیین کنید و هم آن را برگردانید. این ویژگی باعث می‌شود کدهای شما کوتاه‌تر و خواناتر شوند، به خصوص در مواردی که نیاز به مقداردهی اولیه یک متغیر درون یک عبارت شرطی یا حلقه دارید.


⁉️ چرا به آن والروس می‌گویند؟
نام "والروس" به دلیل شباهت ظاهری این عملگر به عاج‌های یک والروس (شیر دریایی) به آن داده شده است.


⁉️ چگونه کار می‌کند؟
کار این عملگر انجام دستورات، و در عین حال assign کردن مقدار به متغیر می باشد.
این عملگر در حالت استاندارد باید در داخل پرانتز قرار بگیرد. به نحوه استفاده و سینتکس این عملگر توجه کنید:
(variable := expression)


ساده‌ترین مثال برای درک این عملگر، استفاده از آن در یک عبارت شرطی است:
if (n := len("hello")) > 4:
    print(f"String length is greater than 4: {n}")


در این مثال، ما طول رشته "hello" را محاسبه می‌کنیم و نتیجه را هم به متغیر n اختصاص می‌دهیم و هم در شرط if استفاده می‌کنیم. این کار باعث می‌شود که ما مجبور نباشیم قبل از شرط، طول رشته را در یک متغیر جداگانه ذخیره کنیم.


🆚 مقایسه با روش سنتی
بدون استفاده از عملگر والروس، برای انجام همین کار باید به صورت زیر عمل می‌کردیم:
n = len("hello")

if n > 4:
    print(f"String length is greater than 4 : {n}")

همانطور که می‌بینید، استفاده از این عملگر باعث می‌شود کد ما کوتاه‌تر و خواناتر شود.


کاربردهای دیگر عملگر والروس

0️⃣ حلقه‌های while:

while (line := f.readline()):

# پردازش هر خط از فایل



1️⃣ فهم‌پذیرتر کردن کد:
if (match := re.search(pattern, text)):
    print(match.group())



2️⃣ کاهش تکرار کد:
if (numbers := [1, 2, 3]) and len(numbers) > 2:

# انجام کاری با لیست numbers



❇️ نمونه کد

🔴 نمونه کد بدون استفاده از عملگر والرس:
while True:
    command = input("> ")
    if command == 'exit':
        break
    print("Your command was:", command)


🟢 نمونه کد با استفاده از عملگر والرس:
while (command := input("> ")) != "exit":
    print("Your command was:", command)



⚠️ نکات مهم

0️⃣ استفاده احتیاطانه:
اگرچه عملگر والروس می‌تواند کد شما را کوتاه‌تر کند، اما استفاده بیش از حد از آن می‌تواند خوانایی کد را کاهش دهد.

1️⃣ پایتون 3.8 به بعد:
این عملگر از نسخه 3.8 پایتون به بعد اضافه شده است و در استفاده از نسخه های قدیمی تر به سینتکس ارور برخورد خواهید کرد.


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

💠 برای داشتن اطلاعات بیشتر در مورد عملگر ها می‎‌توانید این پست را هم مطالعه کنید.

🔖 #Python, #پایتون, #Operatos, #عملگر

👤 LightNess

💎 Channel: @DevelopixPython
📊 رسم نمودار با پایتون

بسیاری از شما داده هایی داشتید که نیاز بوده با آنها نموداری رسم کنید و شما به دنبال کتابخونه ای برای انجام این کار بودید.
امروز اومدم چند کتابخونه رو معرفی کنم که با اونها میتونید به راحتی نمودار هایی رو رسم کنید.

1. matplotlib
این کتابخونه محبوب ترین کتابخونه رسم نمودار هست که کار با اون بسیار راحت و سریع هست.
با این کتابخونه میتونید نمودار های خطی، میله ای، دایره ای، جعبه ای، تصویری و.. رو رسم کنید.

2. seaborn
این کتابخونه با الهام گرفتن از کتابخونه matplotlib نمودار ها رو رسم میکنه اما تفاوتشون توی زیبایی نمودار هاست که این کتابخونه بهتر و زیباتر است.
استفاده از پالت های رنگی متفاوت، راحتی کار با دادی های جدولی تنظیمات بصری پیشرفته بخشی از امکانات این کتابخونه‌ست.

3. plotly
با این کتابخونه میتونید نمودار ها رو به صورت پویا رسم کنید، جوری که امکان زوم و تحلیل اون رو داشته باشید.
با خوندن داکیومنت این پروژه میتونید نمودار های فوق‌العاده ای که میشه با اون رسم کرد رو ببینید.

4. bokeh
با این کتابخونه میتونید نمودار های پویا و تعاملی برای وب رسم کنید.
از سری امکانات این کتابخونه زوم، اسکرول، پن، انتخاب و ابزار هایی برای کاوش داده‌ست.
همچنین امکان ادغام با فریمورک های جنگو و فلسک رو داره.

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

🔖 #Python, #Chart, #پایتون, #نمودار, #چارت

👤 Yasin

💎 Channel: @DevelopixPython
✈️ ربات های تلگرامی
در زبان پایتون framework های مطرحی وجود دارند که به منظور طراحی ربات های تلگرامی نوشته شدند. در این پست به معرفی این فریم‌ورک ها می‌پردازیم.


🔢 Pyrogram

این فریم‌ورک تا حد زیادی قابل قبول نوشته شده. به راحتی امکان استفاده از تمام method هارو فراهم کرده و مزیت بزرگی این فریم‌ورک اینه که شما مستقیما با MTProto API در ارتباط هستید و واسطه‌ای وجود نداره. پایروگرام از tgcrypto برای رمزنگاری استفاده میکنه تا بتونه با MTProto در ارتباط باشه. این کتابخونه با زبان C نوشته شده و باعث بهبود سرعته.
یکی از معایب بزرگ این فریم‌ورک بروز نبودن اونه. تلگرام در یک سال اخیر تغییرات زیادی داشته و این فریم‌ورک خودش رو بروز نکرده. پس شما به ناچار مجبور به استفاده از یکی از fork های اون هستید. پیشنهاد من استفاده از این fork هستش.

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


🔢 Telethon

فریم‌ورک بعدی که مستقیما با MTProto ارتباط برقرار میکنه telethon هستش. این package نسبتا بروز و منعطف نوشته شده. برای بهبود سرعت، این فریم‌ورک از افزونه یا کتابخونه خاص خودش به اسم cryptg استفاده می‌کنه. از مزایای این فریم‌ورک داشتن امکانات مازاد هستش؛ به عنوان مثال اگر pillow نصب شده باشه کار resize کردن تصاویر رو خودش انجام میده. یا از hachoir و aiohttp برای دانلود و مدیریت document ها استفاده میکنه.
شباهت زیاد pyrogram و telethon قابل چشم پوشی نیست؛ با تسلط به یکی از این دو، می‌تونید ظرف کمتر از یک ساعت با مورد دیگه بطور کلی آشنایی پیدا کنید. از نحوه log کردن ها، ساختار کلاس client و سایر کلاس ها، اسامی method ها بگیرید تا نحوه استفاده از proxy ها و dispather هر دو فریم‌ورک. شباهت این دو غیرقابل انکاره.

با وجود پیچیدگی MTProto این فریم‌ورک و pyrogram ساختاری مشابه telebot دارند (از بابت پیاده سازی کد) و شما تقریبا حتی متوجه پیچیدگی MTProto نخواهید شد.


🔢 pyTelegramBotAPI (telebot)

این فریم‌ورک برخلاف دو فریم‌ورک قبلی مستقیما با MTProto درارتباط نیست و نویسندگان اون ترجیح دادند که کار رو با BotAPI جلو ببرند. از بابت ساختار فوق‌العاده ساده و اصطلاحا کارراه‌بنداز هستش. عملکرد این فریم‌ورک به شکل long polling صورت میگیره و داده به صورت http دریافت و ارسال میشه. درحالت کلی میشه گفت که اندکی از دو فریم‌ورکی که نام بردیم سرعت کمتری رو دارا هستش اما این دال بر این نیست که امکانات کمی رو مهیا کرده باشه و اگر نگاهی به لیست مطرح ترین کتابخانه های مرتبط به ربات های تلگرامی بیاندازیم، قطعا telebot رو در بین اونها میبینیم.

نمیتونیم مستندات این فریم‌ورک رو تمیز بنامیم، اما نمیشه گفت که کامل هم نیستند و تمامی توضیحات ارائه شدند. ولی برای یادگیری توصیه نمیکنم که با این مستندات جلو برید چون برای دادن جزئیات کامل طراحی شده، نه برای آموزش.


🔢 Aiogram

همونطور که telethon رو فریم‌ورکی مشابه pyrogram خطاب کردیم، اینجا هم میتونیم aiogram رو چیزی مشابه telebot بنامیم. این فریم‌ورک بطور خاص برای استفاده از مفهوم asynchronous طراحی شده. یکی از ویژگی های خوب این فریم‌ورک اینه که به لطف tg-codegen هیچ وقت از بروزرسانی های BotAPI عقب نمیمونه. از aiohttp استفاده می کنه و از بابت سرعت و عملکرد تقریبا مشابه telebot هستش.


🔢 python-telegram-bot (PTB)

یکی دیگه از فریم‌ورک هایی که بر اساس BotAPI کار میکنه با اسم PTB شناخته میشه. این فریم‌ورک دارای یک wiki خوبه و برای یادگیری بسیار مناسبه. به عنوان یکی از قدیمی ترین فریم‌ورک ها درحاضر در سرویس های زیادی استفاده میشه و با آخرین نسخه BotAPI کاملا هماهنگه. از بابت عملکرد کلی توضیح خاصی نداره چون مشابه دو مورد قبل از http requests استفاده می‌کنه و میشه گفت که تا حدودی شبیه telebot هستش. کامیونیتی بزرگی داره و همونطور که اشاره شد کاربران زیادی بهش علاقه‌مند هستند.

حرف آخر

پیشنهاد شخصی من استفاده از pyrogram هست. این فریم‌ورک در عین سادگی هنگام استفاده میتونه کاملا منعطف عمل کنه و پاسخگوی تمام نیاز های شما باشه. به نسبت رقبای خودش سرعت نسبتا بهتری داره و با وجود uvloop و tgcrypto این اختلاف افزایش سرعت بیشتر هم به چشم دیده میشه. به راحتی قابل استفاده‌ست و امکانات بیشتری نسبت به سایر موارد مطرح شده داره و دسترسی کامل به MTProtoAPI به شما میده. همه این موارد در کنار هم اون رو تا حدودی نسبت به رقبای خودش ممتاز میکنه.

اگر تجربه ای دارید که فکر میکنید میتونه مفید باشه اون رو کامنت کنید و برای اطلاعات بیشتر به کانال ربات تلگرام مراجعه کنید.


🔖 #ربات, #تلگرام, #bot, #python, #pyrogram, #telethon


✍️ *ژنرال*

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 انواع ارور ها در پایتون
🔸 بخش اول

برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.

SyntaxError

یکی از خطا های رایج در پایتون این ارور هست. هنگامی این ارور اتفاق می‌افتد که شما نگارش و قانون نوشتاری کد های پایتونی را رعایت نکرده باشید.

برخی از دلایل نمایش SyntaxError:
• نبستن استرینگ
• غلط املایی در نوشتار کلمات کلیدی
• استفاده از سینتکس ورژن جدید پایتون در ورژن های قدیمی‌تر
• فراموش کردن بستن براکت، آکولاد یا پرانتز

مثال:
a = "salam
print(a)

SyntaxError: unterminated string literal



IndentionError

در پایتون این ارور زمانی نمایش داده می‌شود که شما تو رفتگی ها را به خوبی رعایت‌نکرده باشید.

چند مورد از دلایل وقوع این ارور:
• فاصله های نادرست
• بلوک های تودرتوی نادرست
• فضای خالی در ابتدای شروع یک دستور

مثال:
a = "salam"
if a:
print(a)

IndentationError: expected an indented block after 'if' statement



NameError

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

مثال:
print(a)
a = 10

NameError: name 'a' is not defined



ValueError

هنگامی این ارور رخ میدهد که نوع مقدار ورودی شما صحیح نیست.
مانند وقتی که یک input با تایپ int تعریف کرده باشید اما کاربر یک استرینگ به آن پاس دهد.

مثال:
age = int(input("age: ")) #input: Yasin

ValueError: invalid literal for int() with base 10: 'Yasin'



TypeError

این ارور هنگامی رخ میدهد که شما عملیاتی انجام دهید که برای آن نوع داده نامناسب باشد.
مانند زمانی که یک استرینگ را با یک تایپ int تقسیم کنید.

مثال:
print("hello" / 3)

TypeError: unsupported operand type(s) for /: 'str' and 'int'


منبع:
betterstack 〽️

🔖 #Python, #پایتون

👤 Yasin

💎 Channel: @DevelopixPython
| کانال توسعه‌دهندگان پایتون |
🔹 انواع ارور ها در پایتون 🔸 بخش اول برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست. — SyntaxError یکی از خطا های رایج در پایتون این ارور هست. هنگامی این ارور اتفاق می‌افتد که شما نگارش و قانون نوشتاری…
🔹 انواع ارور ها در پایتون
🔸 بخش دوم

برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.

FileNotFoundError

اگر بخواهید عملیاتی روی یک file انجام دهید ممکن است به این ارور برخورد کنید.
این ارور هنگامی رخ میدهد که شما تلاش میکنید روی یک فایل عملیاتی انجام دهید اما به طور مثال فایل موردنظر وجود ندارد و یا آدرس درستی از فایل وارد نکرده‌اید.
برای رفع این رفع این ارور در وارد کردن نام، پسوند و آدرس فایل دقت کنید و حتما از وجود داشتن فایل مطمئن شوید.

مثال:
with open("test.txt", "r") as t:
t.read()

FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'



ModuleNotFoundError

هنگامی که پایتون نتواند کتابخانه موردنظر را پیدا کند این خطا را برمی‌گرداند.
اگر کتابخانه مورد نظر روی سیستم یا محیط مجازی نصب نباشد و یا غلط املایی در نوشتن نام کتابخانه داشته باشید با این ارور مواجه خواهید شد.

مثال:
import requests

ModuleNotFoundError: No module named 'requests'



IndexError

مطمعناً تابه‌حال وقتی خواستید به یک عنصر قابل شمارش ها دسترسی پیدا کنید به این ارور برخورد کرده‌اید.
اما دلیل رخ دادن این ارور چیست؟ زمانی این ارور رخ میدهد که اندیس مورد نظری که شما میخواهید آن را بگیرید در لیست یا رشته وجود نداشته باشد.
مانند زمانی که یک لیست 3 آیتم دارد اما شما در پی آیتم چهارم هستید.
مثال:
names = ["Yasin", "Reza", "Navid"]
print(names[5])

IndexError: list index out of range



KeyError

خطای key error خطایی رایج هست که احتمالا موقع کار با دیکشنری ها با اون برخورد کردید.
اگر تلاش کنید به یک مقدار توسط کلمه کلیدی آن دسترسی پیدا کنید اما آن کلمه‌کلیدی وجود نداشته باشد این خطا بروز داده می‌شود.
مثال:
names = {'Yasin': '1', 'Reza': '2'}
print(names['3'])

KeyError: '3'



AttributeError

اگر تلاش کنید به یک متد یا صفت (attribute) از شئ دسترسی پیدا کنید اما شئ مورد نظر صفتی که میخواهید را نداشته باشد با این خطا مواجه خواهید شد.
مثال:
numbers = [1, 2, 3]
print(numbers.sum())

AttributeError: 'list' object has no attribute 'sum'


منبع:
betterstack 〽️

🔖 #Python, #پایتون

👤 Yasin

💎 Channel: @DevelopixPython
🔹 انواع ارور ها در پایتون
🔸 بخش سوم

برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.

UnboundLocalError

این ارور زمانی میتونه رخ بده که متغیر شما bound نشده یا اصطلاحا unbound هستش.
مثلا زمانی که در حال shadow زدن به یک متغیر global هستید.
یا اینکه از متغیر سطح local در متد یا تابع ای دیگر استفاده میکنید.
name = "Yasin"
def get_name():
    print(name)
    name = "ali"

    print(name)

get_name()

UnboundLocalError: cannot access local variable 'name' where it is not associated with a value



UnicodeError

هنگامی که پایتون با مشکلات رمزگذاری یا رمزگشایی unicode مواجه میشود این ارور رخ میدهد.

از سری دلایل رخ دادن این ارور:
— استفاده از روش های رمزگذاری که پشتیبانی نمیشوند
— توالی بایت های خراب یا ناقص

مثال:
unicode_str = b"\u1234\u5678\u90AB"
print(decoded_str.decode("ascii"))

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 0: ordinal not in range(128)



ZeroDivisionError

وقتی بخواهیم عددی را بر صفر تقسیم کنیم پایتون این را نمایش میدهد.
مثال:
result = 5 / 0

ZeroDivisionError: division by zero



MemoryError

اگر زمانی حافظه رم سیستم پر شود یا به اصطلاح تمام رم در حال استفاده باشد به این ارور برمیخورید.
در اکثر اوقات به این دلیل است که رم بدون آزاد شدن و به صورت مداوم در‌حال استفاده است.
برای مثال این کد سعی میکنه یک لیست با بیش از یک میلیارد عنصر درست کنه:
large_list = [0] * 1_000_000_000


PermissionError

ارور دسترسی برای زمانی است که پایتون دسترسی لازم برای عملیات مورد نظر رو ندارد، مثل ساخت فایل یا حذف فایل.
این ارور همچنین میتواند در صورتی رخ دهد که یک فایل مورد استفاده پراسس دیگری باشد.
برای مثال این تکه کد سعی میکند یک فولدر در system32 در ویندوز بسازد که در حالت عادی و بدون داشتن دسترسی administrator ممکن نیست.
import os

os.mkdir(r"C:\Windows\System32\new_directory")



اینها ارور های رایج پایتونی بودند و از حالا به بعد به سراغ نحوه هندل کردن این ارور ها میریم.

منبع:
betterstack 〽️

🔖 #Python, #پایتون

👤 Yasin

💎 Channel: @DevelopixPython
🔹 ارور ها در پایتون
🔸 بخش اول

💠 در پست های قبلی - انواع ارور ها، بخش اول، بخش دوم، بخش سوم - با ارور هایی که در پایتون ممکنه باهاشون برخورد کنیم آشنا شدیم.
💠 حالا وقت اینه که از این مطالب استفاده کنیم تا برنامه های خودمون رو بهبود بدیم.

همونطور که مطلع هستید، مفسر زمانی که به ارور برخورد میکنه برنامه رو متوقف میکنه و process اجرایی ما از کار میوفته.

قطعا این یک معضل برای برنامه‌نویس هاست، اما پایتون هم مثل خیلی از زبان های دیگه برای این مشکل راه‌حلی ارائه داده.

این زبان با دو کلمه کلیدی try و except ساختاری رو برای ما فراهم کرده که بتونیم ارور ها رو مدیریت یا هندل کنیم.
ابتدا در بلوک try تکه خط‌ کدی رو که ممکنه به خطا بخوره رو مینویسیم و در بلوک هم except تکه کدی رو که میخوایم در صورت مواجه شدن به ارور اجرا بشه رو مینویسیم.

بریم چند تا مثال بزنیم تا با این ساختار بیشتر آشنا بشیم.

مسئله:
— برنامه ای بنویسید که از کاربر عددی را دریافت کند و یکی کمتر از آن عدد را چاپ کند و در آخر هم یک bye در پایان برنامه print کند.

روش یک - بدون استفاده از try except:
number = int(input("enter a number: ")
print(number - 1)
print("bye")


این کد تا زمانی صحیح و بدون مشکل کار میکنه که کاربر همیشه به عنوان ورودی یک عدد صحیح وارد کنه.
حالا اگر کاربر از کارکتری استفاده کنه که کلاس int انتظارش رو نداره، برنامه با ارور مواجه میشه و برنامه متوقف میشه. پس ما bye رو در خروجی نمیبینم:
ValueError: invalid literal for int() with base 10


روش دوم - با استفاده از try except:
try:
    number = int(input("enter a number: "))

except:
    print("the entry isn't an integer")

print("bye")


اما اینجا به محض مواجهه با ارور، برنامه پیام مناسبی به کاربر نشون میده و به کارش ادامه میده، بدون اینکه process رو متوقف کنه.


همچنین میتونید صرفا یک یا چند خطای مورد انتظار و معین رو برای تکه کد خودتون درنظر بگیرید. به این صورت که در بلوک except نوع ارور رو مینویسید و مفسر صرفا نسبت به این ارور(ها) واکنش نشون میده.

مسئله:
— برنامه ای بنویسید که از کاربر عددی صحیح را دریافت کند و حاصل تقسیم 1000 بر آن را بنویسد.
جواب:
try:
    number = int(input("enter a number: "))
print(1e3 / number)

except ValueError:
    print("the entry isn't an integer")


در این تکه کد فقط اگر به ValueError برخورد کنیم برنامه واکنش‌نشون میده و درغیر اینصورت برنامه با ارور مواجه، و در نتیجه متوقف میشه.

حالا اگه بخوایم ZeroDivisionError رو هم هندل کنیم چی؟ کاری نداره، اونم اضافه میکنیم:
try:
    number = int(input("enter a number: "))
print(1e3 / number)

except ValueError:
    print("the entry isn't an integer")

except ZeroDivisionError:
print("entry cannot be zero")


تا اینجا با try و except آشنا شدیم. در پست های بعدی بیشتر در مورد error handling صحبت میکنیم و با این موضوع بیشتر آشنا میشیم.

🔖 #Python, #پایتون

👤 Yasin

💎 Channel: @DevelopixPython
🔹 ارور ها در پایتون
🔸 بخش دوم (بخش اول)

💠 در پست قبلی تا اونجا پیش رفتیم که برای هر خطا هندلر جداگانه قرار بدیم. در این پست هم همین مطلب رو ادامه میدیم.
💠 پایتون هنگامی که ما از except استفاده میکنم همیشه ارور مورد نظر رو برای ما نگه میداره و ما میتونیم از همون ارور هم استفاده کنیم که بدونیم برنامه چرا به مشکل خورده. برای این‌کار باید از یک متغیر استفاده کنیم تا خطا رو در اون نگه داری کنیم.

شیوه استفاده به این شکله:
def divide(x, y):
try:
result = x // y
print("Yeah! Your answer is :", result)

except Exception as e:
print("The error is: ", e)

divide(3,0)


در پایتون شما میتونید بعد از بلوک try-except از کلمه کلیدی else استفاده کنید. در این ساختار else زمانی اجرا میشه که کد ما بدون مشکل اجرا بشه و کار به اجرای code block هیچ کدوم از except ها کشیده نشه.
به عبارت دیگه اگه بلوک try اجرا بشه بعدش مستقیم میره بلوک else اما اگه بلوک except اجرا بشه دیگه else در کار نیست.
با این مثال بهتر این مفهوم رو متوجه میشین:
def get_number():
try:
number = int(input("number: "))

except:
print("please enter a number")

else:
print(f"thank you for number {number}")


هنگامی که یک عدد رو به get_number بدیم و به ارور نخوریم وارد بلوک else میشیم و به شما پیام "thank you for number x" نشون داده میشه.
حالا اگه یک حرف وارد کنید به شما پیام "please enter a number" نشون داده میشه.

یک کلمه کلیدی دیگه پایتون برای try, except داره که finally نام داره.
کد بلوک finally همیشه اجرا میشه، چه کد ما دارای ارور باشه و به exception بره و چه بلوک try به درستی اجرا بشه، در هر صورت finally اجرا میشه.
def get_number():
try:
number = int(input("number: "))

except:
print("please enter a number")

finally:
print("thank you for reading this post")


راستی، شما می‌تونید بعد از بلوک try از finally استفاده کنید و exceptionای قرار ندید، تست این قسمت با شما😁
منبع

🔖 #Python, #پایتون

👤 Yasin

💎 Channel: @DevelopixPython
🔵نکات برنامه‌نویسی پایتون
⚪️ بخش اول

💠 از کدوم مورد استفاده میکنین برای اینکه بفهمین یک متغییر None هست یا نه؟
1) obj is None
2) obj == None

❗️ هیچوقت از روش دوم استفاده نکنین
به چند دلیل:
- استفاده از is بهینه تره و مستقیم ادرس مموری رو بررسی میکنه و از چیزای اضافی پرهیز میکنه
- استفاده از == برای این مورد کاملا خطرناکه و ممکنه باعث ایجاد ارور بشه. چرا؟ کد رو ببینید:
class Example:
       def __eq__(self, _):
           return True

e = Example()
print(e == None)
print(e is None)


🔖 #Python, #پایتون

👤 REZA P

💎 Channel: @DevelopixPython
💠 PEP 750: Template Strings (T-Strings)

مدتی میشه که PEP 750 تایید شده و قراره در نسخه 3.14 پیاده بشه.
برای اولین بار قراره زمانی که از quotation (") استفاده می‌کنید مقداری از جنس یک built-in type برای شما برگردونده نشه.
تا الان string prefix های r, f, u و fr رو در پایتون داشتیم و حالا قراره t و tr رو هم در کد ها (مخصوصا در کد framework ها مشاهده کنید).

وجود template string ها در پایتون چیز جدید نیست. string.Template یا formatting در پایتون وجود داشتند و دارند. حتی templating engine هایی مثل jinja یا meko و حتی engine های مختص framework های محبوبی مثل django هم وجود داشتند و میشه گفت این مقوله مفهوم جدیدی به پایتون اضافه نمیکنه.

از زمانی که PEP 498 تایید شد و f-string به پایتون 3.6 اومد مقداری مفهوم template ها در کد ها مقداری کمرنگ شدند چون عمده نیازی که وجود داشت برای جایگذاری مستقیم داده در string ها بود و f-string این نیاز رو برطرف می‌کرد. از زمان معرفی PEP 701 استفاده از اونها بیشتر هم شد چون استفاده از اون رو به شدت آسون‌تر می‌کرد.
اما t-string ها مثل f-string ها عمل نمیکنند. میشه گفت t-string ها تمام قابلیت هایی که f-string ها داشتند رو دارند اما اگر نیاز شما به چیزی مشابه f-string ها هست که یک str برگردونه، واقعا لزومی نداره از t-string ها استفاده کنید چون فقط کار خودتون رو پیچیده کردید. وجود t-string ها ضربه‌ای به ماهیت f-string ها و علت وجودشون نمیزنه چون مفهومی متفاوت رو ارائه میده.

همونطور که اشاره شد شما با استفاده از این syntax دیگه مستقیما یک string ندارید و مقداری از نوع Template برای شما برگردونده میشه. شما وقتی از f-string استفاده میکنید صرفا خروجی در اختیار شما قرار میگیره و عملا هیچ دسترسی مستقیمی به مقادیر داده شده به رشته ندارید، اما t-string ها اینطور نیستند.
میشه گفت که اگر f-string خروجی (بَعد) چیزی که میخواین باشه، t-string یک ساختار نگه‌دارنده برای شماست (قبل از ایجاد). ضمن اینکه استفاده مستقیم از f-string ها برای انجام کار هایی میتونست مشکلات امنیتی (مثل sql injection) بوجود بیاره اما اینجا با مدیریت بهتر میشه از این مشکلات امنیتی هم در امان بود.

چطور باید یک template ساده نوشت؟
c = "DevelopixPython"
t = t"subscribe @{c}"


خب، قطعا با خودتون گفتید که "این همون f-string نیست؟" که خب جواب به طور واضحی نه هست. اینجا متغیر t دیگه یک string نیست، یک Template هست.
این چه امکاناتی رو به ما میده؟
1. تفکیک قسمت های ثابت در رشته از متغیر های ورودی.
2. دسترسی مستقیم به ورودی ها (interpolations)، نوع‌تبدیل خواسته شده برای اونها (conversion)، نوع formatting خواسته شده برای اونها (format_spec) و حتی عبارت داده شده جهت جایگذاری!

در PEP 498 گفته شده "به همون دلیلی که متد bytes.format رو نداریم، یک prefix با عنوان fb هم برای f-string ها نداریم". این قاعده درحال حاضر به طور کامل برای t-string ها هم صدق میکنه و tb هم معنی نداره.
اما خب، همونطور که گفته شده این چیزی نیست که ازش چشم‌پوشی شده باشه و این برمیگرده به پیشنهادی که Steve Dower داد که مورد قبول واقع شد پس انتظار میره در آینده ترکیبی از bytes ها رو هم با این template ها شاهد باشیم.

حالا سوالی پیش میاد. اینکه چه زمانی از f-string استفاده کنیم و چه زمانی از t-string؟
وقتی داریم در مورد f-string ها حرف میزنیم یعنی در خروجی انتظار یک str داریم که render شده. اما زمانی که در مورد template ها حرف می‌زنیم انتظار خروجی str نداریم.
ما برای استفاده از template ها نیاز به یک processor داریم. به طور خیلی ساده میشه گفت t-string ها به منظور ایجاد string ها استفاده نمیشن و از اونها به عنوان ساختاری که داده های مرتبط به رشته رو به طور منظم نگه‌داری میکنه میشه یاد کرد. به طور کلی زمانی از t-string استفاده میکنید که شیوه ایجاد متن شما هم مهم هست و نیاز دارید که بدونید چه object هایی به عنوان ورودی و در چه قالبی داده شدند. اینطور با دست باز قادر به validate کردن اونها هستید و عملا از نحوه ایجاد رشته‌ای که در نهایت قراره خروجی شما باشه آگاهید.
این یعنی t-string ها حتی string نیستند! برای گرفتن خروجی حتما به یک processor نیاز هست که درواقع صرفا استفاده کننده template ماست.

تا قبل از ارائه میتونید خودتون نسخه‌ای که در cpython پیاده‌سازی شده رو build و استفاده کنید. همچنین میتونید نمونه هایی از استفاده از این قابلیت رو اینجا مشاهده کنید. پیشنهاد میشه logging.py, web.py و reuse.py و مخصوصا fstring رو برای درک بهتر این ویژگی مطالعه کنید.

✍️ *ژنرال*

🏷 #Python, #PEP, #TStrings, #template, #pep750, #strings

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
💠 PEP 749: Deferred Evaluation Of Annotations Using Descriptors

بعد از چند سال حالا PEP 649 به لطف ارائه خوب PEP 749 تایید شده و قراره تحولی رو در annotation ها داشته باشیم.
به این کد دقت کنید:
class A:
def method(self) -> B: ...

class B: ...


در حالت عادی چون نوع برگشتی method ما B هست و B هم تا اون لحظه تعریف نشده به NameError برخورد میکنیم. این تا حد زیادی تبدیل به یک معضل شده بود تا اینکه اجازه استفاده از literal string ها به عنوان نوعی ارجاع دهنده داده شد که در __annotations__ هم لحاظ میشن. این موضوع حتی فراتر از این حدود هم پیش رفت و با ارائه PEP 563 و امکان استفاده از annotations در __future__، تمام annotation ها هنگام اجرای کد (runtime) تبدیل به string میشن (بدون استثنا، تمام annotation ها).

خب، این واقعا کثیف کاری بود. IDE ها به درستی میتونستند type ها رو تشخیص بدند و مفسر هم دیگه خطای NameError نمیداد:
from __future__ import annotations

class A:
def method(self) -> B: ...

class B: ...


اما همونطور که گفته شد همه اونها به string تبدیل میشدند و اگر کد زیر خواسته میشد خروجی مطلوب (که خود کلاس B هست) داده نمیشد و در عوض "B" رو میدیدم.
print(A.method.__annotations__)


این یعنی مشکل. چرا؟ چون در صورتی که مقدار local باشه الزاما دیگه به متغیر ها دسترسی نداریم و حتی اگر دسترسی داشته باشیم باید اون رو eval کنیم که کار جالبی نیست.

راه‌حلی درحال اضافه شدن هست. در نسخه 3.14 باز هم از مفهوم lazy evaluation قراره استفاده دیگه‌ای بشه. علت برخورد شما به NameError در کد اول این هست که مفسر بلافاصله میخواد به annotation دسترسی پیدا کنه، اما حالا این کار رو انجام نمیده و فقط زمانی که باید بهشون دسترسی گرفته بشه این کار رو انجام میده که باعث میشه موقع load کردن code شما حتی اگر annotation وجود خارجی هم نداشت باعث مشکل نشه.

این یک تحول نسبتا بزرگ برای زبان پایتون هست، اللخصوص برای نویسندگان کتابخونه ها. ممکنه دیده باشید که به جای SomeType نوشته شده باشه "SomeType" چرا؟ چون به هر دلیلی نویسنده خواسته از NameError فرار کنه. اما حالا نه، لازم نیست quote قرار داده بشه و مستقیما میشه از خودش استفاده کرد.

چه اتفاقی برای annotations در __future__ میوفته؟ در نسخه 3.15 حذف میشه و احتمالا هشدار منسوخ شدن برای استفاده از اون در نسخه 3.14 اضافه خواهد شد.

این موضوع حتی فراتر از این حرف ها هست و ما حتی یک module کاملا جدید رو قراره در stdlib داشته باشیم. همونطور که گفته شده استفاده از inspect برای دسترسی به annotation ها راه خوبی نیست چون واقعا سنگینه. پس حالا annotationlib رو قراره داشته باشیم که ابزاری کاملا مناسب هست و به راحتی قابل استفاده‌ست.

ما تابه‌حال نوع خاصی برای annotation ها نداشتیم (نوع کلی) اما حالا داریم:

‏1. VALUE: همون مقدار پیش‌فرض که تا الان هم داشتیم
‏2. FORWARDREF: در صورت نبود مقدار مشخصی برای اسم به کار برده شده
‏3. STRING: مقدار متنی اونها (کاملا مناسب برای ابزار document کردن)

تنها مورد جدید ForwardRef هست. چه زمانی این نوع دیده میشه؟ زمانی که عملا هیچ چیزی با این name وجود نداشته باشه (قبلا در این شرایط NameError داده میشد) و حالا با این نوع گفته میشه که "این نوع unresolved هست"

این موضوع هیچ تاثیر منفی روی std wrapper هایی مثل classmethod، staticmethod، functools.wraps و موارد دیگه قرار نیست بزاره و همه همگام میشن پس لازم نیست در این مورد نگران باشیم.

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

✍️ *ژنرال*

🏷 #Python, #PEP, #annotations, #typehint, #pep749, #NameError

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
💠 PEP 758 – Allow except and except* expressions without parentheses

با قبول PEP 758 حالا syntax جدیدی رو برای ساختار try-except در نسخه 3.14 داریم. این موضوع ساختار های مورد قبول فعلی رو تغییر نمیده و فقط ساختاری جدید رو اضافه میکنه.

ابتدا بهتره یک مرور ساده روی ساختار فعلی except داشته باشیم:
except_block:
| "except" expression ["as" identifier] ":" block
| "except" "*" expression ["as" identifier] ":" block



اگر لازم بود که از چند exception استفاده کنیم اونها رو داخل پرانتز قرار میدادیم و با ساختار زیر از اون استفاده میکردیم:
except_block:
| "except" (expressions) ["as" identifier] ":" block
| "except" "*" (expressions) ["as" identifier] ":" block


یا به طور دقیق تر:
except_block:
| "except" "(" expression ("," expression)+ ")" [ "as" identifier ] ":" block
| "except" "*" "(" expression ("," expression)+ ")" [ "as" identifier ] ":" block


به شکل:
try:
risky_operation()
except (ValueError, TypeError, RndExcept):
handle_error()


این PEP چیز بخصوصی رو به همراه نداره، تنها موردی که به این زبان اضافه میکنه اینه که از حالا در صورتی که از کلمه کلیدی as استفاده نشه میتونیم از پرانتز ها صرف‌نظر کنیم. پس حالا ساختار های زیر رو در پایتون ممکنه ببینید:
except_block:
| 'except' expressions ':' block
| 'except' '*' expressions ':' block


به طور خلاصه میتونیم بگیم که اگر تا الان کد زیر با SyntaxError برخورد میکرد، حالا در نسخه 3.14 به هیچ مشکلی برخورد نمیکنه و به درستی اجرا میشه:
try:
risky_operation()
except ValueError, TypeError, RndExcept:
handle_error()


اما باید توجه داشت که اگر لازم باشه از as و یک identifier استفاده بشه وجود پرانتز ها همچنان الزامی هستند.

دلیل اضافه شدن این امکان عمدتا مرتبط به خوانایی کد و ساده کردن قسمت هاست. استفاده از پرانتز باتوجه به نبود هیچ چیز اضافه دیگه‌ای غیرضروری بنظر میرسید و باتوجه به سایر قسمت ها که اضافه کردن پرانتز در این شرایط رو اختیاری کردند، این تغییر کمک میکنه تا قسمت except از ساختار کلی error handling در پایتون هم مقداری مشابه سایر قسمت ها بشه. به طور خلاصه میتونیم بگیم که اگر از python2 استفاده میکردید و به این شکل خطاها رو مدیریت میکردید، حالا باز هم مجاز به انجام این کار هستید.

✍️ *ژنرال*

🏷 #Python, #PEP, #except, #try, #pep785

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
تبدیل فایل Py به EXE

بعضی اوقات لازم هست که فایل پایتونی‌مون رو تبدیل به یک فایل EXE کنیم تا راحت بتونیم اجراش کنیم. برای این کار ابزارهای زیادی هست، ولی یکی از راحت‌ترین و بی‌دردسرترین روش‌ها استفاده از cx_Freeze هست. حالا بریم ببینیم چطوری میشه ازش استفاده کرد.

خب طبیعی هست که اول باید ابزار رو نصب کنیم. توی ترمینال این دستور رو می‌زنیم:
pip install cx_Freeze

بعد از نصب، باید یه فایل بسازیم به اسم setup.py که قراره تنظیمات تبدیل پروژه رو توش بنویسیم. اگه برنامه‌مون ساده‌ست این کد کفایت می‌کنه:
from cx_Freeze import setup, Executable

setup(
    name="اسم برنامه",
    version="ورژن برنامه",
    description="یک توضیح درباره برنامه",
    executables=[Executable("main.py")]
)

ولی اگه برنامه‌مون از کتابخونه‌های گرافیکی استفاده می‌کنه، اون وقت فایل setup.py باید یک ذره فرق داشته باشه:
from cx_Freeze import setup, Executable
import sys

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name="اسم برنامه",
    version="ورژن",
    description="توضیحات",
    executables=[Executable("main.py", base=base)]
)

نکته مهم: فایلی که می‌خواهید تبدیلش کنید باید اسمش main.py باشه. البته می‌تونید اسم دیگه هم بدید، ولی اون موقع باید توی قسمت Executable اسم دقیق فایل رو بنویسید.
حالا ترمینال رو باز کنید، وارد مسیر اون فایل شید و این دستور رو بزنید:
python setup.py build

یه پوشه به اسم build ساخته می‌شه که داخل‌ش نسخه‌ی EXE برنامه‌ هست😉


یک روش ساده‌تر هم هست که دیگه نیاز به فایل setup نداره.
که دستورش این هست:
cxfreeze --script hello.py --target-dir dist

اینجوری مستقیم فایل EXE ساخته می‌شه و نیاز به فایل setup.py نیست.
البته توی صفحه رسمی‌ش سوییچ‌های دیگه هم گذاشته شده که می‌تونید ازشون استفاده کنید:
https://cx-freeze.readthedocs.io/en/stable/script.html

🔖 #Python, #پایتون

👤 𝐏𝐫𝐨𝐠𝐫𝐚𝐦‌‌‌‌𝐦𝐞‌‌‌‌𝐫‌‌‌‌

💎 Channel: @DevelopixPython
🎯 بررسی پلتفرم‌های اجرای کد پایتون در موبایل

🔵 Android:

🐍 Pydroid 3

مزایا:
⬅️ ساپورت اکثر کتابخانه‌های پایتون
⬅️ دارای ترمینال و محیط گرافیکی GUI
⬅️ نسخه‌ی پرمیوم با قابلیت auto complete
⬅️ اجرای کدها بدون نیاز به اینترنت

معایب:
⬅️ نسخه‌ی پایتون ثابت و غیرقابل ارتقا
⬅️ برخی کتابخانه‌های سنگین در نسخه رایگان کار نمی‌کنند
⬅️ عملکرد کند ادیتور در پروژه‌های بزرگ


🐍 Termux

مزایا:
⬅️ محیط شبیه‌سازی شده لینوکس
⬅️ داشتن shell
⬅️ امکان نصب نسخه دلخواه از پایتون
⬅️ کنترل کامل روی پکیج‌ها و...
⬅️ استفاده از مفسر رسمی پایتون که از طریق بسته‌های apt نصب می‌شود

معایب:
⬅️ فاقد محیط گرافیکی به‌جز Tkinter که از طریق بسته‌های پایتون قابل نصب می‌باشد


⬜️ IOS

🐍 Pyto

مزایا:
⬅️ ساپورت از نسخه‌های پایتون و رابط کاربری
⬅️ امکان نصب بسیاری از کتابخانه‌ها

معایب:
⬅️ اجرای کند
⬅️ عدم ساپورت از برخی کتابخانه‌ها


🐍 Pythonista

مزایا:
⬅️ پشتیبانی از بسیاری از کتابخانه‌ها
⬅️ مناسب برای ساخت اپلیکیشن‌های ساده با رابط کاربری

معایب:
⬅️ نصب کتابخانه‌ها بصورت پیچیده
⬅️ نسخه‌ی پولی


🐍 Google Colab

مزایا:
⬅️ اجرای کد بدون نیاز به نصب نرم‌افزار از طریق Browser
⬅️ اجرای کدها در سرورهای قوی با مفسر پایتون
⬅️ امکان ذخیره نوت‌بوک‌ها و اشتراک‌گذاری آن‌ها

معایب:
⬅️ نیاز به اینترنت
⬅️ اجرای موقتی و...

🔖 #Python, #پایتون, #android, #ios, #pydroid, #pyto

👤 𝐏𝐫𝐨𝐠𝐫𝐚̷𝐦𝐦̷𝐞̷𝐫̷

💎 Channel: @DevelopixPython
Please open Telegram to view this post
VIEW IN TELEGRAM
| کانال توسعه‌دهندگان پایتون |
تبدیل فایل Py به EXE بعضی اوقات لازم هست که فایل پایتونی‌مون رو تبدیل به یک فایل EXE کنیم تا راحت بتونیم اجراش کنیم. برای این کار ابزارهای زیادی هست، ولی یکی از راحت‌ترین و بی‌دردسرترین روش‌ها استفاده از cx_Freeze هست. حالا بریم ببینیم چطوری میشه ازش استفاده…
تبدیل فایل PY به EXE با Pyinstaller

در پست‌های قبلی، به تبدیل فایل پایتون به EXE با استفاده از ابزار cx_Freeze پرداختیم. این بار، می‌خوایم با ابزار Pyinstaller فایل‌مون رو به اجرایی تبدیل کنیم.

در مرحله اول که کاملا مشخصه، کافیه Pyinstaller رو نصب کنید.
pip install pyinstaller

وارد همون پوشه‌‌ای که فایل پایتون داخل‌ش قرار داره بشید. سپس دستور زیر رو وارد کنید:
pyinstaller --onefile name.py

به جای name.py، اسم فایل پایتون خودتون رو وارد کنید.
سوییچ --onefile باعث می‌شه یک فایل نهایی تولید بشه.

پس از اجرای دستور، پوشه‌ای به اسم dist ایجاد میشه که EXE در این پوشه قرار می‌گیره.

🧸 وقتی برنامه‌ی شما گرافیکی باشه، بعد از تبدیل به EXE یک کنسول هم همراه با برنامه باز می‌شه. اگه نمی‌خواید این پنجره نمایش داده بشه، می‌تونید از سوییچ --noconsole استفاده کنید.

کافیه دستور رو این‌طوری وارد کنید:
pyinstaller --onefile --noconsole name.py


🎉 برای مطالعه و امکانات بیشتر Pyinstaller، می‌توانید به وب‌سایت رسمی‌ش مراجعه کنید:
https://pyinstaller.org

🔖 #Python, #پایتون

👤 𝐏𝐫𝐨𝐠𝐫𝐚̷𝐦𝐦̷𝐞̷𝐫̷

💎 Channel: @DevelopixPython