🧑‍💻PythonDev🧑‍💻
365 subscribers
86 photos
3 videos
15 files
78 links
Python tips and tricks
The Good, Bad and the Ugly

📚توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

👨‍💻این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی این چند سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)👨‍💻


@Mtio975
Download Telegram
وقتی صحبت از ارسال و دریافت دیتا می‌شود یکی از مواردی از همون ابتدا به ذهن میرسه انتخاب
Serializer
درست هست؛ اگر توسعه دهنده وب باشید قطعا همون اول یاد
JSON
میوفتید (امن و مناسب) اما گزینه‌های دیگری هم هست که توی پروژه‌های مختلف استفاده میشه مثل
YAML
که بیشتر دوستان DevOps کار یا برنامه‌نویس‌های اون سمت باهاش کار می‌کنند؛ و یا مثلا:
Pickle
که توی AI و DataScience خیلی طرفدار داره متاسفانه (استفاده‌اش توی تیم من ممنوع هست)

مشکل اصلی که با YAML, Pickle وجود داره بخصوص Pickle امنیت هست.
بصورت دیفالت YAML, Pickle وقتی باهاش
Serialized Data
رو باز می‌کنید اگر حاوی دستورات سیستمی هم باشه اون‌هارو بصورت کامل اجرا می‌کنه برای همین هست که توی PyYaml وقتی کدی قرار هست برای Production استفاده بشه باید از
yaml.safe_load
استفاده کنید.
اما مشکل اینجاس که safe_load کلاس‌های کاستوم رو نمیشناسه راه حل :
تصویر پیوست شده؛ اگر قرار هست از YAML توی پروژه استفاده کنید حتما از safe_loader استفاده کنید load, full_loader , ... امن نیست و این مورد یک باگ کاملا شناخته شده هست.
GitHub issues
یک نمونه exploit خیلی ساده برای تست؛ سورس کد رو گذاشتم که خودتون اجرا کنید و مطمئن باشید امن هست.

اما بجای ls میشد هرکار دیگری هم کرد یا خوندن passwd می‌شد خیلی کارهای دیگه‌ای کرد.

هیچوقت هیچ فایل Pickle ایی رو از کسی قبول نکنید اگر قبول کردید روی سیستم اجرا نکنید.
این کد که احتمالاً بسیار هم می‌بینید و استفاده می‌کنید
۲ تا باگ داره، که ۱ مورد می‌تونه حتی شمارو توی مصاحبه رد کنه

می‌تونید باگ‌هارو پیدا کنید ؟
🧑‍💻PythonDev🧑‍💻
این کد که احتمالاً بسیار هم می‌بینید و استفاده می‌کنید ۲ تا باگ داره، که ۱ مورد می‌تونه حتی شمارو توی مصاحبه رد کنه می‌تونید باگ‌هارو پیدا کنید ؟
اول راجب خود
repr

بگم
برای دوستان تازه‌کار، در صورتیکه وجود نداشته باشه توی خط 11 و بعد از اجرای کد چیزی که برای شما توی کنسول نمایش داده می‌شه آدرس حافظه اون object هست مثلاً:
<main.Person object at 0x7f894c576650>

که خب اصلا چیز خوبی نیست، به لطف
repr

شما
می‌تونید خروجی بهتری داشته باشید مثلاً توی این تصویر خروجی بصورت زیر هست :

Person(name=Mo Abbasi, age=60)

حالا بریم سراغ باگ‌ها؛ باگ اول که خب ساده‌تر هست  :

نحوه نمایش پارامتر‌های ورودی هست که مشخص نیست از چه تایپی هست و شما نمی‌تونید با کپی کردن خروجی یک object جدید بسازید که خب خود repr رو میبره زیر سوال

Mo Abbasi
استرینگ نیست اینجا.
پس برای رفع این باگ کاری که باید بکنید استفاده از :
!r
هست ینی خط 7 میشه:

return f"Person(name={self.name!r}, age={self.age!r})"

