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

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

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

Admin: @Abbasi_ai
Download Telegram
اسم نمی‌برم
ولی طرف دوره گذاشته، آموزش رزومه نویسی و چگونگی پیدا کردن بهترین موقعیت شغلی.

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


قبل از اینکه پول و وقت صرف این دوره‌ها کنید، ی جستجو بزنید (خیلی خیلی مهمتر هست)
31👍18😁6🤪63🗿3🐳1
اینم چون دیدم خیلی از بچه‌ها نمی‌دونند :

اگر شما هم مثل من بیشتر کارها رو با
Firefox
انجام می‌دید و ممکنه توی چند هفته بیش از sleep کردن سیستم کاری نتونید بکنید قطعاً مشکل Ram رو دیدید (روی سیستم من بعضی وقتا که خیلی سنگین استفاده می‌کنم، به ۱۵ گیگ - ۲۰ گیگ هم میرسه)

مخصوصاً اینکه من
Hardware Acceleration
رو هم فعال کردم.


ی راهکار بگم بدون restart مصرف رم فایرفاکس رو کم کنید (بخصوص روی دیتاهای کش شده که دیگه نیازی بهش نداره) توی سرچ بار بزنید :

about:memory

و توی صفحه‌ای که باز میشه توی بخش
Free Memory

گزینه
GC (garbage collection)
و بعد از اون
Minimize memory usage
رو بزنید.

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

بطور کلی
Hardware Acceleration
رو اگر خاموش کنید مصرف رم قطعاً بهینه‌تر و کمتر خواهد بود.
👍3231
مقایسه داشته باشیم روی
Software Design Steps

داخل ایران و استاندارد‌هایی که شرکت‌ها یا استارتاپ‌های مطرح رعایت می‌کنند :
اول نسخه شرکت‌های مطرح :
1- Requirement Analysis
2- System Architecture Design (system design)
3- Detailed Design (Component design)
4- UI
5- Database design
6- Prototyping
7- Test Strategy
8- Regular design review / updates
* All above steps, must have documentation step in it.

مدل مطرح بین شرکت‌های ایرانی:
1- SRS (Software Requirements Specification)

که خب معمولا در حد ۱-۲ صفحه میاد بدون هیچ جلسه‌ای
2- Requirement Analysis
خوشحال نباشید این قدم تو ایران فقط برای سخت‌افزار و منابع مالی هست
3- UI/UX Design

یک راست میریم سراغ طراحی فرانت (معماری سیستم و ... اصلا معنی نداره تو اینجا؛ جزئیات که هیچ)
4- API Design
این قدم توی ایران هست به بکند میگن که چی میخوایم و چطوری باید پیاده بشه (برگای آدم میریزه)
بجای اینکه دیتابیس طراحی بشه و نیازمندی به بکند تسک بشه
به بکند میگن که دیتابیس رو خودت طراحی کن (برای همین هیچکدوم از شرکتهای مطرح ایرانی شناسنامه دیتابیس نداند) و نیازمندی رو هم خودمون بهت میگیم چطوری باید پیاده سازی بشه که همین دلیل ۹۰٪ عدم رعایت clean code هم هست
5- Deploy
تست نویسی اصلا مطرح نیست تو ایران تا زمانش بشه
پروتوتایپ هم همین هست (اگر مجبور نباشیم؛ نمی‌دیم)

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

اینو فقط بعنوان یک رفرنس میذارم (مطمئنم همه‌ی شما هم تقریبا باهام همنظر هستید و چیزایی که گفتم رو دیدید توی ایران) که به وقت مدیر فنی شدن سعی کنید برای نسل بعدی یک چیزی رو درست کنید.
👍455🤪3🗿311
https://t.iss.one/pyHints?boost

درصورت فعال شدن استوری
ازین قابلیت برای معرفی کتاب استفاده می‌کنیم
(هفتگی یا ماهانه)
👍74👎184
This media is not supported in your browser
VIEW IN TELEGRAM
سم خالص
😁72🤪11👾321👎1🦄1
The Music Played
Matt Monro
The Music Played
Artist: Matt Monro
Released: 1968
Genres: Pop

