Python Hints
8.61K subscribers
170 photos
11 videos
9 files
141 links
Python tips and tricks
The Good, Bad and the Ugly

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

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

Admin: @Abbasi_ai
Download Telegram
Channel created
من محمد عباسی (@abbasi_ai)

یک توسعه دهنده پایتون هستم با بیش از ۸ سال تجربه کار با پایتون (البته زمانی که دارم این پست رو می‌نویسم و باقی موارد تجربیاتم هم برای این کانال اهمیتی نداره)

سعی می‌کنم نکاتی که فکر می‌کنم مهم هست تغییراتی که توی نسخه‌های اخیر (از پایتون ۳.۴ به بعد وارد شده و اهمیت بالایی داره و ... رو صحبت کنم)

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

ازین به بعد قرار هست اینجا در مورد core python صحبت کنم تا اینطوری بتونم به دوستانم هم کمک کنم و نیازی هم به تکرار‌های مجدد نباشه.

هیچکدوم از موارد رو از خودم نمی‌گم (مگر با #نظر_شخصی علامت گذاری بشه) منابع همه صحبت‌ها داکیومنت‌ اصلی پایتون و کتاب‌های معروف پایتونی هست.

LinkedIn Profile

@pyHints
🔥5113👍9👎41
Python Hints pinned «من محمد عباسی (@abbasi_ai) یک توسعه دهنده پایتون هستم با بیش از ۸ سال تجربه کار با پایتون (البته زمانی که دارم این پست رو می‌نویسم و باقی موارد تجربیاتم هم برای این کانال اهمیتی نداره) سعی می‌کنم نکاتی که فکر می‌کنم مهم هست تغییراتی که توی نسخه‌های اخیر…»
وقتی صحبت از ارسال و دریافت دیتا می‌شود یکی از مواردی از همون ابتدا به ذهن میرسه انتخاب
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

@PyHints
👍25👌54❤‍🔥11👻1
یک نمونه exploit خیلی ساده برای تست؛ سورس کد رو گذاشتم که خودتون اجرا کنید و مطمئن باشید امن هست.

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

هیچوقت هیچ فایل Pickle ایی رو از کسی قبول نکنید اگر قبول کردید روی سیستم اجرا نکنید.

@PyHints
👍35❤‍🔥322👾2👌1
این کد که احتمالاً بسیار هم می‌بینید و استفاده می‌کنید
۲ تا باگ داره، که ۱ مورد می‌تونه حتی شمارو توی مصاحبه رد کنه

می‌تونید باگ‌هارو پیدا کنید ؟

@PyHints
👀206🤔3❤‍🔥2👍211👌1😐1
Python Hints
این کد که احتمالاً بسیار هم می‌بینید و استفاده می‌کنید ۲ تا باگ داره، که ۱ مورد می‌تونه حتی شمارو توی مصاحبه رد کنه می‌تونید باگ‌هارو پیدا کنید ؟ @PyHints
اول راجب خود
__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__ شما طبق استاندارد نبوده.

@PyHints
👍56👌642❤‍🔥1
Python Hints
این کد که احتمالاً بسیار هم می‌بینید و استفاده می‌کنید ۲ تا باگ داره، که ۱ مورد می‌تونه حتی شمارو توی مصاحبه رد کنه می‌تونید باگ‌هارو پیدا کنید ؟ @PyHints
ولی باگ دوم که من حتی توی سورس کد فریمورک‌ها و کتابخانه‌های معروف پایتون هم زیاد دیدم به راحتی میتونه توی مصاحبه‌های اولیه اوضاع رو بر علیه شما بکنه

مشکل باز هم توی این خط هست :

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

اگر دقت کنید اسم کلاس hard code شده ینی اگر بعد از مدتی که پروژه بزرگ شد بجای کلاس Person از مثلا Student استفاده بشه و فراموش کنید که
__repr__
رو تغییر بدید؛ بوقت دیباگ کردن کد باعث سردرگمی بزرگی میشه؛
راه حل :
return f"{type(self).__name__}(name={self.name!r}, age={self.age!r})"
که خب
type(self)
میگه که ی instance از کلاس Person هست و وقتی __name__ رو میگیرم دقیقا اسم کلاس رو برمیگردونه ینی Person هر تغییری هم که روی اسم کلاس اعمال بشه هیچ نیازی به تغییر
__repr__
نیست.

توی تصویر این پست هم می‌تونید ببینید :
https://t.iss.one/pyHints/7


@PyHints
👍76❤‍🔥6👌321👎1🆒1
بنظرتون باگ این سورس کد کجاست ؟

@PyHints
🤔12👍41😱1
Python Hints
بنظرتون باگ این سورس کد کجاست ؟ @PyHints
این یک باگ کاملا شناخته شده و کاملا تکراری هست؛ ممکنه توی مصاحبه‌های مختلف هم تجربه‌اش کرده باشید یا دیده باشید.
یک نمونه مصاحبه Amazon بوده برای پایتون (طرف از یک زبان برنامه نویسی دیگه اومده بود سمت پایتون و دنبال کار بود)

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

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

راه حل :


@PyHints
👍242😱2❤‍🔥111👌1
توی پایتون ماژولی هست به اسم
collections
کاربردهای بسیاری داره که درآینده ممکنه بررسی کنیم اما چیزی که ما الان نیاز داریم

from collections import UserDict

همیشه یادتون باشه وقتی قراره یک کلاس کاستوم برای نوع داده dict بنویسید؛ حق استفاده از
dict
رو ندارید باید از
UserDict
استفاده کنید.

@PyHints
👍3652❤‍🔥2😱2👌1
#جواب_سوالات_پرتکرار

چندتا نکته همین اوایل بگم که بسیار سوال شده :

۱- دوره آموزشی:
شخصاً هیچ دوره آموزشی ندارم، هیچ آموزشگاهی تدریس نمی‌کنم و هدفم از کانال هم پول درآوردن نبوده پس کلاس خصوصی هم ندارم

۲- من هیچ دوره آموزشی رو تأیید نمی‌کنم دوره‌های آنلاین و رایگان بسیار بسیار خوبی وجود داره برای پایتون که همون موارد کفایت می‌کنه (فقط باید یاد بگیرید هر خط کدی که میزنید و می‌خونید دقیقاً چیکار می‌کنه که این یک عادت شخصی هست)

۳- خیلی از دوستان راجب فعال کردن کامنت یا ایجاد گروه گفتند، شخصاً موافقم که وجودش کمک کننده هست ولی همونطور که تو خصوصی‌ها گفتم :

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

۴- راجب درخواست roadmap , ... کانال‌های تخصصی کاری که میخواهید انجام بدید رو بخونید.شخصا فقط و فقط اینجا از Core Python صحبت خواهم کرد.

۵- کانال یوتیوب هم ندارم، با اوضاع اینترنت در ایران خیلی از عزیزان (بخصوص تازه‌کار) متاسفانه دسترسی به اینترنت براشون دشوار هست.
ازین گذشته، علاقه ندارم برای چندتا نکته کوچک (البته مهم) چندین دقیقه وقت بگیرم و حاشیه سلام علیکم برم فعلا :
پیام متنی و عکس داره کارمون رو راه میندازه و چون محدودیت هم داره مجبورم خیلی خلاصه توضیح بدم

۶- برای دوستانی که گفتند دنبال مطالب این چنینی هستند که توی دوره‌های آموزشی پیدا نمی‌شه، اول اینکه هیچوقت توقع نداشته باشید که دوره آموزشی جایگزین کتاب بشه برای شما

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

کتاب‌هایی که هر توسعه دهنده پایتون حتماً حتماً حتماً بعد از دوره مقدماتی و چندماه تمرین باید بخونه (که هزاران بار هم بهش اشاره کردم) :

Fluent Python
Python Concurrency
High Performance Python
Cpython Internals

این موارد حداقل مواردی هست که یک توسعه دهنده برای دنبال کردن مسیر Senior شدن توی پایتون باید بخونه


۷- تبلیغات و ... نداریم و نخواهیم داشت (از حوصله همه خارج هست)

۸- معرفی کانال و ... هم نداریم، مگر اینکه صاحب کانال رو بشناسم و بدونم هدفش درست هست.
یا اینکه خودم چندسالی دنبال کننده کانال و مطالب باشم و مطمئن (همونطوری که تا کتابی رو نخونم معرفی نمی‌کنم)

۹- لطفاً روی پست‌ها
Reaction
داشته باشید که بدونم وضعیت چطور هست (حداقل تا راه‌اندازی گروه یا بخش کامنت)


@PyHints
228👍51❤‍🔥7👏43👾3👌2