اگر تا به حال اینطوری تعریف نمی‌کردید، تعریف repr شما طبق استاندارد نبوده.
Channel photo updated
بنظرتون باگ این سورس کد کجاست ؟
🧑‍💻PythonDev🧑‍💻
بنظرتون باگ این سورس کد کجاست ؟
این یک باگ کاملا شناخته شده و کاملا تکراری هست؛ ممکنه توی مصاحبه‌های مختلف هم تجربه‌اش کرده باشید یا دیده باشید.
یک نمونه مصاحبه Amazon بوده برای پایتون (طرف از یک زبان برنامه نویسی دیگه اومده بود سمت پایتون و دنبال کار بود)

اول برای دوستان تازه کار:
setitem
وقتی
اجرا میشه که میخواهید یک key - value رو داخل dictionary بریزید
و
getitem
وقتی
اجرا میشه که میخواهید یک مقدار رو از دیکشری بخونید.
البته اینجا نه بخاطر باگی که وجود داره

اگر بخوام خیلی ساده توضیح بدم :
مسئله اصلی اینجاس که نسخه پایتونی که بصورت دیفالت از سایت پایتون دانلود میشه روی C کد زده شده و مواردی مثل str, dict, list از کدهای C برای اجرا استفاده می‌کنند.
به همین دلیل وقتی از dict ارث‌ بری بکنید احترامی برای متدهای builtin قائل نمیشه (چون توی C پیاده سازی شده و کد پایتون شما قابلیت overwrite شدن روی کد C رو نداره) پس درنهایت چیزی رو میگیرید که توی C و برای خود پایتون دیکشنری پیاده سازی شده

راه حل :
توی پایتون ماژولی هست به اسم
collections
کاربردهای بسیاری داره که درآینده ممکنه بررسی کنیم اما چیزی که ما الان نیاز داریم

from collections import UserDict

همیشه یادتون باشه وقتی قراره یک کلاس کاستوم برای نوع داده dict بنویسید؛ حق استفاده از
dict
رو ندارید باید از
UserDict
استفاده کنید.
__mro__
یکی ازون موارد جذاب هست؛ پیاده‌سازی و الگوریتم جالبی هم داره
برای دیباگ هم خیلی خیلی کمک کننده هست (مخصوصا وقتی دیباگر در درسترس نیست) که مخفف :
Method Resolution Order

معمولا توی ۹۰٪ پروژه‌ها نیازی بهش ندارید اما توی مصاحبه‌های فنی ممکن هست بهش برخورد کنید مخصوصا اگر شرکت تولید کننده ابزار برای برنامه‌نویس‌ها هست (مثلا تیم Microsoft Vscode )

همونجوری که توی خروجی یا حتی از اسم متد پیداس اولویت اجرای متد رو بهتون نشون میده؛ و یک اثبات دیگه ازین موضوع هست که همه چیز توی پایتون Object هست.
🧑‍💻PythonDev🧑‍💻
__mro__ یکی ازون موارد جذاب هست؛ پیاده‌سازی و الگوریتم جالبی هم داره برای دیباگ هم خیلی خیلی کمک کننده هست (مخصوصا وقتی دیباگر در درسترس نیست) که مخفف : Method Resolution Order معمولا توی ۹۰٪ پروژه‌ها نیازی بهش ندارید اما توی مصاحبه‌های فنی ممکن هست بهش…
یک نکته که شاید لازم باشه بهش اشاره کنم در این تصویر (مخصوصا برای دوستان تازه‌کار)
استفاده از
...
هست (اصطلاحا بهش Ellipsis گفته میشه توی پایتون اگر خواستید بیشتر بخونید)
یکی از کاربردهاش زمانی هست که ی بخش از کد رو هنوز پیاده سازی نکردید.
توی این کاربرد مثل pass می‌مونه
#موقت