@pytensMusic
❤‍🔥9👎3👌2🍾21
من راجب repr, str , ... صحبت کردم.
این کد رو یکی از اعضا فرستاده (درحال code review این کد رو دیده)

@dataclass
class CasbinRuleEntity:
id: typing.Optional[int] = None
ptype: typing.Optional[str] = None
v0: typing.Optional[str] = None
v1: typing.Optional[str] = None
v2: typing.Optional[str] = None
v3: typing.Optional[str] = None
v4: typing.Optional[str] = None
v5: typing.Optional[str] = None

def __str__(self):
arr = [self.ptype]
for v in (self.v0, self.v1, self.v2, self.v3, self.v4, self.v5):
if v is None:
break
arr.append(v)
return ', '.join(arr)

def __repr__(self):
return '<CasbinRule {}: "{}">'.format(self.id, str(self))
ی مورد رو من بگم و بعد سکوت کنم :
یکی از دلایلی که
@dataclass
رو استفاده می‌کنیم این هست که دیگه repr بدرد نخور ننویسیم.

باقی مشکلات رو شما بگید (به اکثر موارد قبلاً اشاره شده توی کانال)
🤔14👍92🍓21👎1🔥1😱1🆒1
Python Hints
من راجب repr, str , ... صحبت کردم. این کد رو یکی از اعضا فرستاده (درحال code review این کد رو دیده) @dataclass class CasbinRuleEntity: id: typing.Optional[int] = None ptype: typing.Optional[str] = None v0: typing.Optional[str] = None v1:…
دوستان به موارد زیادی اشاره کردند اما گفتم یکبار هم خودم همه‌ی آن چیزی که توی کد ریویو انجام میدم رو بگم :

۱- وقتی کلاس یا تابع تعریف می‌کنید که خودش یا اجزا تشکیل دهنده‌اش مشخص نیست حتما باید داکیومنت یا کامنت داشته باشه
v0, v1, v2 , ...
بدترین اسامی هست که میشه انتخاب کرد؛ چون برنامه نویس داره فرض می‌کنه که همه‌ی افرادی که کد رو میخونند بیزینس رو بخوبی می‌شناسند.

۲- استفاده از typing optional در اینجا درست نیست مخصوصا که برای همه‌ی موارد تکرار شده و به همه‌ی موارد دیفالت None داده شده؛ حتی اگر همین کد رو بخوایم نگه داریم این راهکارها بهتر خواهد بود :

v0: str | None


v0: typing.Union[str, None]

۳- از dataclass هیچ استفاده‌ای نشده (frozen, ordering, slot , ....) حتی از ویژگی‌های حالت ساده‌ترش هم استفاده نشده؛ مثل پیاده سازی __methods__ که یعنی __repr__ و __str__ نیازی نبود نوشته بشه.

۴- حالا که نوشته شده
__repr__
در انتهای خروجی به str(self) رو داره و این یعنی برنامه نویس سواد نوشتن __repr__ درست رو نداشته و چون توی حلقه بی‌نهایت میوفته مجبور شده که __str__ رو هم پیاده‌سازی کنه

۵- داخل __repr__ همه چیز پر از ایراد هست (تمام موارد رو قبلا بررسی کردیم تو کانال) :
عدم استفاده از qualname , هاردکد کردن اسم کلاس
عدم استفاده از r! جهت نمایش درست تایپ‌های داخلی
فرمت اشتباه؛ خروجی __repr__ رو برای ساخت مجدد آبجکت از کلاس نمی‌شه استفاده کرد.

۶- خورد __str__ کلا سوال هست؛ نوشتاری که تمیز نیست؛ هدفش مشخص نیست و ....

من حتی به این حالت هم فکر کردم که چون تعداد متغییرها زیاد بوده برنامه‌نویس خواسته از یک جایی به بعد ... نشون بده مثل کاری که numpy , .... می‌کنند؛ که اگر هدف هم این بوده پیاده سازی اشتباهی انجام داده و با یک جستجوی ساده حتی می‌تونسته به راهکار درست برسه
reprlib builtin module

تقریبا ۲۰ خط کد بود و ۳۰ خط ایراد.
👍105❤‍🔥6🤷‍♂6👌52🔥1
Reaction

