Python Hints
Відкрити в Telegram
Python tips and tricks The Good, Bad and the Ugly توی این کانال فقط قرار هست در مورد core python صحبت کنیم. این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازهکار) Admin: @Abbasi_ai
Показати більше9 613
Підписники
-524 години
+587 днів
+21130 день
Архів дописів
9 613
#جواب_سوالات_پرتکرار
چندتا نکته همین اوایل بگم که بسیار سوال شده :
۱- دوره آموزشی:
شخصاً هیچ دوره آموزشی ندارم، هیچ آموزشگاهی تدریس نمیکنم و هدفم از کانال هم پول درآوردن نبوده پس کلاس خصوصی هم ندارم
۲- من هیچ دوره آموزشی رو تأیید نمیکنم دورههای آنلاین و رایگان بسیار بسیار خوبی وجود داره برای پایتون که همون موارد کفایت میکنه (فقط باید یاد بگیرید هر خط کدی که میزنید و میخونید دقیقاً چیکار میکنه که این یک عادت شخصی هست)
۳- خیلی از دوستان راجب فعال کردن کامنت یا ایجاد گروه گفتند، شخصاً موافقم که وجودش کمک کننده هست ولی همونطور که تو خصوصیها گفتم :
گروه زدن یا فعال سازی کامنت مسئولیتهای بسیاری داره که متأسفانه الان شخصاً فرصت رسیدگی بهش رو ندارم.
۴- راجب درخواست roadmap , ... کانالهای تخصصی کاری که میخواهید انجام بدید رو بخونید.شخصا فقط و فقط اینجا از Core Python صحبت خواهم کرد.
۵- کانال یوتیوب هم ندارم، با اوضاع اینترنت در ایران خیلی از عزیزان (بخصوص تازهکار) متاسفانه دسترسی به اینترنت براشون دشوار هست.
ازین گذشته، علاقه ندارم برای چندتا نکته کوچک (البته مهم) چندین دقیقه وقت بگیرم و حاشیه سلام علیکم برم فعلا :
پیام متنی و عکس داره کارمون رو راه میندازه و چون محدودیت هم داره مجبورم خیلی خلاصه توضیح بدم
۶- برای دوستانی که گفتند دنبال مطالب این چنینی هستند که توی دورههای آموزشی پیدا نمیشه، اول اینکه هیچوقت توقع نداشته باشید که دوره آموزشی جایگزین کتاب بشه برای شما
منو یاد آدمایی میندازه که بهشون میگم آخرین کتابی که خوندی چی بوده میگه من کتاب نمیخونم یوتیوب و اینستاگرام اشعار ٫ جملات مهم و زیبا رو میبینم.
کتابهایی که هر توسعه دهنده پایتون حتماً حتماً حتماً بعد از دوره مقدماتی و چندماه تمرین باید بخونه (که هزاران بار هم بهش اشاره کردم) :
Fluent Python
Python Concurrency
High Performance Python
Cpython Internals
این موارد حداقل مواردی هست که یک توسعه دهنده برای دنبال کردن مسیر Senior شدن توی پایتون باید بخونه
۷- تبلیغات و ... نداریم و نخواهیم داشت (از حوصله همه خارج هست)
۸- لطفاً روی پستها
Reaction
داشته باشید که بدونم وضعیت چطور هست (حداقل تا راهاندازی گروه یا بخش کامنت)
@PyHints
9 613
توی پایتون ماژولی هست به اسم
collections
کاربردهای بسیاری داره که درآینده ممکنه بررسی کنیم اما چیزی که ما الان نیاز داریم
from collections import UserDict
همیشه یادتون باشه وقتی قراره یک کلاس کاستوم برای نوع داده dict بنویسید؛ حق استفاده از
dict
رو ندارید باید از
UserDict
استفاده کنید.
@PyHints9 613
این یک باگ کاملا شناخته شده و کاملا تکراری هست؛ ممکنه توی مصاحبههای مختلف هم تجربهاش کرده باشید یا دیده باشید.
یک نمونه مصاحبه Amazon بوده برای پایتون (طرف از یک زبان برنامه نویسی دیگه اومده بود سمت پایتون و دنبال کار بود)
اول برای دوستان تازه کار:
__setitem__
وقتی اجرا میشه که میخواهید یک key - value رو داخل dictionary بریزید
و
__getitem__
وقتی اجرا میشه که میخواهید یک مقدار رو از دیکشری بخونید.
البته اینجا نه بخاطر باگی که وجود داره
اگر بخوام خیلی ساده توضیح بدم :
مسئله اصلی اینجاس که نسخه پایتونی که بصورت دیفالت از سایت پایتون دانلود میشه روی C کد زده شده و مواردی مثل str, dict, list از کدهای C برای اجرا استفاده میکنند.
به همین دلیل وقتی از dict ارث بری بکنید احترامی برای متدهای builtin قائل نمیشه (چون توی C پیاده سازی شده و کد پایتون شما قابلیت overwrite شدن روی کد C رو نداره) پس درنهایت چیزی رو میگیرید که توی C و برای خود پایتون دیکشنری پیاده سازی شده
راه حل :
@PyHints9 613
ولی باگ دوم که من حتی توی سورس کد فریمورکها و کتابخانههای معروف پایتون هم زیاد دیدم به راحتی میتونه توی مصاحبههای اولیه اوضاع رو بر علیه شما بکنه
مشکل باز هم توی این خط هست :
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.me/pyHints/7 @PyHints
9 613
اول راجب خود
__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__ شما طبق استاندارد نبوده.
@PyHints9 613
این کد که احتمالاً بسیار هم میبینید و استفاده میکنید
۲ تا باگ داره، که ۱ مورد میتونه حتی شمارو توی مصاحبه رد کنه
میتونید باگهارو پیدا کنید ؟
@PyHints
9 613
یک نمونه exploit خیلی ساده برای تست؛ سورس کد رو گذاشتم که خودتون اجرا کنید و مطمئن باشید امن هست.
اما بجای
ls میشد هرکار دیگری هم کرد یا خوندن passwd میشد خیلی کارهای دیگهای کرد.
هیچوقت هیچ فایل Pickle ایی رو از کسی قبول نکنید اگر قبول کردید روی سیستم اجرا نکنید.
@PyHints9 613
وقتی صحبت از ارسال و دریافت دیتا میشود یکی از مواردی از همون ابتدا به ذهن میرسه انتخاب
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
@PyHints9 613
من محمد عباسی (@abbasi_ai)
یک توسعه دهنده پایتون هستم با بیش از ۸ سال تجربه کار با پایتون (باقی موارد برای این کانال اهمیتی نداره)
سعی میکنم نکاتی که فکر میکنم مهم هست تغییراتی که توی نسخههای اخیر (از پایتون ۳.۴ به بعد وارد شده و اهمیت بالایی داره و ... رو صحبت کنم)
بیشتر هدف از این کانال، برای خودم به نوعی آرشیوی از موارد و ویژگیهای مهم پایتون هست که راجبش میشه صحبت کرد
ازین به بعد قرار هست اینجا در مورد core python صحبت کنم تا اینطوری بتونم به دوستانم هم کمک کنم و نیازی هم به تکرارهای مجدد نباشه.
هیچکدوم از موارد رو از خودم نمیگم (مگر با #نظر_شخصی علامت گذاری بشه) منابع همه صحبتها داکیومنت اصلی پایتون و کتابهای معروف پایتونی هست.
LinkedIn Profile
@pyHints
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