درحال بررسی یک منبع فوق‌العاده هستم.
۳-۴ ساعت طول می‌کشه ولی اگر به همون خوبی باشه که از یکی از کانتریبیوترهای جنگو شنیدم (دارم همین موضوع رو بررسی میکنم؛ چون تازه با این شخص آشنا شدم.)

واقعا نمی‌دونم چرا توی کانال‌های توسعه وب با پایتون این رو پیدا نکردم :/

اگر ندیدید که خب چرا ؟
اگر دیدید و نذاشتید؛ اینارو واسه خودتون نگه میدارید ؟
بذارید خدایی این مباحث رو.

متأسفانه فرصت نکردم تکمیل کنم (چندتا تسک بهم خورد این وسط)
به محض خلوت شدن، ادامه میدم و تکمیل می‌کنم
🧑‍💻PythonDev🧑‍💻
#موقت درحال بررسی یک منبع فوق‌العاده هستم. ۳-۴ ساعت طول می‌کشه ولی اگر به همون خوبی باشه که از یکی از کانتریبیوترهای جنگو شنیدم (دارم همین موضوع رو بررسی میکنم؛ چون تازه با این شخص آشنا شدم.) واقعا نمی‌دونم چرا توی کانال‌های توسعه وب با پایتون این رو پیدا…
این ویدئو در راستای همون صحبتی هست که داشتم :

وب رو فارغ از فریمورک یاد بگیرید

متأسفانه خیلی از بچه‌هایی که با پایتون وب رو یاد گرفتند بخصوص جنگو، اگر فریمورک عوض بشه باید از صفر شروع کنند برای همین جابجایی بین فریمورک‌های مختلف بسیار براشون سخت هست

YouTube Video

توی این ویدئو که از PyCon سال 2017 هست
Jacob Kaplan
از توسعه دهنده‌های اصلی django بهتون وب رو فارغ از فریمورک آموزش میده و شاید مقدماتی رو میگه از اینکه چطور وب فریمورک بعدی رو خودتون بنویسید.

شخصاً با خیلی از مباحث آشنا بودم ولی بازم خیلی چیز جدید داشت برام؛ اگر بخوام بگم چطوری بخونید پیشنهادم این هست :

۱- ویدئو رو ببینید و تمریناتش رو انجام بدید
۲- تمرینات رو برای کار خودتون بسط بدید (برای من RestApi)
۳- تمرینات بالا و منابع معرفی شده رو برای ASGI هم دنبال کنید.
۴- تمرینات رو خودتون انجام بدید، حتی اگر هر تمرین بیش از زمان پیشنهادی توی ویدیو وقت بگیره (اگر با مباحث هیچ آشنایی دقیقی ندارید ممکنه هر تمرین بیش از چندین ساعت وقت بگیره ولی شک نکنید هزاران بار ارزشش رو داره)


بازم میگم؛ برای منی که با تمامی این مباحث آشنایی داشتم نکات ریز و roadmap خوبی بود برای پیشرفت؛ قطعاً برای عزیزانی که تازه آموزش مقدماتی جنگو یا ... رو تموم کردند فوق‌العاده خواهد بود.
و حتماً به کار دوستان سطح بالاتر هم خواهد اومد.
🧑‍💻PythonDev🧑‍💻
این ویدئو در راستای همون صحبتی هست که داشتم : وب رو فارغ از فریمورک یاد بگیرید متأسفانه خیلی از بچه‌هایی که با پایتون وب رو یاد گرفتند بخصوص جنگو، اگر فریمورک عوض بشه باید از صفر شروع کنند برای همین جابجایی بین فریمورک‌های مختلف بسیار براشون سخت هست YouTube…
#موقت

آماری ترکوند این پست :
روی ۴۰۰ تا بازدید
۱۰۰ تا share خورد، که خب دفعه اول بود توی کانال

ولی خدایی نفرستید توی save message که هیچوقت نبینید‌، حتماً برای این یکی وقت بذارید

پ.ن : چیکار کنم، ی بخشی از شغلم، دیتاساینس هست دیگه 🥲