روی پست‌ها لطفاً فراموش نشه، کمک می‌کنه بدونم کدوم مطالب رو دیگه نیازی نیست راجبش توضیح بدم و ....
25👍1511👎2🤷‍♂1🫡1
لطفاً پیام‌های پین شده کانال رو بخونید 🌹


به لطف شما عزیزان, کانال قابلیت استوری گذاشتن داره
و سعی می‌کنم ازین قابلیت برای معرفی کتاب‌ها استفاده کنم
تا دوستان به راحتی بتونند کتاب‌ها رو پیدا کنند.

همونطور که قبلاً گفتم، فقط و فقط کتاب‌هایی رو معرفی می‌کنم که شخصاً خوندم و بنظرم مفید بوده.

اما، قابلیت استوری و ... بستگی به Boost کانال داره که محدودیت زمانی هم داره این ویژگی (تلگرامم باید پول دربیاره دیگه) اگر دوست داشتید می‌تونید کانال رو boost کنید تا این حرکت رو ادامه بدم.

https://t.iss.one/pyHints?boost


هر وقت قابلیت Story نداشته باشیم، معرفی کتاب روی توییتر انجام خواهد شد.
پیشنهاد می‌کنم اکانت کانال رو داشته باشید.

Twitter: https://twitter.com/pyhints
👍4810🍾6👎3
آقا من نمی‌دونم این به گوش بچه‌های طراح سایت اینترنت مخابرات میرسه یا نه
یا مثلاً مدیر فنی و ... (قبلاً این اتفاق افتاده چون)

ولی دوست دارم شما همگی بدونید؛
مودم من به یک مشکلی خورده بود و بنا به دلایلی رفتم پسورد اینترنت رو تغییر دادم، برای امنیت بیشتر کاراکتر ' رو داخل پسورد گذاشتم، اتفاقی که افتاد این بود

فرض کنید پسوردی که من زدم این بود :
Pyhints2023'24
سایت مخابرات چی توی دیتابیس برای مچ کردن گذاشته بنظرتون ؟! 🤣😂

اول اینکه hash، نشده و اصل پسورد رو برام فرستادند اما چی بنظرتون بود پسورد :
\&quot;pyhints2023\'24\&quot;

یعنی : پسورد رو نرمالایز کردن حروف بزرگ رو کردن کوچیک بعد ' رو escape کرده توی دیتابیس گذاشتن و چون ' توی پسورد داشتم از " اطرافش استفاده کردند و همون‌جوری توی دیتابیس گذاشتن

شما ببین سایتای ایرانی رو کیا کد میزنند. 😂🤣😂
😱35😁15😐13🤔4🤯3🗿3👍2👨‍💻1🆒1
یلدا مبارک

حافظ فراموش نشه ♥️
66❤‍🔥5👍3👎3💔1
خوانش گروهی کتاب
Fluent Python
به فصل ۱۳ رسید (عضو جدید نمی‌گیره گروه)

Interfaces, Protocol and ABCs
داشتم راجب همین موضوع پیش گروهی دیگر از دوستان صحبت می‌کردم که متوجه شدم خیلی از بچه‌ها با این مفاهیم آشنا هستند، اما کاربرد درستش رو نمی‌دونند حتی بچه‌هایی که پایتون رو تا سطح بالایی دنبال کردند.

برای همین تصمیم گرفتم توی پست‌های بعدی این مفاهیم رو با مثال توضیح بدم، منظورم از این مفاهیم :

Interface, Duck typing, Goose typing, Static typing, Static Duck typing, ABC, Protocol,Static Protocol, Monkey patching, polymorphic interface, Structural typing, ....

هست.

پ.ن : اگر مورد دیگری هست که فکر می‌کنید جا افتاده زیر همین پست کامنت کنید توضیح میدم حتماً 🌹
👍52🙏62💋2❤‍🔥1
Python Hints
خوانش گروهی کتاب Fluent Python به فصل ۱۳ رسید (عضو جدید نمی‌گیره گروه) Interfaces, Protocol and ABCs داشتم راجب همین موضوع پیش گروهی دیگر از دوستان صحبت می‌کردم که متوجه شدم خیلی از بچه‌ها با این مفاهیم آشنا هستند، اما کاربرد درستش رو نمی‌دونند حتی بچه‌هایی…
Duck typing, Dynamic Protocol

رو میشه با هم نشون داد؛ ی جمله معروف داره که همه بلد هستند اما خیلی ها مفهومش رو نمی‌دونند

Duck typing :If it looks like a duck and quacks like a duck, it’s a duck.

چیزی که این جمله سعی داره بگه اینه که؛
برای ما مهم نیست object کدوم کلاس هستی اگر این متدها و فانکشنالیتی ها رو داری عضوی از ما هستی.
ما برنامه نویس‌ها همیشه Duck type mode هستیم بصورت پیشفرض؛ برای ما فرقی نمی‌کنه طرف رشته کامپیوتر خونده یا حقوق و حسابداری و ... یا اصلا درس نخونده
برای ما مهم هست که طرف توانایی کد زدن داشته باشه و اگر بتونه این کار رو به خوبی انجام بده بهش لقب برنامه نویس میدیم.

پس توی Duck typing اولویت متدها هستند و نه خروجی isinstance
👍63❤‍🔥3🙏31👎1😁1💋1😈1👾1
Python Hints
Duck typing, Dynamic Protocol رو میشه با هم نشون داد؛ ی جمله معروف داره که همه بلد هستند اما خیلی ها مفهومش رو نمی‌دونند Duck typing :If it looks like a duck and quacks like a duck, it’s a duck. چیزی که این جمله سعی داره بگه اینه که؛ برای ما مهم نیست object…
Dynamic Protocol 


هم از همین مفهموم استفاده می‌کنه؛ اگر یادتون باشه قبلا راجب پروتوکل مربوط به Sequence صحبت کردیم و گفتیم که اگر یک class متدهای
__len__, __getitem__

رو داشته باشه می‌تونیم بعنوان Sequence Protocol رو رعایت می‌کنه و پایتون می‌تونه مثل Sequence باهاش رفتار کنه و برخی از فانکشنالیتی‌هایی که پیاده سازی هم نکردیم رو بهش بده.

Dynamic Protocol 

ی قدم جلوتر میره و میگه اگر قرار نیست len اون آبجکت رو بگیری پس نیازی نیست توی اون کلاس حتی __len__ رو پیاده سازی کنی و صرف وجود __getitem__ من بهت یک سری ویژگی‌های Sequence رو میدم؛ ویژگی‌هایی که فقط به __getitem__ نیاز داره و نه چیز دیگه.

توی مثال تصویر قبل؛ من هیچوقت __iter__ رو پیاده‌سازی نکردم اما می‌تونم روی dp از for loop استفاده کنم؛ به لطف
Duck typing, Dynamic Protocol
پایتون از __getitem__ استفاده می‌کنه و با شروع از اندیس 0 می‌تونه کار __iter__ رو انجام بده و for loop بهمون خروجی خواهد داد.
برای in هم موضوع همین هست؛ توی کد قبلی من هیچوقت __contain__ رو پیاده‌سازی نکردم اما
9 in dp
خروجی میده (اینبار هم پایتون از __getitem__ بعنوان fallback برای __contain__ استفاده می‌کنه)

بحثی که پیش میاد اینه که؛ آیا این موضوع اتفاق خوبی هست ؟
نه همیشه؛ خیلی وقت‌ها میشه نسخه optimize شده تری رو نوشت مثلاْ توی کد قبلی اگر من لیست رو بصورت sort قرار باشه داشته باشم همیشه می‌تونم بجای __contain__ که خود پایتون بهم میده و linear search هست که مرتبه زمانی O(n) داره از Binary Search استفاده کنم و مرتبه زمانی رو تا O(log n) کاهش بدم.
اما تا وقتی نیازی به بهبود ندارم؛ هیچوقت __contain__ یا ... رو خودم پیاده‌سازی نمی‌کنم و از آنچه که پایتون بهم ارائه میده استفاده می‌کنم (اینطوری نه نیاز به تست هست؛ نه باگ ازش در میاد و کد تمیزتری هم خواهم داشت)
👍48❤‍🔥52
Python Hints
خوانش گروهی کتاب Fluent Python به فصل ۱۳ رسید (عضو جدید نمی‌گیره گروه) Interfaces, Protocol and ABCs داشتم راجب همین موضوع پیش گروهی دیگر از دوستان صحبت می‌کردم که متوجه شدم خیلی از بچه‌ها با این مفاهیم آشنا هستند، اما کاربرد درستش رو نمی‌دونند حتی بچه‌هایی…
Goose Typing

رو بعنوان runtime type check بهش اشاره می‌کنند؛ دلیلش هم توی عکس واضح هست.

اما دقت کنید که من برای isinstance از
from collection.abc import Sequence


چرا این مورد وجود داره؛ برطرف کردن مشکلاتی که Duck typing بوجود میاره همونطور که دیدیم برای duck typing تکمیل بودن تمام متدها اهمیتی نداره.
همینجا یک نکته‌ای رو بگم؛ توی پایتون استفاده بیش از اندازه از isinstance , issubclass, hasattr اصلا چیز خوبی نیست و به قول معروف code smell هست (برای دلیلش می‌تونید راجب __subclasshook__ بخونید.)

با این همه؛ goose typing جایگاهی مطمئن‌تر از duck typing برای تست پیاده‌سازی کامل یک Interface بهمون میده و همیشه هم باید به یک ABC برسه (پیاده‌سازی درست و اصولی)
👍2652
Python Hints
Goose Typing رو بعنوان runtime type check بهش اشاره می‌کنند؛ دلیلش هم توی عکس واضح هست. اما دقت کنید که من برای isinstance از from collection.abc import Sequence چرا این مورد وجود داره؛ برطرف کردن مشکلاتی که Duck typing بوجود میاره همونطور که دیدیم برای…
اول با تصویر ۲ شروع کنیم (بالای کد 2 کامنت شده)
از دیگر مزایای Goose typing همین مورد هست وقتی برای اطمینان از Interface میاید و کلاس‌های فریمورکی که می‌نویسید رو به ABC ها وصل می‌کنید (منظورم Inheritance هست).
دقت کنید اگر من __len__ رو پیاده‌سازی نکنم بهم ارور میده؛ به عمد ارور رو گذاشتم که باهاش آشنا بشید.
برای رفع این مشکل پایتون و Goose Typing و البته ABC من رو مجبور می‌کنند که __len__ رو پیاده‌سازی کنم.
پس برای همین runtime type checking هم داریم توی پایتون اما مفهومش با زبان‌های دیگه کمی فرق داره که حالا همگی دلیلش رو می‌دونیم.
👍2443
قبل از اینکه بریم سراغ تصویر :
یک مفهومی داریم توی پایتون به اسم
Static Duck Typing
حدس زدید دیگه تا الان ترکیبی هست از
Static typing, duck typing
استفاده‌اش؛ اجازه میده Interface رو طوری تعریف کنیم که کلاس‌های مختلفی رو بشه بجاش استفاده کرد.
اما تصویر بالا؛ فرض کنید شما می‌خواید یک Interface بسازید و مهمتر از اون می‌خواید
runtime type checking 

رو هم داشته باشه اما Interface شما سختگیری ABC های موجود رو لازم نداره (می‌دونیم که تعریف abc هم کار درستی نیست توی ۹۹٪ موارد).

مثال بزنم شاید بهتر درک بشه :
collections.abc.MutableSequence
رو در نظر بگیرید؛ و فرض کنید Interface من که قرار هست runtime checking هم داشته باشه نیاز به ۳ تا متد داره :
__len__, __getitem__, __setitem__
میخوام مطمئن بشم هرکسی هر موردی رو بهم تحویل میده بعنوان Instance ایی از Interface باید حتما هر ۳ تا این متد‌ها رو پیاده‌سازی کرده باشه Hard Rule هست برای عملکرد درست کدهام برخلاف Duck typing که soft rule هست و دیدیم که می‌گه اگر نیازی به این متد نداری پس پیاده‌سازی نشدنش هم مشکلی نداره.

ادامه پست بعدی
👍20